From a9c1af50f7f2e25380b40b0ab0c3e8e9260d5523 Mon Sep 17 00:00:00 2001 From: Girish Ramakrishnan Date: Wed, 26 Sep 2018 12:44:38 -0700 Subject: [PATCH] start most cron jobs only after activation Importing the db might take some time. If a cron runs in the middle, it crashes. TypeError: Cannot read property 'domain' of undefined at Object.fqdn (/home/yellowtent/box/src/domains.js:126:111) at /home/yellowtent/box/src/apps.js:460:36 at /home/yellowtent/box/node_modules/async/dist/async.js:3110:16 at replenish (/home/yellowtent/box/node_modules/async/dist/async.js:1011:17) at /home/yellowtent/box/node_modules/async/dist/async.js:1016:9 at eachLimit$1 (/home/yellowtent/box/node_modules/async/dist/async.js:3196:24) at Object. (/home/yellowtent/box/node_modules/async/dist/async.js:1046:16) at /home/yellowtent/box/src/apps.js:458:19 at /home/yellowtent/box/src/appdb.js:232:13 at Query.args.(anonymous function) [as _callback] (/home/yellowtent/box/src/database.js --- src/cloudron.js | 9 ++++++--- src/cron.js | 18 ++++++++++++------ 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/cloudron.js b/src/cloudron.js index 3b26277f2..cdd4f51e5 100644 --- a/src/cloudron.js +++ b/src/cloudron.js @@ -74,7 +74,7 @@ function initialize(callback) { async.series([ settings.initialize, reverseProxy.configureDefaultServer, - cron.initialize, // required for caas heartbeat before activation + cron.startPreActivationJobs, onActivated ], callback); } @@ -83,7 +83,7 @@ function uninitialize(callback) { assert.strictEqual(typeof callback, 'function'); async.series([ - cron.uninitialize, + cron.stopJobs, platform.stop, settings.uninitialize ], callback); @@ -99,7 +99,10 @@ function onActivated(callback) { if (error) return callback(new CloudronError(CloudronError.INTERNAL_ERROR, error)); if (!count) return callback(); // not activated - platform.start(callback); + async.series([ + platform.start, + cron.startPostActivationJobs + ], callback); }); } diff --git a/src/cron.js b/src/cron.js index ee0865ec0..e9fff2ccc 100644 --- a/src/cron.js +++ b/src/cron.js @@ -1,8 +1,10 @@ 'use strict'; exports = module.exports = { - initialize: initialize, - uninitialize: uninitialize + startPostActivationJobs: startPostActivationJobs, + startPreActivationJobs: startPreActivationJobs, + + stopJobs: stopJobs }; var apps = require('./apps.js'), @@ -55,9 +57,7 @@ var AUDIT_SOURCE = { userId: null, username: 'cron' }; // Months: 0-11 // Day of Week: 0-6 -function initialize(callback) { - assert.strictEqual(typeof callback, 'function'); - +function startPreActivationJobs(callback) { if (config.provider() === 'caas') { // hack: send the first heartbeat only after we are running for 60 seconds // required as we end up sending a heartbeat and then cloudron-setup reboots the server @@ -71,6 +71,12 @@ function initialize(callback) { }); } + callback(); +} + +function startPostActivationJobs(callback) { + assert.strictEqual(typeof callback, 'function'); + var randomHourMinute = Math.floor(60*Math.random()); gJobs.alive = new CronJob({ cronTime: '00 ' + randomHourMinute + ' * * * *', // every hour on a random minute @@ -263,7 +269,7 @@ function dynamicDnsChanged(enabled) { } } -function uninitialize(callback) { +function stopJobs(callback) { assert.strictEqual(typeof callback, 'function'); settings.events.removeListener(settings.TIME_ZONE_KEY, recreateJobs);