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}`);