In ZkStateReader.createClusterStateWatchersAndUpdate, in the watcher for the call to watch CLUSTER_STATE:
List<String> liveNodes = zkClient.getChildren(
LIVE_NODES_ZKNODE, this, true);
Set<String> liveNodesSet = new HashSet<String>();
The liveNodesSet set is never used in subsequent code, since the new cluster state is made from the live node set from the existing cluster state:
Set<String> ln = ZkStateReader.this.clusterState.getLiveNodes();
ClusterState clusterState = ClusterState.load(stat.getVersion(), data, ln);
...which is as it should since this is a watcher for cluster state (if live nodes changes, the watcher for live nodes will be invoked).
Due to the above extraneous call, however, now the cluster state watcher (this) is also set on the LIVE_NODES_ZKNODE path, which is unnecessary to fire when live nodes changed.