I've got a question regarding the connectionloss exception thrown by Java.
I've got an ensemble running with three zk servers. If one of the three
servers is not running, the whole ensemble should still work (and it
does, so that's fine). But in this situation I experience quite often a
connectionloss exception and I'm wondering if I'm doing something wrong
or if that's to be expected.

My Code is rather simple:
I create a new connection to my ensemble using

ZooKeeper zk = new ZooKeeper (connectString, timeOut, new MyWatcher ());

where connectString contains all three servers. Then I use the ZooKeeper
to read data from a certain path:

zk.getData (path, false, null);

This call quite often returns an exception like

KeeperErrorCode = ConnectionLoss for /125/170/test

But according to your documentation, the connectionloss exception should
only occur in the following two cases:

>    1. The application calls an operation on a session that is no longer 
> alive/valid

This should not be the case, since I only just created the session.

>    2. The ZooKeeper client disconnects from a server when there are pending 
> operations to that server, i.e., there is a pending asynchronous call.

The should also not be the case. I was just doing a read request and no
other client was accessing the ensemble.

My only idea is that maybe the connection call first tried to connect to
 the zookeeper server that was not running (remember only two of the
three servers are running) and before it had a chance to try to connect
to one of the other servers, my getData call was made and failed with
connectionloss. Could that be the reason?
But I thought the connection handling was automatic and if a connection
failed the client would automatically try any of the other listed
servers without the user noticing!?

Thanks for any help.



Michael Bauland

Reply via email to