Class ZkStateWriter


  • public class ZkStateWriter
    extends Object
    ZkStateWriter is responsible for writing updates to the cluster state stored in ZooKeeper for both stateFormat=1 collection (stored in shared /clusterstate.json in ZK) and stateFormat=2 collections each of which get their own individual state.json in ZK. Updates to the cluster state are specified using the enqueueUpdate(ClusterState, List, ZkWriteCallback) method. The class buffers updates to reduce the number of writes to ZK. The buffered updates are flushed during enqueueUpdate automatically if necessary. The writePendingUpdates() can be used to force flush any pending updates. If either enqueueUpdate(ClusterState, List, ZkWriteCallback) or writePendingUpdates() throws a KeeperException.BadVersionException then the internal buffered state of the class is suspect and the current instance of the class should be discarded and a new instance should be created and used for any future updates.
    • Field Detail

      • stats

        protected final Stats stats
      • isClusterStateModified

        protected boolean isClusterStateModified
      • lastUpdatedTime

        protected long lastUpdatedTime
      • invalidState

        protected boolean invalidState
        Set to true if we ever get a BadVersionException so that we can disallow future operations with this instance
    • Constructor Detail

    • Method Detail

      • enqueueUpdate

        public ClusterState enqueueUpdate​(ClusterState prevState,
                                          List<ZkWriteCommand> cmds,
                                          ZkStateWriter.ZkWriteCallback callback)
                                   throws IllegalStateException,
                                          Exception
        Applies the given ZkWriteCommand on the prevState. The modified ClusterState is returned and it is expected that the caller will use the returned cluster state for the subsequent invocation of this method.

        The modified state may be buffered or flushed to ZooKeeper depending on the internal buffering logic of this class. The hasPendingUpdates() method may be used to determine if the last enqueue operation resulted in buffered state. The method writePendingUpdates() can be used to force an immediate flush of pending cluster state changes.

        Parameters:
        prevState - the cluster state information on which the given cmd is applied
        cmds - the list of ZkWriteCommand which specifies the change to be applied to cluster state in atomic
        callback - a ZkStateWriter.ZkWriteCallback object to be used for any callbacks
        Returns:
        modified cluster state created after applying cmd to prevState. If cmd is a no-op (NO_OP) then the prevState is returned unmodified.
        Throws:
        IllegalStateException - if the current instance is no longer usable. The current instance must be discarded.
        Exception - on an error in ZK operations or callback. If a flush to ZooKeeper results in a KeeperException.BadVersionException this instance becomes unusable and must be discarded
      • hasPendingUpdates

        public boolean hasPendingUpdates()
      • writePendingUpdates

        public ClusterState writePendingUpdates()
                                         throws IllegalStateException,
                                                org.apache.zookeeper.KeeperException,
                                                InterruptedException
        Writes all pending updates to ZooKeeper and returns the modified cluster state
        Returns:
        the modified cluster state
        Throws:
        IllegalStateException - if the current instance is no longer usable and must be discarded
        org.apache.zookeeper.KeeperException - if any ZooKeeper operation results in an error
        InterruptedException - if the current thread is interrupted
      • getClusterState

        public ClusterState getClusterState()
        Returns:
        the most up-to-date cluster state until the last enqueueUpdate operation