用哈希表维护每个资源的 (持有者 nodeId, 最近续约时刻 last):
$time < last + ttl$(注意 $last + ttl$ 可能溢出,用 64 位)acquire:无有效持有者或持有者为本节点则写入/续约;否则失败renew:必须是当前有效持有者release:记录持有者匹配即可删除(过期也可清)holder / aliveCount:按有效性查询请实现一个零信任环境下的资源租约管理器。
系统中有若干资源(resourceId)。同一资源在同一时刻最多被一个节点持有。租约有效期为固定的 ttl:若某资源最近一次成功占用/续约时刻为 last,则在半开时间区间 [last,last+ttl) 内租约有效;当查询时刻 time 满足 time≥last+ttl 时视为过期。
LeaseManager(int ttl):初始化,租约时长为 ttl(保证 ttl≥1)。acquire(int resourceId, int nodeId, int time):节点 nodeId 在时刻 time 申请资源。
nodeId,记录 last = time,返回 truenodeId,视为续约:更新 last = time,返回 truefalserenew(int resourceId, int nodeId, int time):仅当当前有效持有者是 nodeId 时续约成功(last = time),返回 true;否则 falserelease(int resourceId, int nodeId):若记录中的持有者是 nodeId(不论是否已过期),清除租约并返回 true;否则 falseholder(int resourceId, int time):返回时刻 time 的有效持有者 nodeId;无有效持有者返回 -1aliveCount(int time):返回时刻 time 仍然有效的租约数量每行一次函数调用。首行 LeaseManager(ttl)。累计调用不超过 3000 次。
nullacquire / renew / release 返回 true / falseholder / aliveCount 返回整数输入:
LeaseManager(5)
acquire(1, 10, 0)
acquire(1, 20, 3)
holder(1, 3)
renew(1, 10, 4)
holder(1, 8)
holder(1, 9)
acquire(1, 20, 9)
aliveCount(9)
release(1, 20)
holder(1, 9)
输出:
null
true
false
10
true
10
-1
true
1
true
-1
说明:
holder 仍为 10holder 为 10;时刻 9 过期,holder 为 −1acquire;随后 release 清空
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.