zookeeper-cpp icon indicating copy to clipboard operation
zookeeper-cpp copied to clipboard

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

Open GuillaumeDua opened this issue 5 years ago • 2 comments

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 avatar Oct 05 '20 14:10 GuillaumeDua

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 avatar Oct 05 '20 14:10 GuillaumeDua

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.

GuillaumeDua avatar Oct 22 '20 15:10 GuillaumeDua