Apply user timeout to ogr2ogr command
This commit is contained in:
parent
f995b476c8
commit
01a71ee60e
@ -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 ) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user