mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-22 15:42:02 +00:00
zkutil: changed exception policy [#METR-10969]
This commit is contained in:
parent
0cd5c39456
commit
0eedb5ee84
@ -17,8 +17,12 @@ typedef WatchWithPromise * WatchWithPromisePtr;
|
||||
|
||||
/** Сессия в ZooKeeper. Интерфейс существенно отличается от обычного API ZooKeeper.
|
||||
* Вместо callback-ов для watch-ей используются std::future.
|
||||
* Методы с названиями, не начинающимися с try, бросают исключение при любой ошибке кроме OperationTimeout.
|
||||
* При OperationTimeout пытаемся попробоватть еще retry_num раз.
|
||||
*
|
||||
* Методы на чтение при восстанавливаемых ошибках OperationTimeout, ConnectionLoss пытаются еще retry_num раз.
|
||||
* Методы на запись не пытаются повторить при восстанавливаемых ошибках, т.к. это приводит к проблеммам типа удаления дважды одного и того же.
|
||||
*
|
||||
* Методы с названиями, не начинающимися с try, бросают исключение при любой ошибке.
|
||||
*
|
||||
* Методы с названиями, начинающимися с try, не бросают исключение только при перечисленных видах ошибок.
|
||||
* Например, исключение бросается в любом случае, если сессия разорвалась или если не хватает прав или ресурсов.
|
||||
*/
|
||||
@ -75,6 +79,8 @@ public:
|
||||
* - Нет родителя создаваемой ноды.
|
||||
* - Родитель эфемерный.
|
||||
* - Такая нода уже есть.
|
||||
* - ZCONNECTIONLOSS
|
||||
* - ZOPERATIONTIMEOUT
|
||||
* При остальных ошибках бросает исключение.
|
||||
*/
|
||||
int32_t tryCreate(const std::string & path, const std::string & data, int32_t mode, std::string & pathCreated);
|
||||
@ -88,6 +94,8 @@ public:
|
||||
* - Такой ноды нет.
|
||||
* - У ноды другая версия.
|
||||
* - У ноды есть дети.
|
||||
* - ZCONNECTIONLOSS
|
||||
* - ZOPERATIONTIMEOUT
|
||||
*/
|
||||
int32_t tryRemove(const std::string & path, int32_t version = -1);
|
||||
|
||||
@ -106,6 +114,8 @@ public:
|
||||
/** Не бросает исключение при следующих ошибках:
|
||||
* - Такой ноды нет.
|
||||
* - У ноды другая версия.
|
||||
* - ZCONNECTIONLOSS
|
||||
* - ZOPERATIONTIMEOUT
|
||||
*/
|
||||
int32_t trySet(const std::string & path, const std::string & data,
|
||||
int32_t version = -1, Stat * stat = nullptr);
|
||||
@ -153,7 +163,7 @@ private:
|
||||
int32_t retry(const T & operation)
|
||||
{
|
||||
int32_t code = operation();
|
||||
for (size_t i = 0; (i < retry_num) && (code == ZOPERATIONTIMEOUT); ++i)
|
||||
for (size_t i = 0; (i < retry_num) && (code == ZOPERATIONTIMEOUT || code == ZCONNECTIONLOSS); ++i)
|
||||
{
|
||||
code = operation();
|
||||
}
|
||||
@ -182,7 +192,7 @@ private:
|
||||
WatchFunction * state_watch;
|
||||
std::unordered_set<WatchWithPromise *> watch_store;
|
||||
|
||||
/// Количество попыток повторить операцию при OperationTimeout
|
||||
/// Количество попыток повторить операцию чтения при OperationTimeout, ConnectionLoss
|
||||
size_t retry_num = 3;
|
||||
};
|
||||
|
||||
|
@ -203,12 +203,14 @@ std::string ZooKeeper::create(const std::string & path, const std::string & data
|
||||
|
||||
int32_t ZooKeeper::tryCreate(const std::string & path, const std::string & data, int32_t mode, std::string & pathCreated)
|
||||
{
|
||||
int code = retry(boost::bind(&ZooKeeper::createImpl, this, boost::ref(path), boost::ref(data), mode, boost::ref(pathCreated)));
|
||||
int code = createImpl(path, data, mode, pathCreated);
|
||||
|
||||
if (!( code == ZOK ||
|
||||
code == ZNONODE ||
|
||||
code == ZNODEEXISTS ||
|
||||
code == ZNOCHILDRENFOREPHEMERALS))
|
||||
code == ZNOCHILDRENFOREPHEMERALS ||
|
||||
code == ZCONNECTIONLOSS ||
|
||||
code == ZOPERATIONTIMEOUT))
|
||||
throw KeeperException(code, path);
|
||||
|
||||
return code;
|
||||
@ -233,11 +235,13 @@ void ZooKeeper::remove(const std::string & path, int32_t version)
|
||||
|
||||
int32_t ZooKeeper::tryRemove(const std::string & path, int32_t version)
|
||||
{
|
||||
int32_t code = retry(boost::bind(&ZooKeeper::removeImpl, this, boost::ref(path), version));
|
||||
int32_t code = removeImpl(path, version);
|
||||
if (!( code == ZOK ||
|
||||
code == ZNONODE ||
|
||||
code == ZBADVERSION ||
|
||||
code == ZNOTEMPTY))
|
||||
code == ZNOTEMPTY ||
|
||||
code == ZCONNECTIONLOSS ||
|
||||
code == ZOPERATIONTIMEOUT))
|
||||
throw KeeperException(code, path);
|
||||
return code;
|
||||
}
|
||||
@ -337,11 +341,13 @@ void ZooKeeper::set(const std::string & path, const std::string & data, int32_t
|
||||
int32_t ZooKeeper::trySet(const std::string & path, const std::string & data,
|
||||
int32_t version, Stat * stat_)
|
||||
{
|
||||
int32_t code = retry(boost::bind(&ZooKeeper::setImpl, this, boost::ref(path), boost::ref(data), version, stat_));
|
||||
int32_t code = setImpl(path, data, version, stat_);
|
||||
|
||||
if (!( code == ZOK ||
|
||||
code == ZNONODE ||
|
||||
code == ZBADVERSION))
|
||||
code == ZBADVERSION ||
|
||||
code == ZCONNECTIONLOSS ||
|
||||
code == ZOPERATIONTIMEOUT))
|
||||
throw KeeperException(code, path);
|
||||
return code;
|
||||
}
|
||||
@ -377,14 +383,16 @@ OpResultsPtr ZooKeeper::multi(const Ops & ops)
|
||||
|
||||
int32_t ZooKeeper::tryMulti(const Ops & ops_, OpResultsPtr * out_results_)
|
||||
{
|
||||
int32_t code = retry(boost::bind(&ZooKeeper::multiImpl, this, boost::ref(ops_), out_results_));
|
||||
int32_t code = multiImpl(ops_, out_results_);
|
||||
|
||||
if (code != ZOK &&
|
||||
code != ZNONODE &&
|
||||
code != ZNODEEXISTS &&
|
||||
code != ZNOCHILDRENFOREPHEMERALS &&
|
||||
code != ZBADVERSION &&
|
||||
code != ZNOTEMPTY)
|
||||
code != ZNOTEMPTY &&
|
||||
code != ZCONNECTIONLOSS &&
|
||||
code != ZOPERATIONTIMEOUT)
|
||||
throw KeeperException(code);
|
||||
return code;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user