Class SolrZkClient

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

public class SolrZkClient extends Object implements Closeable
All Solr ZooKeeper interactions should go through this class rather than ZooKeeper. This class handles synchronous connects and reconnections.
  • Field Details

    • ZK_CRED_PROVIDER_CLASS_NAME_VM_PARAM_NAME

      public static final String ZK_CRED_PROVIDER_CLASS_NAME_VM_PARAM_NAME
      See Also:
    • ZK_ACL_PROVIDER_CLASS_NAME_VM_PARAM_NAME

      public static final String ZK_ACL_PROVIDER_CLASS_NAME_VM_PARAM_NAME
      See Also:
    • ZK_CREDENTIALS_INJECTOR_CLASS_NAME_VM_PARAM_NAME

      public static final String ZK_CREDENTIALS_INJECTOR_CLASS_NAME_VM_PARAM_NAME
      See Also:
  • Constructor Details

  • Method Details

    • getMetrics

      public SolrZKMetricsListener getMetrics()
    • getZkClientTimeout

      public int getZkClientTimeout()
    • getCuratorFramework

      public org.apache.curator.framework.CuratorFramework getCuratorFramework()
    • createZkCredentialsToAddAutomatically

      protected ZkCredentialsProvider createZkCredentialsToAddAutomatically()
    • createACLProvider

      protected org.apache.curator.framework.api.ACLProvider createACLProvider()
    • createZkCredentialsInjector

      protected ZkCredentialsInjector createZkCredentialsInjector()
    • isConnected

      public boolean isConnected()
      Returns true if client is connected
    • delete

      public void delete(String path, int version) throws InterruptedException, org.apache.zookeeper.KeeperException
      Throws:
      InterruptedException
      org.apache.zookeeper.KeeperException
    • wrapWatcher

      public org.apache.zookeeper.Watcher wrapWatcher(org.apache.zookeeper.Watcher watcher)
      Wraps the watcher so that it doesn't fire off ZK's event queue. In order to guarantee that a watch object will only be triggered once for a given notification, users need to wrap their watcher using this method before calling exists(String, org.apache.zookeeper.Watcher) or getData(String, org.apache.zookeeper.Watcher, org.apache.zookeeper.data.Stat).
    • exists

      public org.apache.zookeeper.data.Stat exists(String path, org.apache.zookeeper.Watcher watcher) throws org.apache.zookeeper.KeeperException, InterruptedException
      Return the stat of the node of the given path. Return null if no such a node exists.

      If the watch is non-null and the call is successful (no exception is thrown), a watch will be left on the node with the given path. The watch will be triggered by a successful operation that creates/delete the node or sets the data on the node.

      Parameters:
      path - the node path
      watcher - explicit watcher
      Returns:
      the stat of the node of the given path; return null if no such a node exists.
      Throws:
      org.apache.zookeeper.KeeperException - If the server signals an error
      InterruptedException - If the server transaction is interrupted.
      IllegalArgumentException - if an invalid path is specified
    • exists

      public Boolean exists(String path) throws org.apache.zookeeper.KeeperException, InterruptedException
      Returns true if path exists
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • getChildren

      public List<String> getChildren(String path, org.apache.zookeeper.Watcher watcher) throws org.apache.zookeeper.KeeperException, InterruptedException
      Returns children of the node at the path
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • getChildren

      public List<String> getChildren(String path, org.apache.zookeeper.Watcher watcher, org.apache.zookeeper.data.Stat stat) throws org.apache.zookeeper.KeeperException, InterruptedException
      Returns children of the node at the path
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • getData

      public byte[] getData(String path, org.apache.zookeeper.Watcher watcher, org.apache.zookeeper.data.Stat stat) throws org.apache.zookeeper.KeeperException, InterruptedException
      Returns node's data
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • getNode

      public SolrZkClient.NodeData getNode(String path, org.apache.zookeeper.Watcher watcher) throws org.apache.zookeeper.KeeperException, InterruptedException
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • setData

      public org.apache.zookeeper.data.Stat setData(String path, byte[] data, int version) throws org.apache.zookeeper.KeeperException, InterruptedException
      Returns node's state
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • atomicUpdate

      public void atomicUpdate(String path, Function<byte[],byte[]> editor) throws org.apache.zookeeper.KeeperException, InterruptedException
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • atomicUpdate

      public void atomicUpdate(String path, BiFunction<org.apache.zookeeper.data.Stat,byte[],byte[]> editor) throws org.apache.zookeeper.KeeperException, InterruptedException
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • create

      public String create(String path, byte[] data, org.apache.zookeeper.CreateMode createMode) throws org.apache.zookeeper.KeeperException, InterruptedException
      Returns path of created node
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • create

      public String create(String path, byte[] data, org.apache.zookeeper.CreateMode createMode, org.apache.zookeeper.data.Stat stat) throws org.apache.zookeeper.KeeperException, InterruptedException
      Returns path of created node
      Parameters:
      stat - Output argument that captures created node details
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • makePath

      public void makePath(String path) throws org.apache.zookeeper.KeeperException, InterruptedException
      Creates the path in ZooKeeper, creating each node as necessary.

      e.g. If path=/solr/group/node and none of the nodes, solr, group, node exist, each will be created.

      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • makePath

      public void makePath(String path, boolean failOnExists) throws org.apache.zookeeper.KeeperException, InterruptedException
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • makePath

      public void makePath(String path, byte[] data, boolean failOnExists) throws org.apache.zookeeper.KeeperException, InterruptedException
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • makePath

      public void makePath(String path, Path data) throws IOException, org.apache.zookeeper.KeeperException, InterruptedException
      Throws:
      IOException
      org.apache.zookeeper.KeeperException
      InterruptedException
    • makePath

      public void makePath(String path, org.apache.zookeeper.CreateMode createMode) throws org.apache.zookeeper.KeeperException, InterruptedException
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • makePath

      public void makePath(String path, byte[] data) throws org.apache.zookeeper.KeeperException, InterruptedException
      Creates the path in ZooKeeper, creating each node as necessary.
      Parameters:
      data - to set on the last zkNode
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • makePath

      public void makePath(String path, byte[] data, org.apache.zookeeper.CreateMode createMode) throws org.apache.zookeeper.KeeperException, InterruptedException
      Creates the path in ZooKeeper, creating each node as necessary.

      e.g. If path=/solr/group/node and none of the nodes, solr, group, node exist, each will be created.

      Parameters:
      data - to set on the last zkNode
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • makePath

      public void makePath(String path, byte[] data, org.apache.zookeeper.CreateMode createMode, org.apache.zookeeper.Watcher watcher) throws org.apache.zookeeper.KeeperException, InterruptedException
      Creates the path in ZooKeeper, creating each node as necessary.

      e.g. If path=/solr/group/node and none of the nodes, solr, group, node exist, each will be created.

      Parameters:
      data - to set on the last zkNode
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • makePath

      public void makePath(String path, byte[] data, org.apache.zookeeper.CreateMode createMode, org.apache.zookeeper.Watcher watcher, boolean failOnExists) throws org.apache.zookeeper.KeeperException, InterruptedException
      Creates the path in ZooKeeper, creating each node as necessary.

      e.g. If path=/solr/group/node and none of the nodes, solr, group, node exist, each will be created.

      Parameters:
      data - to set on the last zkNode
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • makePath

      public void makePath(String path, byte[] data, org.apache.zookeeper.CreateMode createMode, org.apache.zookeeper.Watcher watcher, boolean failOnExists, int skipPathParts) throws org.apache.zookeeper.KeeperException, InterruptedException
      Creates the path in ZooKeeper, creating each node as necessary.

      e.g. If path=/solr/group/node and none of the nodes, solr, group, node exist, each will be created.

      skipPathParts will force the call to fail if the first skipPathParts do not exist already.

      Note: if failOnExists == false then we will always overwrite the existing data with the given data

      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • makePath

      public void makePath(String zkPath, org.apache.zookeeper.CreateMode createMode, org.apache.zookeeper.Watcher watcher) throws org.apache.zookeeper.KeeperException, InterruptedException
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • ensureExists

      public void ensureExists(String path) throws org.apache.zookeeper.KeeperException, InterruptedException
      Create a node if it does not exist
      Parameters:
      path - the path at which to create the znode
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • ensureExists

      public void ensureExists(String path, byte[] data) throws org.apache.zookeeper.KeeperException, InterruptedException
      Create a node if it does not exist
      Parameters:
      path - the path at which to create the znode
      data - the optional data to set on the znode
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • ensureExists

      public void ensureExists(String path, byte[] data, org.apache.zookeeper.CreateMode createMode) throws org.apache.zookeeper.KeeperException, InterruptedException
      Create a node if it does not exist
      Parameters:
      path - the path at which to create the znode
      data - the optional data to set on the znode
      createMode - the mode with which to create the znode
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • ensureExists

      public void ensureExists(String path, byte[] data, org.apache.zookeeper.CreateMode createMode, int skipPathParts) throws org.apache.zookeeper.KeeperException, InterruptedException
      Create a node if it does not exist
      Parameters:
      path - the path at which to create the znode
      data - the optional data to set on the znode
      createMode - the mode with which to create the znode
      skipPathParts - how many path elements to skip
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • setData

      public org.apache.zookeeper.data.Stat setData(String path, byte[] data) throws org.apache.zookeeper.KeeperException, InterruptedException
      Write data to ZooKeeper.
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • setData

      public org.apache.zookeeper.data.Stat setData(String path, Path source) throws IOException, org.apache.zookeeper.KeeperException, InterruptedException
      Write file to ZooKeeper - default system encoding used.
      Parameters:
      path - path to upload file to e.g. /solr/conf/solrconfig.xml
      source - a filepath to read data from
      Throws:
      IOException
      org.apache.zookeeper.KeeperException
      InterruptedException
    • multi

      public List<org.apache.curator.framework.api.transaction.CuratorTransactionResult> multi(SolrZkClient.CuratorOpBuilder... ops) throws InterruptedException, org.apache.zookeeper.KeeperException
      Throws:
      InterruptedException
      org.apache.zookeeper.KeeperException
    • multi

      public List<org.apache.curator.framework.api.transaction.CuratorTransactionResult> multi(List<SolrZkClient.CuratorOpBuilder> ops) throws InterruptedException, org.apache.zookeeper.KeeperException
      Throws:
      InterruptedException
      org.apache.zookeeper.KeeperException
    • printLayout

      public void printLayout(String path, int indent, StringBuilder string) throws org.apache.zookeeper.KeeperException, InterruptedException
      Fills string with printout of current ZooKeeper layout.
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • printLayoutToStream

      public void printLayoutToStream(PrintStream out) throws org.apache.zookeeper.KeeperException, InterruptedException
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • close

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

      public boolean isClosed()
    • getZkSessionId

      public long getZkSessionId()
    • getZkSessionTimeout

      public int getZkSessionTimeout()
    • containsChroot

      public static boolean containsChroot(String zkHost)
      Validates if zkHost contains a chroot. See http://zookeeper.apache.org/doc/r3.2.2/zookeeperProgrammers.html#ch_zkSessions
    • checkInterrupted

      public static Throwable checkInterrupted(Throwable e)
      Check to see if a Throwable is an InterruptedException, and if it is, set the thread interrupt flag
      Parameters:
      e - the Throwable
      Returns:
      the Throwable
    • getZkServerAddress

      public String getZkServerAddress()
      Returns:
      the address of the zookeeper cluster
    • getChroot

      public String getChroot()
      Returns:
      the ChRoot that this client is using for the ZK cluster
    • getAbsolutePath

      public String getAbsolutePath(String path)
      Returns:
      the given path's absolute path in the ZK cluster
    • getConfig

      public String getConfig()
      Gets the raw config node /zookeeper/config as returned by server. Response may look like
       server.1=localhost:2780:2783:participant;localhost:2791
       server.2=localhost:2781:2784:participant;localhost:2792
       server.3=localhost:2782:2785:participant;localhost:2793
       version=400000003
       
      Returns:
      Multi line string representing the config. For standalone ZK this will return empty string
    • getZkACLProvider

      public org.apache.curator.framework.api.ACLProvider getZkACLProvider()
    • getACL

      public List<org.apache.zookeeper.data.ACL> getACL(String path, org.apache.zookeeper.data.Stat stat) throws org.apache.zookeeper.KeeperException, InterruptedException
      Returns:
      the ACLs on a single node in ZooKeeper.
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • setACL

      public org.apache.zookeeper.data.Stat setACL(String path, List<org.apache.zookeeper.data.ACL> acls) throws InterruptedException, org.apache.zookeeper.KeeperException
      Set the ACL on a single node in ZooKeeper. This will replace all existing ACL on that node.
      Parameters:
      path - path to set ACL on e.g. /solr/conf/solrconfig.xml
      acls - a list of ACLs to be applied
      Returns:
      the stat of the node
      Throws:
      InterruptedException
      org.apache.zookeeper.KeeperException
    • updateACLs

      public void updateACLs(String root) throws org.apache.zookeeper.KeeperException, InterruptedException
      Update all ACLs for a zk tree based on our configured ZkACLProvider.
      Parameters:
      root - the root node to recursively update
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • runWithCorrectThrows

      protected <T> T runWithCorrectThrows(String action, SolrZkClient.SupplierWithException<T> func) throws org.apache.zookeeper.KeeperException, InterruptedException
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • clean

      public void clean(String path) throws InterruptedException, org.apache.zookeeper.KeeperException
      Throws:
      InterruptedException
      org.apache.zookeeper.KeeperException
    • clean

      public void clean(String path, Predicate<String> nodeFilter) throws InterruptedException, org.apache.zookeeper.KeeperException
      Throws:
      InterruptedException
      org.apache.zookeeper.KeeperException
    • upConfig

      public void upConfig(Path confPath, String confName) throws IOException
      Throws:
      IOException
    • listZnode

      public String listZnode(String path, Boolean recurse) throws org.apache.zookeeper.KeeperException, InterruptedException
      Throws:
      org.apache.zookeeper.KeeperException
      InterruptedException
    • downConfig

      public void downConfig(String confName, Path confPath) throws IOException
      Throws:
      IOException
    • zkTransfer

      public void zkTransfer(String src, Boolean srcIsZk, String dst, Boolean dstIsZk, Boolean recurse) throws org.apache.solr.client.solrj.SolrServerException, org.apache.zookeeper.KeeperException, InterruptedException, IOException
      Throws:
      org.apache.solr.client.solrj.SolrServerException
      org.apache.zookeeper.KeeperException
      InterruptedException
      IOException
    • moveZnode

      public void moveZnode(String src, String dst) throws org.apache.solr.client.solrj.SolrServerException, org.apache.zookeeper.KeeperException, InterruptedException
      Throws:
      org.apache.solr.client.solrj.SolrServerException
      org.apache.zookeeper.KeeperException
      InterruptedException
    • uploadToZK

      public void uploadToZK(Path rootPath, String zkPath, Pattern filenameExclusions) throws IOException
      Throws:
      IOException
    • downloadFromZK

      public void downloadFromZK(String zkPath, Path dir) throws IOException
      Throws:
      IOException