redis-smq
Version:
A high-performance, reliable, and scalable message queue for Node.js.
52 lines • 2.92 kB
JavaScript
import { QueueWorkerAbstract } from '../queue-worker-abstract.js';
import { async } from 'redis-smq-common';
import { _getQueueState } from '../../../../queue-state-manager/_/_get-queue-state.js';
import { withSharedPoolConnection } from '../../../../common/redis/redis-connection-pool/with-shared-pool-connection.js';
import { EQueueStateLockOwner, ESystemStateTransitionReason, } from '../../../../queue-state-manager/index.js';
import { EQueueOperationalState } from '../../../../queue-manager/index.js';
import { PurgeQueueJobManager } from '../../../../common/background-jobs/jobs/purge-queue/purge-queue-job-manager.js';
import { _unlockQueue } from '../../../../queue-state-manager/_/_unlock-queue.js';
export class RecoverOrphanedQueueLockWorker extends QueueWorkerAbstract {
work(cb) {
withSharedPoolConnection((client, cb) => {
const queue = this.queueParsedParams.queueParams;
async.waterfall([
(next) => _getQueueState(client, this.queueParsedParams.queueParams, next),
(state, next) => {
if (state.to !== EQueueOperationalState.LOCKED)
return next();
if (state.lockOwner === EQueueStateLockOwner.PURGE_JOB) {
const purgeQueueJobManager = new PurgeQueueJobManager(client, this.logger);
const jobId = String(state.lockId);
purgeQueueJobManager.hasTerminationStatus(jobId, (err, r) => {
if (err)
return next(err);
if (r) {
this.logger.debug(`Recovering queue ${queue.name}@${queue.ns} from orphaned locked state...`);
_unlockQueue(queue, EQueueStateLockOwner.PURGE_JOB, jobId, {
reason: ESystemStateTransitionReason.RECOVERY,
}, this.logger, (err) => {
if (err) {
this.logger.error(`Failed to unlock queue: ${err.message}`);
}
else {
this.logger.info(`Successfully recovered queue ${queue.name}@${queue.ns} from orphaned locked state.`);
}
next(err);
});
}
else {
next();
}
});
}
else {
next();
}
},
], cb);
}, cb);
}
}
export default RecoverOrphanedQueueLockWorker;
//# sourceMappingURL=recover-orphaned-queue-lock.worker.js.map