tgockel / zookeeper-cpp

A ZooKeeper client for C++.
http://tgockel.github.io/zookeeper-cpp/
Apache License 2.0
148 stars 40 forks source link

zk::client::connect : cannot abort/timeout/cancel connection attempt #122

Open GuillaumeDua opened 3 years ago

GuillaumeDua commented 3 years ago

Is there a way to cancel connection ?

For instance, when trying to connect to a Zk server that is not running, how can we abord the connection attempt ?

According to the following snippet,

auto main() -> int
{
    try
    {
        auto client_future = zk::client::connect("zk://127.0.0.1:2181"); // local server which is currently stopped
        using namespace std::chrono_literals;
        const auto wait_result = client_future.wait_for(2s);
        if (wait_result != std::future_status::ready)
        {
            throw std::runtime_error{ "timeout 1" }; // reached, but after throw(),
                                                                                    // the code flow go back to `auto client_future = zk::client::connect("zk://127.0.0.1:2181");`
        }
    }
    catch (const std::runtime_error& error)
    {       // never reached
        std::cerr << "error : " << error.what() << '\n';
    }
    return 0;
GuillaumeDua commented 3 years ago

Ps : The issue (if an issue it is for you as a library designer), is related to https://en.cppreference.com/w/cpp/thread/future/%7Efuture to me

GuillaumeDua commented 3 years ago

In my opinion :

auto client = zk::client::connect(/*args...*/)

should be equivalent to :

auto client = zk::client{zk::connection::connect(/*args...*/)}

Having zk::client::connect::get blocking the current thread as long as the client is not connected is not a viable option as we do not have cancelation in the current future implementation.