org.apache.solr.cloud.overseer

## Class ZkStateWriter

- java.lang.Object
- - org.apache.solr.cloud.overseer.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, ZkWriteCommand, 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, ZkWriteCommand, 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.

- - ### Nested Class Summary

    Nested Classes
    Modifier and Type | Class and Description
    --- | ---
    `static interface` | `ZkStateWriter.ZkWriteCallback`

  - ### Field Summary

    Fields
    Modifier and Type | Field and Description
    --- | ---
    `protected ClusterState` | `clusterState`
    `protected boolean` | `invalidState` Set to true if we ever get a BadVersionException so that we can disallow future operations with this instance
    `protected boolean` | `isClusterStateModified`
    `protected String` | `lastCollectionName`
    `protected int` | `lastStateFormat`
    `protected long` | `lastUpdatedTime`
    `static ZkWriteCommand` | `NO_OP` Represents a no-op `ZkWriteCommand` which will result in no modification to cluster state
    `protected ZkStateReader` | `reader`
    `protected Overseer.Stats` | `stats`
    `protected Map<String,DocCollection>` | `updates`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `ZkStateWriter(ZkStateReader zkStateReader, Overseer.Stats stats)`

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `ClusterState` | `enqueueUpdate(ClusterState prevState, ZkWriteCommand cmd, ZkStateWriter.ZkWriteCallback callback)` Applies the given `ZkWriteCommand` on the `prevState`.
    `ClusterState` | `getClusterState()`
    `long` | `getLastUpdatedTime()`
    `boolean` | `hasPendingUpdates()`
    `protected boolean` | `maybeFlushAfter(ZkWriteCommand cmd)` Logic to decide a flush after processing a ZkWriteCommand
    `protected boolean` | `maybeFlushBefore(ZkWriteCommand cmd)` Logic to decide a flush before processing a ZkWriteCommand
    `ClusterState` | `writePendingUpdates()` Writes all pending updates to ZooKeeper and returns the modified cluster state

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Field Detail

    - #### NO_OP

          public static ZkWriteCommand NO_OP

      Represents a no-op `ZkWriteCommand` which will result in no modification to cluster state

    - #### reader

          protected final ZkStateReader reader

    - #### stats

          protected final Overseer.Stats stats

    - #### updates

          protected Map<String,DocCollection> updates

    - #### clusterState

          protected ClusterState clusterState

    - #### isClusterStateModified

          protected boolean isClusterStateModified

    - #### lastUpdatedTime

          protected long lastUpdatedTime

    - #### lastStateFormat

          protected int lastStateFormat

    - #### lastCollectionName

          protected String lastCollectionName

    - #### 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

    - #### ZkStateWriter

          public ZkStateWriter(ZkStateReader zkStateReader,
                               Overseer.Stats stats)

  - ### Method Detail

    - #### enqueueUpdate

          public ClusterState enqueueUpdate(ClusterState prevState,
                                            ZkWriteCommand cmd,
                                            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
        `cmd` - the `ZkWriteCommand` which specifies the change to be applied to cluster state
        `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

    - #### maybeFlushBefore

          protected boolean maybeFlushBefore(ZkWriteCommand cmd)

      Logic to decide a flush before processing a ZkWriteCommand
      Parameters:
        `cmd` - the ZkWriteCommand instance
      Returns:
        true if a flush is required, false otherwise

    - #### maybeFlushAfter

          protected boolean maybeFlushAfter(ZkWriteCommand cmd)

      Logic to decide a flush after processing a ZkWriteCommand
      Parameters:
        `cmd` - the ZkWriteCommand instance
      Returns:
        true if a flush to ZK is required, false otherwise

    - #### 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

    - #### getLastUpdatedTime

          public long getLastUpdatedTime()

      Returns:
        time returned by System.nanoTime at which the main cluster state was last written to ZK or 0 if never

    - #### getClusterState

          public ClusterState getClusterState()

      Returns:
        the most up-to-date cluster state until the last enqueueUpdate operation

Copyright © 2000-2016 Apache Software Foundation. All Rights Reserved.