diff --git a/src/addons.js b/src/addons.js index 9862ca767..810a53b9b 100644 --- a/src/addons.js +++ b/src/addons.js @@ -43,7 +43,6 @@ var accesscontrol = require('./accesscontrol.js'), rimraf = require('rimraf'), safe = require('safetydance'), semver = require('semver'), - settings = require('./settings.js'), shell = require('./shell.js'), request = require('request'), util = require('util'); @@ -355,6 +354,8 @@ function updateAddonConfig(platformConfig, callback) { mail: Math.max((1 + Math.round(os.totalmem()/(1024*1024*1024)/4)) * 128, 256) * 1024 * 1024 }; + debug('updateAddonConfig: %j', platformConfig); + // TODO: this should possibly also rollback memory to default async.eachSeries([ 'mysql', 'postgresql', 'mail', 'mongodb' ], function iterator(containerName, iteratorCallback) { const containerConfig = platformConfig[containerName]; @@ -399,16 +400,7 @@ function startAddons(existingInfra, callback) { debug('startAddons: existing infra. incremental addon create %j', startFuncs.map(function (f) { return f.name; })); } - async.series(startFuncs, function (error) { - if (error) return callback(error); - - // once addons are started/imported, scale them back - settings.getPlatformConfig(function (error, platformConfig) { - if (error) return callback(error); - - updateAddonConfig(platformConfig, callback); - }); - }); + async.series(startFuncs, callback); } function getEnvironment(app, callback) { diff --git a/src/platform.js b/src/platform.js index 9d6962bd7..bbbc79bef 100644 --- a/src/platform.js +++ b/src/platform.js @@ -25,6 +25,7 @@ var addons = require('./addons.js'), paths = require('./paths.js'), reverseProxy = require('./reverseproxy.js'), safe = require('safetydance'), + settings = require('./settings.js'), shell = require('./shell.js'), taskmanager = require('./taskmanager.js'), _ = require('underscore'); @@ -82,9 +83,27 @@ function stop(callback) { } function onPlatformReady() { - debug('onPlatformReady: resuming task manager'); + debug('onPlatformReady: platform is ready'); exports._isReady = true; taskmanager.resumeTasks(); + applyPlatformConfig(NOOP_CALLBACK); +} + +function applyPlatformConfig(callback) { + // scale back db containers, if possible. this is retried because updating memory constraints can fail + // with failed to write to memory.memsw.limit_in_bytes: write /sys/fs/cgroup/memory/docker/xx/memory.memsw.limit_in_bytes: device or resource busy + + async.retry({ times: 10, interval: 5 * 60 * 1000 }, function (retryCallback) { + settings.getPlatformConfig(function (error, platformConfig) { + if (error) return retryCallback(error); + + addons.updateAddonConfig(platformConfig, function (error) { + if (error) debug('Error updating addons. Will rety in 5 minutes', platformConfig, error); + + retryCallback(error); + }); + }); + }, callback); } function pruneInfraImages(callback) { diff --git a/src/shell.js b/src/shell.js index 4ead89757..b2fdfedcc 100644 --- a/src/shell.js +++ b/src/shell.js @@ -38,7 +38,7 @@ function exec(tag, file, args, options, callback) { callback = once(callback); // exit may or may not be called after an 'error' - debug(tag + ' execFile: %s', file); // do not dump args as it might have sensitive info + debug(tag + ' execFile: %s %s', file, args.join(' ')); var cp = child_process.spawn(file, args, options); if (options.logStream) {