"""可控逻辑时钟说明 fencing；内存演示不能用作真实分布式锁。"""
from dataclasses import dataclass


@dataclass
class Lease:
    owner: str = ""
    expires_at: int = 0
    generation: int = 0

    def claim(self, owner: str, now: int, ttl: int) -> int:
        if ttl <= 0 or not owner:
            raise ValueError("owner 与 TTL 必须有效")
        if self.owner and now < self.expires_at:
            raise ValueError("当前租约尚未过期")
        self.owner = owner
        self.expires_at = now + ttl
        self.generation += 1
        return self.generation

    def can_write(self, owner: str, generation: int, now: int) -> bool:
        # 真正实现必须把本条件与状态更新放在数据库同一个原子操作里。
        return self.owner == owner and self.generation == generation and now < self.expires_at


if __name__ == "__main__":
    lease = Lease()
    old = lease.claim("worker-A", now=0, ttl=10)
    new = lease.claim("worker-B", now=11, ttl=10)
    print({"old_write_allowed": lease.can_write("worker-A", old, 12),
           "new_write_allowed": lease.can_write("worker-B", new, 12)})
