From 59fd4f9d060cd926c849f608d8169ff5ad79f327 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Fri, 19 Feb 2016 23:35:25 +0300 Subject: [PATCH] Attempt to fix an error with yielding leadership [#METR-20132]. --- libs/libzkutil/include/zkutil/ZooKeeper.h | 7 ++++++- libs/libzkutil/src/Lock.cpp | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/libs/libzkutil/include/zkutil/ZooKeeper.h b/libs/libzkutil/include/zkutil/ZooKeeper.h index e16946c052..52fcdc8467 100644 --- a/libs/libzkutil/include/zkutil/ZooKeeper.h +++ b/libs/libzkutil/include/zkutil/ZooKeeper.h @@ -395,7 +395,12 @@ public: { try { - zookeeper.tryRemove(path); + /** Важно, что в случае недоступности ZooKeeper, делаются повторные попытки удалить ноду, пока не истечёт сессия. + * Иначе возможна ситуация, когда объект EphemeralNodeHolder уничтожен, + * но сессия восстановится в течние session timeout, и эфемерная нода в ZooKeeper останется ещё надолго. + * А это может сломать механизм leader election и блокировок. + */ + zookeeper.tryRemoveWithRetries(path); } catch (const KeeperException & e) { diff --git a/libs/libzkutil/src/Lock.cpp b/libs/libzkutil/src/Lock.cpp index d10a3a10f2..dcafcf1111 100644 --- a/libs/libzkutil/src/Lock.cpp +++ b/libs/libzkutil/src/Lock.cpp @@ -72,7 +72,7 @@ void Lock::unlock() } catch (const zkutil::KeeperException & e) { - /// если сессия находится в невостанавливаемом состоянии, то эфимерные ноды нам больше не принадлежат + /// если сессия находится в невостанавливаемом состоянии, то эфемерные ноды нам больше не принадлежат /// и лок через таймаут будет отпущен if (!e.isUnrecoverable()) throw; -- GitLab