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

View File

@ -65,6 +65,8 @@ OgrFormat.prototype.toOGR = function(options, out_format, out_filename, callback
var dbpass = dbopts.pass;
var dbname = dbopts.dbname;
var timeout = options.timeout;
var that = this;
var columns = [];
@ -167,9 +169,20 @@ OgrFormat.prototype.toOGR = function(options, out_format, out_filename, callback
ogrargs.push('-nln', out_layername);
// TODO: research if exec
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) {
clearTimeout(ogrTimeout);
next(err);
});
@ -180,6 +193,12 @@ OgrFormat.prototype.toOGR = function(options, out_format, out_filename, callback
});
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) {
var errMessage = 'ogr2ogr command return code ' + code;
if (stderrData.length > 0) {

View File

@ -54,7 +54,26 @@ UserDatabaseService.prototype.getConnectionParams = function (authApi, cdbUserna
apiKey: dbParams.apikey
}, 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) {
throw err;
}
@ -76,14 +95,14 @@ UserDatabaseService.prototype.getConnectionParams = function (authApi, cdbUserna
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) {
return callback(err);
}
callback(null, dbopts, authDbOpts);
callback(null, dbopts, authDbOpts, userLimits);
}
);