redis-smq
Version:
A high-performance, reliable, and scalable message queue for Node.js.
56 lines • 3.33 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.RecoverOrphanedQueueLockWorker = void 0;
const queue_worker_abstract_js_1 = require("../queue-worker-abstract.js");
const redis_smq_common_1 = require("redis-smq-common");
const _get_queue_state_js_1 = require("../../../../queue-state-manager/_/_get-queue-state.js");
const with_shared_pool_connection_js_1 = require("../../../../common/redis/redis-connection-pool/with-shared-pool-connection.js");
const index_js_1 = require("../../../../queue-state-manager/index.js");
const index_js_2 = require("../../../../queue-manager/index.js");
const purge_queue_job_manager_js_1 = require("../../../../common/background-jobs/jobs/purge-queue/purge-queue-job-manager.js");
const _unlock_queue_js_1 = require("../../../../queue-state-manager/_/_unlock-queue.js");
class RecoverOrphanedQueueLockWorker extends queue_worker_abstract_js_1.QueueWorkerAbstract {
work(cb) {
(0, with_shared_pool_connection_js_1.withSharedPoolConnection)((client, cb) => {
const queue = this.queueParsedParams.queueParams;
redis_smq_common_1.async.waterfall([
(next) => (0, _get_queue_state_js_1._getQueueState)(client, this.queueParsedParams.queueParams, next),
(state, next) => {
if (state.to !== index_js_2.EQueueOperationalState.LOCKED)
return next();
if (state.lockOwner === index_js_1.EQueueStateLockOwner.PURGE_JOB) {
const purgeQueueJobManager = new purge_queue_job_manager_js_1.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...`);
(0, _unlock_queue_js_1._unlockQueue)(queue, index_js_1.EQueueStateLockOwner.PURGE_JOB, jobId, {
reason: index_js_1.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);
}
}
exports.RecoverOrphanedQueueLockWorker = RecoverOrphanedQueueLockWorker;
exports.default = RecoverOrphanedQueueLockWorker;
//# sourceMappingURL=recover-orphaned-queue-lock.worker.js.map