From 48c66fa72e8ac08f9588d1c33bb4380c530d1415 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=B9=BF?= Date: Tue, 18 Nov 2025 15:03:57 +0800 Subject: [PATCH] =?UTF-8?q?```=20fix(lock):=20=E8=A7=A3=E5=86=B3=E8=A7=A3?= =?UTF-8?q?=E9=94=81=E6=97=B6=E6=9C=AA=E6=AD=A3=E7=A1=AE=E4=BC=A0=E9=80=92?= =?UTF-8?q?=20requestId=20=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在处理 unlock 消息时,缺少了 requestId 参数的传递, 导致无法准确释放对应的读锁或写锁。 同时增加 _releaseReadLocks 方法以支持按 requestId 精确释放读锁。 ``` --- lock.js | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/lock.js b/lock.js index 70ddf1a..ac81520 100644 --- a/lock.js +++ b/lock.js @@ -64,7 +64,7 @@ class LockServer { this.handleWriteLock(clientId, resource, requestId, lock); break; case 'unlock': - this.handleUnlock(clientId, resource, lock); + this.handleUnlock(clientId, resource,requestId, lock); break; default: this.sendError(clientId, `Unknown message type: ${type}`); @@ -122,24 +122,40 @@ class LockServer { } } + _releaseReadLocks(lock, lockId){ + if(lock.readers.has(lockId)){ + lock.readers.delete(lockId); + this._logger.debug(`Read lock released by ${lockId} for ${resource}`); + return 1 + } + let ret = 0 + for(let lockId of lock.readers){ + if(lockId.startsWith(lockId)){ + lock.readers.delete(lockId) + ret += 1 + } + } + return ret + } /** * 处理解锁请求 * @param {string} clientId - 客户端标识符 * @param {string} resource - 资源名称 * @param {Object} lock - 锁对象 */ - handleUnlock(clientId, resource, lock) { + handleUnlock(clientId, resource, requestId,lock) { let released = false; // 移除读锁 - if (lock.readers.has(clientId)) { - lock.readers.delete(clientId); + const lockId = requestId?`${clientId}_${requestId}`:clientId + if (this._releaseReadLocks(lockId)>0) { + // lock.readers.delete(clientId); released = true; this._logger.debug(`Read lock released by ${clientId} for ${resource}`); } // 移除写锁 - if (lock.writer === clientId) { + if (lock.writer === lockId) { lock.writer = null; released = true; this._logger.debug(`Write lock released by ${clientId} for ${resource}`);