diff --git a/src/apps.js b/src/apps.js index 070fa5575..9afd939a9 100644 --- a/src/apps.js +++ b/src/apps.js @@ -164,6 +164,7 @@ const appTaskManager = require('./apptaskmanager.js'), eventlog = require('./eventlog.js'), fs = require('fs'), Location = require('./location.js'), + locks = require('./locks.js'), logs = require('./logs.js'), mail = require('./mail.js'), manifestFormat = require('@cloudron/manifest-format'), @@ -2789,6 +2790,9 @@ async function backup(app, auditSource) { }) .catch(async (error) => { await eventlog.add(eventlog.ACTION_APP_BACKUP_FINISH, auditSource, { app, success: false, errorMessage: error.message }); + }) + .finally(async () => { + await locks.releaseByTaskId(taskId); }); await eventlog.add(eventlog.ACTION_APP_BACKUP, auditSource, { app, appId: app.id, taskId }); diff --git a/src/apptaskmanager.js b/src/apptaskmanager.js index 17c976ffb..195256a1a 100644 --- a/src/apptaskmanager.js +++ b/src/apptaskmanager.js @@ -57,6 +57,7 @@ async function drain() { .finally(async () => { delete gActiveTasks[appId]; await locks.release(`${locks.TYPE_APP_TASK_PREFIX}${appId}`); + await locks.releaseByTaskId(taskId); scheduler.resumeAppJobs(appId); }); } diff --git a/src/locks.js b/src/locks.js index cc7792084..862691c80 100644 --- a/src/locks.js +++ b/src/locks.js @@ -105,6 +105,7 @@ async function releaseAll() { debug('releaseAll: all locks released'); } +// identify programming errors in tasks that forgot to clean up locks async function releaseByTaskId(taskId) { assert.strictEqual(typeof taskId, 'string');