Add comprehensive exception message for ZooKeeper::multi(). [#CLICKHOUSE-2]

This commit is contained in:
Vitaliy Lyudvichenko 2017-08-03 03:21:50 +03:00 committed by alexey-milovidov
parent afc4b1bef2
commit 003d2a9478
3 changed files with 66 additions and 1 deletions

View File

@ -568,7 +568,20 @@ int32_t ZooKeeper::multiImpl(const Ops & ops_, OpResultsPtr * out_results_)
OpResultsPtr ZooKeeper::multi(const Ops & ops)
{
OpResultsPtr results;
check(tryMulti(ops, &results));
int code = tryMulti(ops, &results);
if (code != ZOK)
{
if (results && results->size() == ops.size())
{
for (size_t i = 0; i < ops.size(); ++i)
{
if (results->at(i).err == code)
throw KeeperException("multi() failed at op #" + std::to_string(i) + ", " + ops[i]->describe(), code);
}
}
throw KeeperException(code);
}
return results;
}

View File

@ -15,3 +15,6 @@ target_link_libraries(zkutil_zookeeper_holder dbms)
add_executable (zk_many_watches_reconnect zk_many_watches_reconnect.cpp)
target_link_libraries (zk_many_watches_reconnect dbms)
add_executable (zkutil_test_multi_exception zkutil_test_multi_exception.cpp)
target_link_libraries (zkutil_test_multi_exception dbms)

View File

@ -0,0 +1,49 @@
#include <iostream>
#include <Common/ZooKeeper/ZooKeeper.h>
#include <Common/Exception.h>
using namespace DB;
int main()
{
auto zookeeper = std::make_unique<zkutil::ZooKeeper>("localhost:2181");
try
{
auto acl = zookeeper->getDefaultACL();
zkutil::Ops ops;
zookeeper->tryRemoveRecursive("/clickhouse_test_zkutil_multi");
ops.emplace_back(new zkutil::Op::Create("/clickhouse_test_zkutil_multi", "_", acl, zkutil::CreateMode::Persistent));
ops.emplace_back(new zkutil::Op::Create("/clickhouse_test_zkutil_multi/a", "_", acl, zkutil::CreateMode::Persistent));
zookeeper->multi(ops);
ops.clear();
ops.emplace_back(new zkutil::Op::Create("/clickhouse_test_zkutil_multi/c", "_", acl, zkutil::CreateMode::Persistent));
ops.emplace_back(new zkutil::Op::Remove("/clickhouse_test_zkutil_multi/c", -1));
ops.emplace_back(new zkutil::Op::Create("/clickhouse_test_zkutil_multi/a", "BadBoy", acl, zkutil::CreateMode::Persistent));
ops.emplace_back(new zkutil::Op::Create("/clickhouse_test_zkutil_multi/b", "_", acl, zkutil::CreateMode::Persistent));
ops.emplace_back(new zkutil::Op::Create("/clickhouse_test_zkutil_multi/a", "_", acl, zkutil::CreateMode::Persistent));
zookeeper->multi(ops);
}
catch (...)
{
zookeeper->tryRemoveRecursive("/clickhouse_test_zkutil_multi");
String msg = getCurrentExceptionMessage(false);
if (msg.find("/clickhouse_test_zkutil_multi/a") == std::string::npos || msg.find("#2") == std::string::npos)
{
std::cerr << "Wrong: " << msg;
return -1;
}
std::cout << "Ok: " << msg;
return 0;
}
std::cerr << "Unexpected";
return -1;
}