zkutil: changed exception policy [#METR-10969]

This commit is contained in:
Pavel Kartavyy 2014-06-26 23:08:48 +04:00
parent 0cd5c39456
commit 0eedb5ee84
2 changed files with 30 additions and 12 deletions

View File

@ -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;
};

View File

@ -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;
}