假设我有两个没有保证同步`系统时间的淡化节点(不要问为什么我会这样做,这只是一个假设的问题):
假设节点1的绝对时间在开始时设置为0(System.currentTimeMillis返回0),节点2的绝对时间设置为1000.
我创建一个存储在节点1上的锁,并将其到期时间设置为100毫秒。它在节点1绝对时间100和节点2绝对时间1100到期。现在节点2加入集群。我还检索在节点2上运行的应用程序中的锁(不试图锁定它的cource,因为它仍然锁定在节点1上)。现在我持有两个ILock引用锁,一个在节点1上运行的应用程序中,一个在节点2上运行的应用程序中。
当我在节点2上的ILock上调用操作时,它看到实际对象(在锁存储中)位于节点1上,因此它在节点1上远程调用操作。此时我们没有遇到问题时间差异了。如果我们等待100毫秒,节点1将使锁定到期。
但我们不等。相反,我们关闭节点1.锁被转移到节点2,因为节点1不再可用。在传输期间,节点1上的LockResourceImpl.writeData方法将锁的数据写入某个缓冲区。然后这个缓冲区被转移到节点2,LockResourceImpl.readData方法在那里读取它并设置值。
据我所知,时间戳只是被复制到各个字段而没有考虑节点2上的时钟可能不同。这意味着到期时间仍然是100(节点1设置的绝对时间) )节点2系统时间已经是1000。这意味着锁即使不会立即过期。
我理解正确吗?这实际上是个问题吗?
答案 0 :(得分:0)
不,这不是问题。当节点死亡时,节点拥有的锁定的标准行为将立即释放。如果你考虑一下,它确实有意义,因为一个死节点没有用于锁定,如果你通过在另一台机器上使用锁定来强制进行定时等待,你的代码就会出现问题。
免责声明:我没有对此问题进行过调查,但所描述的行为是锁定群集(包括淡水广播)系统的标准。