Apply user timeout to ogr2ogr command

This commit is contained in:
Daniel García Aubert 2017-08-09 12:50:16 +02:00
parent f995b476c8
commit 01a71ee60e
3 changed files with 47 additions and 6 deletions

View File

@ -50,6 +50,7 @@ QueryController.prototype.handleQuery = function (req, res) {
var skipfields; var skipfields;
var dp = params.dp; // decimal point digits (defaults to 6) var dp = params.dp; // decimal point digits (defaults to 6)
var gn = "the_geom"; // TODO: read from configuration file var gn = "the_geom"; // TODO: read from configuration file
var userLimits;
if ( req.profiler ) { if ( req.profiler ) {
req.profiler.start('sqlapi.query'); req.profiler.start('sqlapi.query');
@ -122,12 +123,13 @@ QueryController.prototype.handleQuery = function (req, res) {
function getUserDBInfo() { function getUserDBInfo() {
self.userDatabaseService.getConnectionParams(new AuthApi(req, params), cdbUsername, this); self.userDatabaseService.getConnectionParams(new AuthApi(req, params), cdbUsername, this);
}, },
function queryExplain(err, dbParams, authDbParams) { function queryExplain(err, dbParams, authDbParams, userTimeoutLimits) {
assert.ifError(err); assert.ifError(err);
var next = this; var next = this;
dbopts = dbParams; dbopts = dbParams;
userLimits = userTimeoutLimits;
if ( req.profiler ) { if ( req.profiler ) {
req.profiler.done('setDBAuth'); req.profiler.done('setDBAuth');
@ -217,7 +219,8 @@ QueryController.prototype.handleQuery = function (req, res) {
filename: filename, filename: filename,
bufferedRows: global.settings.bufferedRows, bufferedRows: global.settings.bufferedRows,
callback: params.callback, callback: params.callback,
abortChecker: checkAborted abortChecker: checkAborted,
timeout: userLimits.timeout
}; };
if ( req.profiler ) { if ( req.profiler ) {

View File

@ -65,6 +65,8 @@ OgrFormat.prototype.toOGR = function(options, out_format, out_filename, callback
var dbpass = dbopts.pass; var dbpass = dbopts.pass;
var dbname = dbopts.dbname; var dbname = dbopts.dbname;
var timeout = options.timeout;
var that = this; var that = this;
var columns = []; var columns = [];
@ -167,9 +169,20 @@ OgrFormat.prototype.toOGR = function(options, out_format, out_filename, callback
ogrargs.push('-nln', out_layername); ogrargs.push('-nln', out_layername);
// TODO: research if exec
var child = spawn(ogr2ogr, ogrargs); var child = spawn(ogr2ogr, ogrargs);
var timeouted = false;
var ogrTimeout;
if (timeout > 0) {
ogrTimeout = setTimeout(function () {
timeouted = true;
child.kill();
}, timeout);
}
child.on('error', function (err) { child.on('error', function (err) {
clearTimeout(ogrTimeout);
next(err); next(err);
}); });
@ -180,6 +193,12 @@ OgrFormat.prototype.toOGR = function(options, out_format, out_filename, callback
}); });
child.on('exit', function(code) { child.on('exit', function(code) {
clearTimeout(ogrTimeout);
if (timeouted) {
return next(new Error('You are over platform\'s limits. Please contact us to know more details'));
}
if (code !== 0) { if (code !== 0) {
var errMessage = 'ogr2ogr command return code ' + code; var errMessage = 'ogr2ogr command return code ' + code;
if (stderrData.length > 0) { if (stderrData.length > 0) {

View File

@ -54,7 +54,26 @@ UserDatabaseService.prototype.getConnectionParams = function (authApi, cdbUserna
apiKey: dbParams.apikey apiKey: dbParams.apikey
}, next); }, next);
}, },
function setDBAuth(err, isAuthenticated) { function getUserLimits (err, isAuthenticated) {
var next = this;
if (err) {
return next(err);
}
self.metadataBackend.getUserTimeoutRenderLimits(cdbUsername, function (err, timeoutRenderLimit) {
if (err) {
return next(err);
}
var userLimits = {
timeout: isAuthenticated ? timeoutRenderLimit.render : timeoutRenderLimit.renderPublic
};
next(null, isAuthenticated, userLimits);
});
},
function setDBAuth(err, isAuthenticated, userLimits) {
if (err) { if (err) {
throw err; throw err;
} }
@ -76,14 +95,14 @@ UserDatabaseService.prototype.getConnectionParams = function (authApi, cdbUserna
var authDbOpts = _.defaults({user: user, pass: pass}, dbopts); var authDbOpts = _.defaults({user: user, pass: pass}, dbopts);
return this(null, dbopts, authDbOpts); return this(null, dbopts, authDbOpts, userLimits);
}, },
function errorHandle(err, dbopts, authDbOpts) { function errorHandle(err, dbopts, authDbOpts, userLimits) {
if (err) { if (err) {
return callback(err); return callback(err);
} }
callback(null, dbopts, authDbOpts); callback(null, dbopts, authDbOpts, userLimits);
} }
); );