Class ZkController

  • All Implemented Interfaces:
    Closeable, AutoCloseable

    public class ZkController
    extends Object
    implements Closeable
    Handle ZooKeeper interactions.

    notes: loads everything on init, creates what's not there - further updates are prompted with Watches.

    TODO: exceptions during close on attempts to update cloud state

    • Method Detail

      • getLeaderVoteWait

        public int getLeaderVoteWait()
      • getLeaderConflictResolveWait

        public int getLeaderConflictResolveWait()
      • close

        public void close()
        Closes the underlying ZooKeeper client.
        Specified by:
        close in interface AutoCloseable
        Specified by:
        close in interface Closeable
      • configFileExists

        public boolean configFileExists​(String collection,
                                        String fileName)
                                 throws org.apache.zookeeper.KeeperException,
                                        InterruptedException
        Returns true if config file exists
        Throws:
        org.apache.zookeeper.KeeperException
        InterruptedException
      • getClusterState

        public ClusterState getClusterState()
        Returns:
        information about the cluster from ZooKeeper
      • getConfigFileData

        public byte[] getConfigFileData​(String zkConfigName,
                                        String fileName)
                                 throws org.apache.zookeeper.KeeperException,
                                        InterruptedException
        Returns config file data (in bytes)
        Throws:
        org.apache.zookeeper.KeeperException
        InterruptedException
      • getHostName

        public String getHostName()
      • getHostPort

        public int getHostPort()
      • getZkServerAddress

        public String getZkServerAddress()
        Returns:
        zookeeper server address
      • createClusterZkNodes

        public static void createClusterZkNodes​(SolrZkClient zkClient)
                                         throws org.apache.zookeeper.KeeperException,
                                                InterruptedException,
                                                IOException
        Create the zknodes necessary for a cluster to operate
        Parameters:
        zkClient - a SolrZkClient
        Throws:
        org.apache.zookeeper.KeeperException - if there is a Zookeeper error
        InterruptedException - on interrupt
        IOException
      • publishAndWaitForDownStates

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

        public void publishAndWaitForDownStates​(int timeoutSeconds)
                                         throws org.apache.zookeeper.KeeperException,
                                                InterruptedException
        Throws:
        org.apache.zookeeper.KeeperException
        InterruptedException
      • checkChrootPath

        public static boolean checkChrootPath​(String zkHost,
                                              boolean create)
                                       throws org.apache.zookeeper.KeeperException,
                                              InterruptedException
        Validates if the chroot exists in zk (or if it is successfully created). Optionally, if create is set to true this method will create the path in case it doesn't exist
        Returns:
        true if the path exists or is created false if the path doesn't exist and 'create' = false
        Throws:
        org.apache.zookeeper.KeeperException
        InterruptedException
      • isConnected

        public boolean isConnected()
      • getNodeName

        public String getNodeName()
      • register

        public String register​(String coreName,
                               CoreDescriptor desc,
                               boolean recoverReloadedCores,
                               boolean afterExpiration,
                               boolean skipRecovery)
                        throws Exception
        Register shard with ZooKeeper.
        Returns:
        the shardId for the SolrCore
        Throws:
        Exception
      • stopReplicationFromLeader

        public void stopReplicationFromLeader​(String coreName)
      • getBaseUrl

        public String getBaseUrl()
      • clearZkCollectionTerms

        public void clearZkCollectionTerms()
      • preRegister

        public void preRegister​(CoreDescriptor cd,
                                boolean publishState)
      • getOverseerRunningMap

        public DistributedMap getOverseerRunningMap()
      • getOverseerCompletedMap

        public DistributedMap getOverseerCompletedMap()
      • getOverseerFailureMap

        public DistributedMap getOverseerFailureMap()
      • claimAsyncId

        public boolean claimAsyncId​(String asyncId)
                             throws org.apache.zookeeper.KeeperException
        When an operation needs to be performed in an asynchronous mode, the asyncId needs to be claimed by calling this method to make sure it's not duplicate (hasn't been claimed by other request). If this method returns true, the asyncId in the parameter has been reserved for the operation, meaning that no other thread/operation can claim it. If for whatever reason, the operation is not scheduled, the asuncId needs to be cleared using clearAsyncId(String). If this method returns false, no reservation has been made, and this asyncId can't be used, since it's being used by another operation (currently or in the past)
        Parameters:
        asyncId - A string representing the asyncId of an operation. Can't be null.
        Returns:
        True if the reservation succeeds. False if this ID is already in use.
        Throws:
        org.apache.zookeeper.KeeperException
      • clearAsyncId

        public boolean clearAsyncId​(String asyncId)
                             throws org.apache.zookeeper.KeeperException
        Clears an asyncId previously claimed by calling claimAsyncId(String)
        Parameters:
        asyncId - A string representing the asyncId of an operation. Can't be null.
        Returns:
        True if the asyncId existed and was cleared. False if the asyncId didn't exist before.
        Throws:
        org.apache.zookeeper.KeeperException
      • getClientTimeout

        public int getClientTimeout()
      • getOverseer

        public Overseer getOverseer()
      • trimLeadingAndTrailingSlashes

        public static String trimLeadingAndTrailingSlashes​(String in)
        Utility method for trimming and leading and/or trailing slashes from its input. May return the empty string. May return null if and only if the input is null.
      • rejoinOverseerElection

        public void rejoinOverseerElection​(String electionNode,
                                           boolean joinAtHead)
      • rejoinShardLeaderElection

        public void rejoinShardLeaderElection​(SolrParams params)
      • checkOverseerDesignate

        public void checkOverseerDesignate()
      • ensureReplicaInLeaderInitiatedRecovery

        @Deprecated
        public boolean ensureReplicaInLeaderInitiatedRecovery​(CoreContainer container,
                                                              String collection,
                                                              String shardId,
                                                              ZkCoreNodeProps replicaCoreProps,
                                                              CoreDescriptor leaderCd,
                                                              boolean forcePublishState)
                                                       throws org.apache.zookeeper.KeeperException,
                                                              InterruptedException
        Deprecated.
        When a leader receives a communication error when trying to send a request to a replica, it calls this method to ensure the replica enters recovery when connectivity is restored.

        returns true if the node hosting the replica is still considered "live" by ZooKeeper; false means the node is not live either, so no point in trying to send recovery commands to it.

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

        @Deprecated
        public boolean isReplicaInRecoveryHandling​(String replicaUrl)
        Deprecated.
      • removeReplicaFromLeaderInitiatedRecoveryHandling

        @Deprecated
        public void removeReplicaFromLeaderInitiatedRecoveryHandling​(String replicaUrl)
        Deprecated.
      • getLeaderInitiatedRecoveryZnodePath

        @Deprecated
        public static String getLeaderInitiatedRecoveryZnodePath​(String collection,
                                                                 String shardId)
        Deprecated.
      • getLeaderInitiatedRecoveryZnodePath

        @Deprecated
        public static String getLeaderInitiatedRecoveryZnodePath​(String collection,
                                                                 String shardId,
                                                                 String coreNodeName)
        Deprecated.
      • throwErrorIfReplicaReplaced

        public void throwErrorIfReplicaReplaced​(CoreDescriptor desc)
      • addOnReconnectListener

        public void addOnReconnectListener​(OnReconnect listener)
        Add a listener to be notified once there is a new session created after a ZooKeeper session expiration occurs; in most cases, listeners will be components that have watchers that need to be re-created.
      • removeOnReconnectListener

        public void removeOnReconnectListener​(OnReconnect listener)
        Removed a previously registered OnReconnect listener, such as when a core is removed or reloaded.
      • persistConfigResourceToZooKeeper

        public static int persistConfigResourceToZooKeeper​(ZkSolrResourceLoader zkLoader,
                                                           int znodeVersion,
                                                           String resourceName,
                                                           byte[] content,
                                                           boolean createIfNotExists)
        Persists a config file to ZooKeeper using optimistic concurrency.
        Returns:
        true on success
      • registerConfListenerForCore

        public void registerConfListenerForCore​(String confDir,
                                                SolrCore core,
                                                Runnable listener)
        This will give a callback to the listener whenever a child is modified in the conf directory. It is the responsibility of the listener to check if the individual item of interest has been modified. When the last core which was interested in this conf directory is gone the listeners will be removed automatically.
      • getConfigDirListener

        public OnReconnect getConfigDirListener()
      • checkIfCoreNodeNameAlreadyExists

        public boolean checkIfCoreNodeNameAlreadyExists​(CoreDescriptor dcore)
      • publishNodeAsDown

        public void publishNodeAsDown​(String nodeName)
        Best effort to set DOWN state for all replicas on node.
        Parameters:
        nodeName - to operate on