Class Learner

java.lang.Object
org.apache.zookeeper.server.quorum.Learner
Direct Known Subclasses:
Follower, Observer

public class Learner extends Object
This class is the superclass of two of the three main actors in a ZK ensemble: Followers and Observers. Both Followers and Observers share a good deal of code which is moved into Peer to avoid duplication.
  • Field Details

    • bufferedOutput

      protected BufferedOutputStream bufferedOutput
    • sock

      protected Socket sock
    • leaderAddr

      protected MultipleAddresses leaderAddr
    • sockBeingClosed

      protected AtomicBoolean sockBeingClosed
    • leaderIs

      protected InputArchive leaderIs
    • leaderOs

      protected OutputArchive leaderOs
    • leaderProtocolVersion

      protected int leaderProtocolVersion
      the protocol version of the leader
    • messageTracker

      protected final MessageTracker messageTracker
    • LOG

      protected static final org.slf4j.Logger LOG
    • LEARNER_ASYNC_SENDING

      public static final String LEARNER_ASYNC_SENDING
      See Also:
    • LEARNER_CLOSE_SOCKET_ASYNC

      public static final String LEARNER_CLOSE_SOCKET_ASYNC
      See Also:
    • closeSocketAsync

      public static final boolean closeSocketAsync
  • Constructor Details

    • Learner

      public Learner()
  • Method Details

    • getSocket

      public Socket getSocket()
      Socket getter
    • getPendingRevalidationsCount

      public int getPendingRevalidationsCount()
    • setAsyncSending

      protected static void setAsyncSending(boolean newMode)
    • getAsyncSending

      protected static boolean getAsyncSending()
    • startSendingThread

      protected void startSendingThread()
      Start thread that will forward any packet in the queue to the leader
    • findLeader

      protected QuorumPeer.QuorumServer findLeader()
      Returns the address of the node we think is the leader.
    • nanoTime

      protected long nanoTime()
      Overridable helper method to return the System.nanoTime(). This method behaves identical to System.nanoTime().
    • sockConnect

      protected void sockConnect(Socket sock, InetSocketAddress addr, int timeout) throws IOException
      Overridable helper method to simply call sock.connect(). This can be overridden in tests to fake connection success/failure for connectToLeader.
      Throws:
      IOException
    • connectToLeader

      protected void connectToLeader(MultipleAddresses multiAddr, String hostname) throws IOException
      Establish a connection with the LearnerMaster found by findLearnerMaster. Followers only connect to Leaders, Observers can connect to any active LearnerMaster. Retries until either initLimit time has elapsed or 5 tries have happened.
      Parameters:
      multiAddr - - the address of the Peer to connect to.
      Throws:
      IOException - - if the socket connection fails on the 5th attempt if there is an authentication failure while connecting to leader
    • createSocket

      protected Socket createSocket() throws X509Exception, IOException
      Creating a simple or and SSL socket. This can be overridden in tests to fake already connected sockets for connectToLeader.
      Throws:
      X509Exception
      IOException
    • registerWithLeader

      protected long registerWithLeader(int pktType) throws IOException
      Once connected to the leader or learner master, perform the handshake protocol to establish a following / observing connection.
      Parameters:
      pktType -
      Returns:
      the zxid the Leader sends for synchronization purposes.
      Throws:
      IOException
    • syncWithLeader

      protected void syncWithLeader(long newLeaderZxid) throws Exception
      Finally, synchronize our history with the Leader (if Follower) or the LearnerMaster (if Observer).
      Parameters:
      newLeaderZxid -
      Throws:
      IOException
      InterruptedException
      Exception
    • revalidate

      protected void revalidate(QuorumPacket qp) throws IOException
      Throws:
      IOException
    • ping

      protected void ping(QuorumPacket qp) throws IOException
      Throws:
      IOException
    • shutdown

      public void shutdown()
      Shutdown the Peer