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

Fields
Modifier and Type
Field
Description
`protected BufferedOutputStream`
`bufferedOutput`
`static final boolean`
`closeSocketAsync`
`protected MultipleAddresses`
`leaderAddr`
`protected InputArchive`
`leaderIs`
`protected OutputArchive`
`leaderOs`
`protected int`
`leaderProtocolVersion`
the protocol version of the leader
`static final String`
`LEARNER_ASYNC_SENDING`
`static final String`
`LEARNER_CLOSE_SOCKET_ASYNC`
`protected static final org.slf4j.Logger`
`LOG`
`protected final MessageTracker`
`messageTracker`
`protected Socket`
`sock`
`protected AtomicBoolean`
`sockBeingClosed`

## Constructor Summary

Constructors
Constructor
Description
`Learner()`

## Method Summary

Modifier and Type
Method
Description
`protected void`
`connectToLeader(MultipleAddresses multiAddr, String hostname)`
Establish a connection with the LearnerMaster found by findLearnerMaster.
`protected Socket`
`createSocket()`
Creating a simple or and SSL socket.
`protected QuorumPeer.QuorumServer`
`findLeader()`
Returns the address of the node we think is the leader.
`protected static boolean`
`getAsyncSending()`
`int`
`getPendingRevalidationsCount()`
`Socket`
`getSocket()`
Socket getter
`protected long`
`nanoTime()`
Overridable helper method to return the System.nanoTime().
`protected void`
`ping(QuorumPacket qp)`
`protected long`
`registerWithLeader(int pktType)`
Once connected to the leader or learner master, perform the handshake protocol to establish a following / observing connection.
`protected void`
`revalidate(QuorumPacket qp)`
`protected static void`
`setAsyncSending(boolean newMode)`
`void`
`shutdown()`
Shutdown the Peer
`protected void`
`sockConnect(Socket sock, InetSocketAddress addr, int timeout)`
Overridable helper method to simply call sock.connect().
`protected void`
`startSendingThread()`
Start thread that will forward any packet in the queue to the leader
`protected void`
`syncWithLeader(long newLeaderZxid)`
Finally, synchronize our history with the Leader (if Follower) or the LearnerMaster (if Observer).

### Methods inherited from class Object

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

## 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:
  - Constant Field Values

### LEARNER_CLOSE_SOCKET_ASYNC

public static final String LEARNER_CLOSE_SOCKET_ASYNC

See Also:
  - Constant Field Values

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