Class ZkStateReader

java.lang.Object
org.apache.solr.common.cloud.ZkStateReader
All Implemented Interfaces:
Closeable, AutoCloseable, org.apache.solr.common.SolrCloseable

public class ZkStateReader extends Object implements org.apache.solr.common.SolrCloseable
  • Field Details

  • Constructor Details

    • ZkStateReader

      public ZkStateReader(SolrZkClient zkClient)
    • ZkStateReader

      public ZkStateReader(SolrZkClient zkClient, Runnable securityNodeListener)
    • ZkStateReader

      public ZkStateReader(String zkServerAddress, int zkClientTimeout, int zkClientConnectTimeout)
    • ZkStateReader

      public ZkStateReader(String zkServerAddress, int zkClientTimeout, int zkClientConnectTimeout, boolean canUseZkACLs)
  • Method Details

    • from

      public static ZkStateReader from(org.apache.solr.client.solrj.impl.CloudSolrClient solrClient)
      Gets the ZkStateReader inside a ZK based SolrClient.
      Throws:
      IllegalArgumentException - if solrClient isn't ZK based.
    • forciblyRefreshAllClusterStateSlow

      public void forciblyRefreshAllClusterStateSlow() throws org.apache.zookeeper.KeeperException, InterruptedException
      Forcibly refresh cluster state from ZK. Do this only to avoid race conditions because it's expensive.

      It is cheaper to call forceUpdateCollection(String) on a single collection if you must.

      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
      NOTE: This API is for internal purposes only and might change in incompatible ways in the next release.
    • forceUpdateCollection

      public void forceUpdateCollection(String collection) throws org.apache.zookeeper.KeeperException, InterruptedException
      Forcibly refresh a collection's internal state from ZK. Try to avoid having to resort to this when a better design is possible.
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • updateLiveNodes

      public void updateLiveNodes() throws org.apache.zookeeper.KeeperException, InterruptedException
      Refresh the set of live nodes.
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • compareStateVersions

      public Integer compareStateVersions(String coll, int version)
    • createClusterStateWatchersAndUpdate

      public void createClusterStateWatchersAndUpdate() throws org.apache.zookeeper.KeeperException, InterruptedException
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • registerCloudCollectionsListener

      public void registerCloudCollectionsListener(CloudCollectionsListener cloudCollectionsListener)
      Register a CloudCollectionsListener to be called when the set of collections within a cloud changes.
    • removeCloudCollectionsListener

      public void removeCloudCollectionsListener(CloudCollectionsListener cloudCollectionsListener)
      Remove a registered CloudCollectionsListener.
    • getCurrentCollections

      public Set<String> getCurrentCollections()
    • registerClusterPropertiesListener

      public void registerClusterPropertiesListener(ClusterPropertiesListener listener)
    • removeClusterPropertiesListener

      public void removeClusterPropertiesListener(ClusterPropertiesListener listener)
    • registerLiveNodesListener

      public void registerLiveNodesListener(LiveNodesListener listener)
    • removeLiveNodesListener

      public void removeLiveNodesListener(LiveNodesListener listener)
    • fetchLowestSolrVersion

      public Optional<SolrVersion> fetchLowestSolrVersion() throws org.apache.zookeeper.KeeperException, InterruptedException
      Returns the lowest Solr version among all live nodes in the cluster. If older Solr nodes have joined that don't declare their version, the result won't be accurate, but it's at least an upper bound on the possible version it might be.
      Returns:
      an Optional containing the lowest Solr version of nodes in the cluster, or empty if no live nodes exist or all nodes return 9.9.0 for unspecified versions
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • getClusterState

      public org.apache.solr.common.cloud.ClusterState getClusterState()
      Returns:
      information about the cluster from ZooKeeper
    • getUpdateLock

      public Object getUpdateLock()
    • getZKClient

      public SolrZkClient getZKClient()
    • close

      public void close()
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable
    • isClosed

      public boolean isClosed()
      Specified by:
      isClosed in interface org.apache.solr.common.SolrCloseable
    • getLeaderUrl

      public String getLeaderUrl(String collection, String shard, int timeout) throws InterruptedException
      Throws:
      InterruptedException
    • getLeader

      public org.apache.solr.common.cloud.Replica getLeader(Set<String> liveNodes, org.apache.solr.common.cloud.DocCollection docCollection, String shard)
    • getLeader

      public org.apache.solr.common.cloud.Replica getLeader(String collection, String shard)
    • isNodeLive

      public boolean isNodeLive(String node)
    • getLeaderRetry

      public org.apache.solr.common.cloud.Replica getLeaderRetry(String collection, String shard) throws InterruptedException
      Get shard leader properties, with retry if none exist.
      Throws:
      InterruptedException
    • getLeaderRetry

      public org.apache.solr.common.cloud.Replica getLeaderRetry(String collection, String shard, int timeout) throws InterruptedException
      Get shard leader properties, with retry if none exist.
      Throws:
      InterruptedException
    • getShardLeadersPath

      public static String getShardLeadersPath(String collection, String shardId)
      Get path where shard leader properties live in zookeeper.
    • getShardLeadersElectPath

      public static String getShardLeadersElectPath(String collection, String shardId)
      Get path where shard leader elections ephemeral nodes are.
    • getReplicaProps

      public List<org.apache.solr.common.cloud.ZkCoreNodeProps> getReplicaProps(String collection, String shardId, String thisCoreNodeName)
    • getReplicaProps

      public List<org.apache.solr.common.cloud.ZkCoreNodeProps> getReplicaProps(String collection, String shardId, String thisCoreNodeName, org.apache.solr.common.cloud.Replica.State mustMatchStateFilter, org.apache.solr.common.cloud.Replica.State mustNotMatchStateFilter, EnumSet<org.apache.solr.common.cloud.Replica.Type> acceptReplicaType)
    • getZkClient

      public SolrZkClient getZkClient()
    • getClusterProperty

      public <T> T getClusterProperty(String key, T defaultValue)
      Get a cluster property

      N.B. Cluster properties are updated via ZK watchers, and so may not necessarily be completely up-to-date. If you need to get the latest version, then use a ClusterProperties instance.

      Type Parameters:
      T - the type of the property
      Parameters:
      key - the property to read
      defaultValue - a default value to use if no such property exists
      Returns:
      the cluster property, or a default if the property is not set
    • getClusterProperty

      public <T> T getClusterProperty(List<String> keyPath, T defaultValue)
      Same as the above but allows a full json path as a list of parts
      Parameters:
      keyPath - path to the property example ["collectionDefauls", "numShards"]
      defaultValue - a default value to use if no such property exists
      Returns:
      the cluster property, or a default if the property is not set
    • getClusterProperties

      public Map<String,Object> getClusterProperties()
      Get all cluster properties for this cluster

      N.B. Cluster properties are updated via ZK watchers, and so may not necessarily be completely up-to-date. If you need to get the latest version, then use a ClusterProperties instance.

      Returns:
      a Map of cluster properties
    • getCollectionProperties

      public Map<String,String> getCollectionProperties(String collection)
      Get properties for a specific collection
    • getCollectionProperties

      public Map<String,String> getCollectionProperties(String collection, long cacheForMillis)
      Get and cache collection properties for a given collection
    • getSecurityProps

      public ZkStateReader.ConfigData getSecurityProps(boolean getFresh)
      Returns the content of /security.json from ZooKeeper as a Map If the files doesn't exist, it returns null.
    • getBaseUrlForNodeName

      public String getBaseUrlForNodeName(String nodeName)
      Returns the baseURL corresponding to a given node's nodeName -- NOTE: does not (currently) imply that the nodeName (or resulting baseURL) exists in the cluster.
      Parameters:
      nodeName - name of the node
      Returns:
      url that looks like https://localhost:8983/solr
    • getBaseUrlV2ForNodeName

      public String getBaseUrlV2ForNodeName(String nodeName)
      Returns the V2 baseURL corresponding to a given node's nodeName -- NOTE: does not (currently) imply that the nodeName (or resulting baseURL) exists in the cluster.
      Parameters:
      nodeName - name of the node
      Returns:
      url that looks like https://localhost:8983/api
    • getCollectionLive

      public org.apache.solr.common.cloud.DocCollection getCollectionLive(String coll)
    • getCollectionPathRoot

      @Deprecated public static String getCollectionPathRoot(String coll)
      Deprecated.
    • getCollectionPath

      @Deprecated public static String getCollectionPath(String coll)
      Deprecated.
    • registerCore

      public void registerCore(String collection)
      Notify this reader that a local Core is a member of a collection, and so that collection state should be watched.

      Not a public API. This method should only be called from ZkController.

      The number of cores per-collection is tracked, and adding multiple cores from the same collection does not increase the number of watches.

      Parameters:
      collection - the collection that the core is a member of
      See Also:
    • unregisterCore

      public void unregisterCore(String collection)
      Notify this reader that a local core that is a member of a collection has been closed.

      Not a public API. This method should only be called from ZkController.

      If no cores are registered for a collection, and there are no CollectionStateWatchers for that collection either, the collection watch will be removed.

      Parameters:
      collection - the collection that the core belongs to
    • registerCollectionStateWatcher

      public void registerCollectionStateWatcher(String collection, CollectionStateWatcher stateWatcher)
      Register a CollectionStateWatcher to be called when the state of a collection changes or the set of live nodes changes.

      The Watcher will automatically be removed when it's onStateChanged returns true

      This is method is just syntactic sugar for registering both a DocCollectionWatcher and a LiveNodesListener. Callers that only care about one or the other (but not both) are encouraged to use the more specific methods register methods as it may reduce the number of ZooKeeper watchers needed, and reduce the amount of network/cpu used.

      Parameters:
      collection - the collection to watch
      stateWatcher - a watcher that will be called when the state changes
      See Also:
    • registerDocCollectionWatcher

      public void registerDocCollectionWatcher(String collection, DocCollectionWatcher docCollectionWatcher)
      Register a DocCollectionWatcher to be called when the cluster state for a collection changes.

      The Watcher will automatically be removed when it's onStateChanged returns true

    • waitForState

      public void waitForState(String collection, long wait, TimeUnit unit, org.apache.solr.common.cloud.CollectionStatePredicate predicate) throws InterruptedException, TimeoutException
      Block until a CollectionStatePredicate returns true, or the wait times out

      Note that the predicate may be called again even after it has returned true, so implementors should avoid changing state within the predicate call itself.

      This implementation utilizes CollectionStateWatcher internally. Callers that don't care about liveNodes are encouraged to use a DocCollection Predicate instead

      Parameters:
      collection - the collection to watch
      wait - how long to wait
      unit - the units of the wait parameter
      predicate - the predicate to call on state changes
      Throws:
      InterruptedException - on interrupt
      TimeoutException - on timeout
      See Also:
    • waitForState

      public org.apache.solr.common.cloud.DocCollection waitForState(String collection, long wait, TimeUnit unit, Predicate<org.apache.solr.common.cloud.DocCollection> predicate) throws InterruptedException, TimeoutException
      Block until a Predicate returns true, or the wait times out

      Note that the predicate may be called again even after it has returned true, so implementors should avoid changing state within the predicate call itself. The predicate may also be called concurrently when multiple state changes are seen in rapid succession.

      Parameters:
      collection - the collection to watch
      wait - how long to wait
      unit - the units of the wait parameter
      predicate - the predicate to call on state changes
      Returns:
      the state of the doc collection after the predicate succeeds
      Throws:
      InterruptedException - on interrupt
      TimeoutException - on timeout
    • waitForLiveNodes

      public void waitForLiveNodes(long wait, TimeUnit unit, LiveNodesPredicate predicate) throws InterruptedException, TimeoutException
      Block until a LiveNodesStatePredicate returns true, or the wait times out

      Note that the predicate may be called again even after it has returned true, so implementors should avoid changing state within the predicate call itself.

      Parameters:
      wait - how long to wait
      unit - the units of the wait parameter
      predicate - the predicate to call on state changes
      Throws:
      InterruptedException - on interrupt
      TimeoutException - on timeout
    • removeCollectionStateWatcher

      public void removeCollectionStateWatcher(String collection, CollectionStateWatcher watcher)
      Remove a watcher from a collection's watch list.

      This allows Zookeeper watches to be removed if there is no interest in the collection.

      Parameters:
      collection - the collection
      watcher - the watcher
      See Also:
    • removeDocCollectionWatcher

      public void removeDocCollectionWatcher(String collection, DocCollectionWatcher watcher)
      Remove a watcher from a collection's watch list.

      This allows Zookeeper watches to be removed if there is no interest in the collection.

      Parameters:
      collection - the collection
      watcher - the watcher
      See Also:
    • registerCollectionPropsWatcher

      public void registerCollectionPropsWatcher(String collection, CollectionPropsWatcher propsWatcher)
    • removeCollectionPropsWatcher

      public void removeCollectionPropsWatcher(String collection, CollectionPropsWatcher watcher)
    • getAliases

      public org.apache.solr.common.cloud.Aliases getAliases()
      Get an immutable copy of the present state of the aliases. References to this object should not be retained in any context where it will be important to know if aliases have changed.
      Returns:
      The current aliases, Aliases.EMPTY if not solr cloud, or no aliases have existed yet. Never returns null.
    • getAliasesManager

      public ZkStateReader.AliasesManager getAliasesManager()
    • getCollection

      public org.apache.solr.common.cloud.DocCollection getCollection(String collection)