Class PerChannelBookieClient

java.lang.Object
io.netty.channel.ChannelHandlerAdapter
io.netty.channel.ChannelInboundHandlerAdapter
org.apache.bookkeeper.proto.PerChannelBookieClient
All Implemented Interfaces:
io.netty.channel.ChannelHandler, io.netty.channel.ChannelInboundHandler

@StatsDoc(name="per_channel_bookie_client", help="Per channel bookie client stats") @Sharable public class PerChannelBookieClient extends io.netty.channel.ChannelInboundHandlerAdapter
This class manages all details of connection to a particular bookie. It also has reconnect logic if a connection to a bookie fails.
  • Field Details

    • LOG

      static final org.slf4j.Logger LOG
    • EXPECTED_BK_OPERATION_ERRORS

      protected static final Set<Integer> EXPECTED_BK_OPERATION_ERRORS
    • CONSOLIDATION_HANDLER_NAME

      static final String CONSOLIDATION_HANDLER_NAME
      See Also:
    • bookieId

      final BookieId bookieId
    • bookieAddressResolver

      final BookieAddressResolver bookieAddressResolver
    • eventLoopGroup

      final io.netty.channel.EventLoopGroup eventLoopGroup
    • allocator

      final io.netty.buffer.ByteBufAllocator allocator
    • executor

      final OrderedExecutor executor
    • addEntryTimeoutNanos

      final long addEntryTimeoutNanos
    • readEntryTimeoutNanos

      final long readEntryTimeoutNanos
    • maxFrameSize

      final int maxFrameSize
    • getBookieInfoTimeoutNanos

      final long getBookieInfoTimeoutNanos
    • startTLSTimeout

      final int startTLSTimeout
    • readEntryOpLogger

      @StatsDoc(name="READ_ENTRY", help="channel stats of read entries requests") protected final OpStatsLogger readEntryOpLogger
    • readTimeoutOpLogger

      @StatsDoc(name="TIMEOUT_READ_ENTRY", help="timeout stats of read entries requests") protected final OpStatsLogger readTimeoutOpLogger
    • addEntryOpLogger

      @StatsDoc(name="ADD_ENTRY", help="channel stats of add entries requests") protected final OpStatsLogger addEntryOpLogger
    • writeLacOpLogger

      @StatsDoc(name="WRITE_LAC", help="channel stats of write_lac requests") protected final OpStatsLogger writeLacOpLogger
    • forceLedgerOpLogger

      @StatsDoc(name="FORCE", help="channel stats of force requests") protected final OpStatsLogger forceLedgerOpLogger
    • readLacOpLogger

      @StatsDoc(name="READ_LAC", help="channel stats of read_lac requests") protected final OpStatsLogger readLacOpLogger
    • addTimeoutOpLogger

      @StatsDoc(name="TIMEOUT_ADD_ENTRY", help="timeout stats of add entries requests") protected final OpStatsLogger addTimeoutOpLogger
    • writeLacTimeoutOpLogger

      @StatsDoc(name="TIMEOUT_WRITE_LAC", help="timeout stats of write_lac requests") protected final OpStatsLogger writeLacTimeoutOpLogger
    • forceLedgerTimeoutOpLogger

      @StatsDoc(name="TIMEOUT_FORCE", help="timeout stats of force requests") protected final OpStatsLogger forceLedgerTimeoutOpLogger
    • readLacTimeoutOpLogger

      @StatsDoc(name="TIMEOUT_READ_LAC", help="timeout stats of read_lac requests") protected final OpStatsLogger readLacTimeoutOpLogger
    • getBookieInfoOpLogger

      @StatsDoc(name="GET_BOOKIE_INFO", help="channel stats of get_bookie_info requests") protected final OpStatsLogger getBookieInfoOpLogger
    • getBookieInfoTimeoutOpLogger

      @StatsDoc(name="TIMEOUT_GET_BOOKIE_INFO", help="timeout stats of get_bookie_info requests") protected final OpStatsLogger getBookieInfoTimeoutOpLogger
    • startTLSOpLogger

      @StatsDoc(name="START_TLS", help="channel stats of start_tls requests") protected final OpStatsLogger startTLSOpLogger
    • startTLSTimeoutOpLogger

      @StatsDoc(name="TIMEOUT_START_TLS", help="timeout stats of start_tls requests") protected final OpStatsLogger startTLSTimeoutOpLogger
    • getListOfEntriesOfLedgerCompletionOpLogger

      protected final OpStatsLogger getListOfEntriesOfLedgerCompletionOpLogger
    • getListOfEntriesOfLedgerCompletionTimeoutOpLogger

      protected final OpStatsLogger getListOfEntriesOfLedgerCompletionTimeoutOpLogger
    • addEntryOutstanding

      @StatsDoc(name="ADD_OP_OUTSTANDING", help="the number of outstanding add_entry requests") protected final Counter addEntryOutstanding
    • readEntryOutstanding

      @StatsDoc(name="READ_OP_OUTSTANDING", help="the number of outstanding add_entry requests") protected final Counter readEntryOutstanding
    • preserveMdcForTaskExecution

      protected final boolean preserveMdcForTaskExecution
    • channel

      volatile io.netty.channel.Channel channel
    • state

    • closeLock

      final ReentrantReadWriteLock closeLock
    • conf

      protected final ClientConfiguration conf
  • Constructor Details

  • Method Details

    • getNumPendingCompletionRequests

      protected long getNumPendingCompletionRequests()
    • connect

      protected io.netty.channel.ChannelFuture connect()
    • addChannelListeners

      protected void addChannelListeners(io.netty.channel.ChannelFuture future, long connectStartTime)
    • cleanDisconnectAndClose

      void cleanDisconnectAndClose()
    • isWritable

      public boolean isWritable()
      Returns:
      boolean, true is PCBC is writable
    • setWritable

      public void setWritable(boolean val)
    • connectIfNeededAndDoOp

    • writeLac

      void writeLac(long ledgerId, byte[] masterKey, long lac, ByteBufList toSend, BookkeeperInternalCallbacks.WriteLacCallback cb, Object ctx)
    • forceLedger

      void forceLedger(long ledgerId, BookkeeperInternalCallbacks.ForceLedgerCallback cb, Object ctx)
    • addEntry

      void addEntry(long ledgerId, byte[] masterKey, long entryId, io.netty.util.ReferenceCounted toSend, BookkeeperInternalCallbacks.WriteCallback cb, Object ctx, int options, boolean allowFastFail, EnumSet<WriteFlag> writeFlags)
      This method should be called only after connection has been checked for connectIfNeededAndDoOp(GenericCallback).
      Parameters:
      ledgerId - Ledger Id
      masterKey - Master Key
      entryId - Entry Id
      toSend - Buffer to send
      cb - Write callback
      ctx - Write callback context
      allowFastFail - allowFastFail flag
      writeFlags - WriteFlags
    • readLac

      public void readLac(long ledgerId, BookkeeperInternalCallbacks.ReadLacCallback cb, Object ctx)
    • getListOfEntriesOfLedger

      public void getListOfEntriesOfLedger(long ledgerId, BookkeeperInternalCallbacks.GetListOfEntriesOfLedgerCallback cb)
    • readEntryWaitForLACUpdate

      public void readEntryWaitForLACUpdate(long ledgerId, long entryId, long previousLAC, long timeOutInMillis, boolean piggyBackEntry, BookkeeperInternalCallbacks.ReadEntryCallback cb, Object ctx)
      Long Poll Reads.
    • readEntry

      public void readEntry(long ledgerId, long entryId, BookkeeperInternalCallbacks.ReadEntryCallback cb, Object ctx, int flags, byte[] masterKey, boolean allowFastFail)
      Normal Reads.
    • batchReadEntries

      public void batchReadEntries(long ledgerId, long startEntryId, int maxCount, long maxSize, BookkeeperInternalCallbacks.BatchedReadEntryCallback cb, Object ctx, int flags, byte[] masterKey, boolean allowFastFail)
    • getBookieInfo

      public void getBookieInfo(long requested, BookkeeperInternalCallbacks.GetBookieInfoCallback cb, Object ctx)
    • checkTimeoutOnPendingOperations

      public void checkTimeoutOnPendingOperations()
    • disconnect

      public void disconnect()
      Disconnects the bookie client. It can be reused.
    • disconnect

      public void disconnect(boolean wait)
    • close

      public void close()
      Closes the bookie client permanently. It cannot be reused.
    • close

      public void close(boolean wait)
    • channelWritabilityChanged

      public void channelWritabilityChanged(io.netty.channel.ChannelHandlerContext ctx) throws Exception
      Specified by:
      channelWritabilityChanged in interface io.netty.channel.ChannelInboundHandler
      Overrides:
      channelWritabilityChanged in class io.netty.channel.ChannelInboundHandlerAdapter
      Throws:
      Exception
    • errorOut

      void errorOut(CompletionKey key)
    • errorOut

      void errorOut(CompletionKey key, int rc)
    • errorOutPendingOps

      void errorOutPendingOps(int rc)
      Errors out pending ops from per channel bookie client. As the channel is being closed, all the operations waiting on the connection will be sent to completion with error.
    • errorOutOutstandingEntries

      void errorOutOutstandingEntries(int rc)
      Errors out pending entries. We call this method from one thread to avoid concurrent executions to QuorumOpMonitor (implements callbacks). It seems simpler to call it from BookieHandle instead of calling directly from here.
    • recordError

      void recordError()
    • channelInactive

      public void channelInactive(io.netty.channel.ChannelHandlerContext ctx) throws Exception
      If our channel has disconnected, we just error out the pending entries.
      Specified by:
      channelInactive in interface io.netty.channel.ChannelInboundHandler
      Overrides:
      channelInactive in class io.netty.channel.ChannelInboundHandlerAdapter
      Throws:
      Exception
    • exceptionCaught

      public void exceptionCaught(io.netty.channel.ChannelHandlerContext ctx, Throwable cause) throws Exception
      Called by netty when an exception happens in one of the netty threads (mostly due to what we do in the netty threads).
      Specified by:
      exceptionCaught in interface io.netty.channel.ChannelHandler
      Specified by:
      exceptionCaught in interface io.netty.channel.ChannelInboundHandler
      Overrides:
      exceptionCaught in class io.netty.channel.ChannelInboundHandlerAdapter
      Throws:
      Exception
    • channelRead

      public void channelRead(io.netty.channel.ChannelHandlerContext ctx, Object msg) throws Exception
      Called by netty when a message is received on a channel.
      Specified by:
      channelRead in interface io.netty.channel.ChannelInboundHandler
      Overrides:
      channelRead in class io.netty.channel.ChannelInboundHandlerAdapter
      Throws:
      Exception
    • initTLSHandshake

      void initTLSHandshake()
    • newCompletionKey

      CompletionKey newCompletionKey(long txnId, BookkeeperProtocol.OperationType operationType)
    • withRequestContext

    • appendRequestContext

    • contextPreservingListener

      io.netty.channel.ChannelFutureListener contextPreservingListener(io.netty.channel.ChannelFutureListener listener)
    • failTLS

      protected void failTLS(int rc)