diff --git a/src/locks.js b/src/locks.js index 2f1287fc8..852dd2252 100644 --- a/src/locks.js +++ b/src/locks.js @@ -13,7 +13,9 @@ exports = module.exports = { TYPE_APP_PREFIX: 'app_', TYPE_UPDATE: 'update', TYPE_UPDATE_TASK: 'update_task', - TYPE_BACKUP_TASK: 'backup_task' + TYPE_BACKUP_TASK: 'backup_task', + + TYPE_MAIL_SERVER_RESTART: 'mail_restart', }; const assert = require('assert'), diff --git a/src/mailserver.js b/src/mailserver.js index 8e8769f0f..6f5aded93 100644 --- a/src/mailserver.js +++ b/src/mailserver.js @@ -35,6 +35,7 @@ const assert = require('assert'), hat = require('./hat.js'), infra = require('./infra_version.js'), Location = require('./location.js'), + locks = require('./locks.js'), mail = require('./mail.js'), os = require('os'), path = require('path'), @@ -132,6 +133,7 @@ async function createMailConfig(mailFqdn) { return mailInDomains.length !== 0 /* allowInbound */; } +// note: this needs a lock because of container deletion/creation being non-reentrant async function configureMail(mailFqdn, mailDomain, serviceConfig) { assert.strictEqual(typeof mailFqdn, 'string'); assert.strictEqual(typeof mailDomain, 'string'); @@ -205,7 +207,10 @@ async function restart() { debug(`restart: restarting mail container with mailFqdn:${fqdn} mailDomain:${domain}`); // NOTE: the email container has to be re-created. this is because some of the settings like solr config rely on starting with a clean /run state - await configureMail(fqdn, domain, mailConfig); + await locks.wait(locks.TYPE_MAIL_SERVER_RESTART); + const [error] = await safe(configureMail(fqdn, domain, mailConfig)); + await locks.release(locks.TYPE_MAIL_SERVER_RESTART); + if (error) throw error; } async function start(existingInfra) {