Package org.jgroups.protocols
Class BatchBundler
- java.lang.Object
-
- org.jgroups.protocols.NoBundler
-
- org.jgroups.protocols.BatchBundler
-
- All Implemented Interfaces:
Bundler
public class BatchBundler extends NoBundler
Bundler based onBATCH
. Batches messages, keeping amax_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 everyflush_interval
milliseconds, sending messages whose size hasn't yet reached max_size.
Contrary toTransferQueueBundler
, which maintains a max_size for all messages,BatchBundler
maintains it for every destination separately. This causes batches to be fuller than withTransferQueueBundler
: 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
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description protected class
BatchBundler.Buffer
protected class
BatchBundler.FlushTask
-
Field Summary
Fields Modifier and Type Field Description protected long
flush_interval
protected java.util.concurrent.Future<?>
flush_task
protected Address
local_addr
int
max_batch_size
protected int
max_size
Maximum number of bytes for messages to be queued until they are sent.protected java.util.concurrent.ConcurrentMap<Address,BatchBundler.Buffer>
msgMap
protected NullAddress
nullAddress
protected long
num_ebs_sent
protected long
num_ebs_sent_due_to_full_queue
protected long
num_ebs_sent_due_to_max_number_of_msgs
protected long
num_ebs_sent_due_to_timeout
protected long
num_msgs_sent
protected boolean
running
protected TimeScheduler
timer
-
Constructor Summary
Constructors Constructor Description BatchBundler()
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected void
_send(Message msg, ByteArrayDataOutputStream out)
double
avgBatchSize()
void
flush()
int
getCapacity()
If the bundler implementation supports a capacity (e.g.int
getMaxSize()
Maximum number of bytes for messages to be queued until they are sentint
getQueueSize()
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.void
init(TP transport)
Called after creation of the bundlervoid
resetStats()
void
send(Message msg)
Bundler
setMaxSize(int s)
int
size()
The number of unsent messages in the bundlervoid
start()
Called afterBundler.init(TP)
protected void
startFlushTask()
void
stop()
protected void
stopFlushTask()
void
viewChange(View view)
-
Methods inherited from class org.jgroups.protocols.NoBundler
sendSingleMessage
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface org.jgroups.protocols.Bundler
renameThread
-
-
-
-
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
-
msgMap
protected java.util.concurrent.ConcurrentMap<Address,BatchBundler.Buffer> msgMap
-
nullAddress
protected final NullAddress nullAddress
-
timer
protected TimeScheduler timer
-
running
protected volatile boolean running
-
flush_task
protected java.util.concurrent.Future<?> flush_task
-
-
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
-
start
public void start()
Description copied from interface:Bundler
Called afterBundler.init(TP)
-
send
public void send(Message msg) throws java.lang.Exception
-
size
public int size()
Description copied from interface:Bundler
The number of unsent messages in the bundler
-
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 interfaceBundler
- Overrides:
getQueueSize
in classNoBundler
-
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 interfaceBundler
- Overrides:
getMaxSize
in classNoBundler
-
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()
-
-