diff --git a/src/apptaskmanager.js b/src/apptaskmanager.js index d72fb54ce..bfbe3c5a1 100644 --- a/src/apptaskmanager.js +++ b/src/apptaskmanager.js @@ -1,7 +1,7 @@ 'use strict'; exports = module.exports = { - scheduleTask: scheduleTask + scheduleTask }; let assert = require('assert'), @@ -12,6 +12,7 @@ let assert = require('assert'), safe = require('safetydance'), path = require('path'), paths = require('./paths.js'), + scheduler = require('./scheduler.js'), sftp = require('./sftp.js'), tasks = require('./tasks.js'); @@ -69,6 +70,8 @@ function scheduleTask(appId, taskId, callback) { if (!fs.existsSync(path.dirname(logFile))) safe.fs.mkdirSync(path.dirname(logFile)); // ensure directory + scheduler.suspendJobs(appId); + // TODO: set memory limit for app backup task tasks.startTask(taskId, { logFile, timeout: 20 * 60 * 60 * 1000 /* 20 hours */, nice: 15 }, function (error, result) { callback(error, result); @@ -77,9 +80,8 @@ function scheduleTask(appId, taskId, callback) { locker.unlock(locker.OP_APPTASK); // unlock event will trigger next task // post app task hooks - sftp.rebuild(function (error) { - if (error) debug('Unable to rebuild sftp:', error); - }); + sftp.rebuild(error => { if (error) debug('Unable to rebuild sftp:', error); }); + scheduler.resumeJobs(appId); }); } diff --git a/src/scheduler.js b/src/scheduler.js index a952d87de..080bf15ce 100644 --- a/src/scheduler.js +++ b/src/scheduler.js @@ -1,7 +1,9 @@ 'use strict'; exports = module.exports = { - sync: sync + sync, + suspendJobs, + resumeJobs }; let apps = require('./apps.js'), @@ -15,8 +17,18 @@ let apps = require('./apps.js'), _ = require('underscore'); // appId -> { containerId, schedulerConfig (manifest), cronjobs } -var gState = { }; +let gState = { }; +let gSuspendedAppIds = new Set(); // suspended because some apptask is running +function suspendJobs(appId) { + debug(`suspendJobs: ${appId}`); + gSuspendedAppIds.add(appId); +} + +function resumeJobs(appId) { + debug(`resumeJobs: ${appId}`); + gSuspendedAppIds.delete(appId); +} function runTask(appId, taskName, callback) { assert.strictEqual(typeof appId, 'string'); @@ -26,6 +38,8 @@ function runTask(appId, taskName, callback) { const JOB_MAX_TIME = 30 * 60 * 1000; // 30 minutes const containerName = `${appId}-${taskName}`; + if (gSuspendedAppIds.has(appId)) return callback(); + apps.get(appId, function (error, app) { if (error) return callback(error);