UNPKG

redis-smq

Version:

A high-performance, reliable, and scalable message queue for Node.js.

52 lines 2.92 kB
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