Class BatchBundler

java.lang.Object
org.jgroups.protocols.NoBundler
org.jgroups.protocols.BatchBundler
All Implemented Interfaces:
Bundler

public class BatchBundler extends NoBundler
Bundler based on BATCH. Batches messages, keeping a max_size for every destination. When the accumulated size of the messages for a given destination P would exceed max_bytes, a MessageBatch is created and sent to P.

Additionally, a timer runs every flush_interval milliseconds, sending messages whose size hasn't yet reached max_size.

Contrary to TransferQueueBundler, which maintains a max_size for all messages, BatchBundler maintains it for every destination separately. This causes batches to be fuller than with TransferQueueBundler: assuming 4 members, everyone sending to everyone else, and max_size = 60000: with TransferQueueBundler, a batch is sent with ~15'000 bytes of messages (60'000/4), but with BatchBundler, it has ~60'000 bytes. Fuller batches means more amortization of costs of handling single messages.

Since:
5.2
  • Field Details

    • max_size

      protected int max_size
      Maximum number of bytes for messages to be queued until they are sent. This value needs to be smaller than the largest datagram packet size in case of UDP
    • flush_interval

      protected long flush_interval
    • max_batch_size

      public int max_batch_size
    • local_addr

      protected volatile Address local_addr
    • num_msgs_sent

      protected long num_msgs_sent
    • num_ebs_sent

      protected long num_ebs_sent
    • num_ebs_sent_due_to_full_queue

      protected long num_ebs_sent_due_to_full_queue
    • num_ebs_sent_due_to_max_number_of_msgs

      protected long num_ebs_sent_due_to_max_number_of_msgs
    • num_ebs_sent_due_to_timeout

      protected long num_ebs_sent_due_to_timeout
    • msgMap

    • nullAddress

      protected final NullAddress nullAddress
    • timer

      protected TimeScheduler timer
    • running

      protected volatile boolean running
    • flush_task

      protected Future<?> flush_task
  • Constructor Details

    • BatchBundler

      public BatchBundler()
  • Method Details

    • avgBatchSize

      public double avgBatchSize()
    • resetStats

      public void resetStats()
    • viewChange

      public void viewChange(View view)
    • init

      public void init(TP transport)
      Description copied from interface: Bundler
      Called after creation of the bundler
      Specified by:
      init in interface Bundler
      Overrides:
      init in class NoBundler
      Parameters:
      transport - the transport, for further reference
    • start

      public void start()
      Description copied from interface: Bundler
      Called after Bundler.init(TP)
      Specified by:
      start in interface Bundler
      Overrides:
      start in class NoBundler
    • stop

      public void stop()
      Specified by:
      stop in interface Bundler
      Overrides:
      stop in class NoBundler
    • send

      public void send(Message msg) throws Exception
      Specified by:
      send in interface Bundler
      Overrides:
      send in class NoBundler
      Throws:
      Exception
    • size

      public int size()
      Description copied from interface: Bundler
      The number of unsent messages in the bundler
      Specified by:
      size in interface Bundler
      Overrides:
      size in class NoBundler
    • getQueueSize

      public int getQueueSize()
      Description copied from interface: Bundler
      If the bundler has a queue and it should be managed by a queuing discipline (like Random Early Detection), then return the number of elements in the queue, else -1. In the latter case, the queue won't be managed.

      This method needs to be fast as it might get called on every message to be sent.

      Specified by:
      getQueueSize in interface Bundler
      Overrides:
      getQueueSize in class NoBundler
    • getCapacity

      public int getCapacity()
      Description copied from interface: Bundler
      If the bundler implementation supports a capacity (e.g. RingBufferBundler, then return it, else return -1
    • getMaxSize

      public int getMaxSize()
      Description copied from interface: Bundler
      Maximum number of bytes for messages to be queued until they are sent
      Specified by:
      getMaxSize in interface Bundler
      Overrides:
      getMaxSize in class NoBundler
    • setMaxSize

      public Bundler setMaxSize(int s)
    • startFlushTask

      protected void startFlushTask()
    • stopFlushTask

      protected void stopFlushTask()
    • _send

      protected void _send(Message msg, ByteArrayDataOutputStream out)
    • flush

      public void flush()