replace debug() with our custom logger
mostly we want trace() and log(). trace() can be enabled whenever we want by flipping a flag and restarting box
This commit is contained in:
24
src/locks.js
24
src/locks.js
@@ -1,10 +1,10 @@
|
||||
import assert from 'node:assert';
|
||||
import BoxError from './boxerror.js';
|
||||
import database from './database.js';
|
||||
import debugModule from 'debug';
|
||||
import logger from './logger.js';
|
||||
import promiseRetry from './promise-retry.js';
|
||||
|
||||
const debug = debugModule('box:locks');
|
||||
const { log, trace } = logger('locks');
|
||||
|
||||
const TYPE_APP_TASK_PREFIX = 'app_task_';
|
||||
const TYPE_APP_BACKUP_PREFIX = 'app_backup_';
|
||||
@@ -31,7 +31,7 @@ async function write(value) {
|
||||
|
||||
const result = await database.query('UPDATE locks SET dataJson=?, version=version+1 WHERE id=? AND version=?', [ JSON.stringify(value.data), 'platform', value.version ]);
|
||||
if (result.affectedRows !== 1) throw new BoxError(BoxError.CONFLICT, 'Someone updated before we did');
|
||||
debug(`write: current locks: ${JSON.stringify(value.data)}`);
|
||||
log(`write: current locks: ${JSON.stringify(value.data)}`);
|
||||
}
|
||||
|
||||
function canAcquire(data, type) {
|
||||
@@ -59,58 +59,58 @@ function canAcquire(data, type) {
|
||||
async function acquire(type) {
|
||||
assert.strictEqual(typeof type, 'string');
|
||||
|
||||
await promiseRetry({ times: Number.MAX_SAFE_INTEGER, interval: 100, debug, retry: (error) => error.reason === BoxError.CONFLICT }, async () => {
|
||||
await promiseRetry({ times: Number.MAX_SAFE_INTEGER, interval: 100, debug: log, retry: (error) => error.reason === BoxError.CONFLICT }, async () => {
|
||||
const { version, data } = await read();
|
||||
const error = canAcquire(data, type);
|
||||
if (error) throw error;
|
||||
data[type] = gTaskId;
|
||||
await write({ version, data });
|
||||
debug(`acquire: ${type}`);
|
||||
log(`acquire: ${type}`);
|
||||
});
|
||||
}
|
||||
|
||||
async function wait(type) {
|
||||
assert.strictEqual(typeof type, 'string');
|
||||
|
||||
await promiseRetry({ times: Number.MAX_SAFE_INTEGER, interval: 10000, debug }, async () => await acquire(type));
|
||||
await promiseRetry({ times: Number.MAX_SAFE_INTEGER, interval: 10000, debug: log }, async () => await acquire(type));
|
||||
}
|
||||
|
||||
async function release(type) {
|
||||
assert.strictEqual(typeof type, 'string');
|
||||
|
||||
await promiseRetry({ times: Number.MAX_SAFE_INTEGER, interval: 100, debug, retry: (error) => error.reason === BoxError.CONFLICT }, async () => {
|
||||
await promiseRetry({ times: Number.MAX_SAFE_INTEGER, interval: 100, debug: log, retry: (error) => error.reason === BoxError.CONFLICT }, async () => {
|
||||
const { version, data } = await read();
|
||||
if (!(type in data)) throw new BoxError(BoxError.BAD_STATE, `Lock ${type} was never acquired`);
|
||||
if (data[type] !== gTaskId) throw new BoxError(BoxError.BAD_STATE, `Task ${gTaskId} attempted to release lock ${type} acquired by ${data[type]}`);
|
||||
delete data[type];
|
||||
await write({ version, data });
|
||||
debug(`release: ${type}`);
|
||||
log(`release: ${type}`);
|
||||
});
|
||||
}
|
||||
|
||||
async function releaseAll() {
|
||||
await database.query('DELETE FROM locks');
|
||||
await database.query('INSERT INTO locks (id, dataJson) VALUES (?, ?)', [ 'platform', JSON.stringify({}) ]);
|
||||
debug('releaseAll: all locks released');
|
||||
log('releaseAll: all locks released');
|
||||
}
|
||||
|
||||
// identify programming errors in tasks that forgot to clean up locks
|
||||
async function releaseByTaskId(taskId) {
|
||||
assert.strictEqual(typeof taskId, 'string');
|
||||
|
||||
await promiseRetry({ times: Number.MAX_SAFE_INTEGER, interval: 100, debug, retry: (error) => error.reason === BoxError.CONFLICT }, async () => {
|
||||
await promiseRetry({ times: Number.MAX_SAFE_INTEGER, interval: 100, debug: log, retry: (error) => error.reason === BoxError.CONFLICT }, async () => {
|
||||
const { version, data } = await read();
|
||||
|
||||
for (const type of Object.keys(data)) {
|
||||
if (data[type] === taskId) {
|
||||
debug(`releaseByTaskId: task ${taskId} forgot to unlock ${type}`);
|
||||
log(`releaseByTaskId: task ${taskId} forgot to unlock ${type}`);
|
||||
delete data[type];
|
||||
}
|
||||
}
|
||||
|
||||
await write({ version, data });
|
||||
|
||||
debug(`releaseByTaskId: ${taskId}`);
|
||||
log(`releaseByTaskId: ${taskId}`);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user