Class 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
    Author:
    Bela Ban
    • Field Detail

      • 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
      • running

        protected volatile boolean running
      • flush_task

        protected java.util.concurrent.Future<?> flush_task
    • Constructor Detail

      • BatchBundler

        public BatchBundler()
    • Method Detail

      • 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
      • send

        public void send​(Message msg)
                  throws java.lang.Exception
        Specified by:
        send in interface Bundler
        Overrides:
        send in class NoBundler
        Throws:
        java.lang.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()
      • flush

        public void flush()