```
fix(lock): 解决解锁时未正确传递 requestId 的问题 在处理 unlock 消息时,缺少了 requestId 参数的传递, 导致无法准确释放对应的读锁或写锁。 同时增加 _releaseReadLocks 方法以支持按 requestId 精确释放读锁。 ```
This commit is contained in:
parent
b38367f09f
commit
48c66fa72e
26
lock.js
26
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}`);
|
||||
|
|
|
|||
Loading…
Reference in New Issue