Details
-
Bug
-
Status: Open
-
Minor
-
Resolution: Unresolved
-
TBD
-
None
-
Patch
Description
consider the situation, after the EnsembleProvider changed the connection string, ConnectionState.process received a session event, which will invoke checkState to check whether the client is connected.
@Override public void process(WatchedEvent event) { //... boolean wasConnected = isConnected.get(); boolean newIsConnected = wasConnected; if ( event.getType() == Watcher.Event.EventType.None ) { newIsConnected = checkState(event.getState(), wasConnected); } if ( newIsConnected != wasConnected ) { isConnected.set(newIsConnected); connectionStartMs = System.currentTimeMillis(); } }
if the old connection state is SyncConnected or ConnectedReadOnly, isConnected will be set true, even the handleNewConnectionString() was invoked, and the state was reset to create a new connection.
After checkState return, process will set the new connection to the old connected state.
if ( checkNewConnectionString && zooKeeper.hasNewConnectionString() ) { isConnected = false; // force to set it handleNewConnectionString(); }
We could force the state to disconnected when we found a new connection will be create.