mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-20 00:30:49 +00:00
Add comprehensive exception message for ZooKeeper::multi(). [#CLICKHOUSE-2]
This commit is contained in:
parent
afc4b1bef2
commit
003d2a9478
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user