Package org.jgroups.util
Class FixedBuffer<T>
- java.lang.Object
-
- org.jgroups.util.Buffer<T>
-
- org.jgroups.util.FixedBuffer<T>
-
- All Implemented Interfaces:
java.io.Closeable
,java.lang.AutoCloseable
,java.lang.Iterable<T>
public class FixedBuffer<T> extends Buffer<T>
Ring buffer of fixed capacity. Indices low and high point to the beginning and end of the buffer. Sequence numbers (seqnos) are mapped to an index byseqno % capacity
. High can never pass low, and drops the element or blocks when that's the case.
Note that 'null' is not a valid element, but signifies a missing element
The design is described in doc/design/FixedBuffer.txt.- Since:
- 5.4
- Author:
- Bela Ban
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description protected class
FixedBuffer.FixedBufferIterator
-
Nested classes/interfaces inherited from class org.jgroups.util.Buffer
Buffer.HighestDeliverable, Buffer.Missing, Buffer.NumDeliverable, Buffer.Options, Buffer.Remover<R>, Buffer.Visitor<T>
-
-
Field Summary
Fields Modifier and Type Field Description protected AverageMinMax
avg_time_blocked
protected T[]
buf
Holds the elementsprotected java.util.concurrent.locks.Condition
buffer_full
protected java.util.concurrent.atomic.LongAdder
num_blockings
protected java.util.concurrent.atomic.LongAdder
num_dropped_msgs
Number of received messages dropped due to full bufferprotected boolean
open
Used to unblock blocked senders on close().
-
Constructor Summary
Constructors Constructor Description FixedBuffer()
FixedBuffer(int capacity, long offset)
Creates a RingBufferFixedBuffer(long offset)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description T
_get(long seqno)
Only used for testing !!boolean
add(long seqno, T element, java.util.function.Predicate<T> remove_filter, Buffer.Options opts, boolean dont_block)
Adds an element if the element at the given index is null.boolean
add(java.util.List<LongTuple<T>> list, boolean remove_added_elements, T const_value)
Adds elements from the listboolean
add(MessageBatch batch, java.util.function.Function<T,java.lang.Long> seqno_getter, boolean remove_from_batch, T const_value)
AverageMinMax
avgTimeBlocked()
protected boolean
block(long seqno)
int
capacity()
Returns the current capacity in the buffer.void
changeCapacity(int new_capacity)
Changes the size of the buffer.protected void
decreaseCapacity(int new_cap)
void
forEach(long from, long to, Buffer.Visitor<T> visitor, boolean nullify)
void
forEach(long from, long to, Buffer.Visitor<T> visitor, boolean nullify, boolean respect_stop)
T
get(long seqno)
protected void
increaseCapacity(int new_cap)
protected int
index(long seqno)
java.util.Iterator<T>
iterator()
Returns an iterator over the elements of the ring buffer in the range [LOW+1 ..java.util.Iterator<T>
iterator(long from, long to)
long
numBlockings()
long
numDroppedMessages()
void
open(boolean b)
int
purge(long seqno, boolean force)
Purges (nulls) all elements <= seqno.T
remove(boolean nullify)
Removes the next non-null element and advances hdjava.util.List<T>
removeMany(boolean nullify, int max_results, java.util.function.Predicate<T> filter)
<R> R
removeMany(boolean nullify, int max_results, java.util.function.Predicate<T> filter, java.util.function.Supplier<R> result_creator, java.util.function.BiConsumer<R,T> accumulator)
void
resetStats()
java.util.stream.Stream<T>
stream()
java.util.stream.Stream<T>
stream(long from, long to)
-
Methods inherited from class org.jgroups.util.Buffer
add, close, computeSize, dump, forEach, getAdders, getDigest, getHighestDeliverable, getMissing, getMissing, getNumDeliverable, hd, high, highestDelivered, highestDelivered, isEmpty, lock, low, numMissing, offset, purge, remove, removeMany, size, toString
-
-
-
-
Field Detail
-
buf
protected T[] buf
Holds the elements
-
buffer_full
protected final java.util.concurrent.locks.Condition buffer_full
-
open
protected boolean open
Used to unblock blocked senders on close(). When false, senders don't block when full but discard element
-
num_blockings
protected final java.util.concurrent.atomic.LongAdder num_blockings
-
avg_time_blocked
protected final AverageMinMax avg_time_blocked
-
num_dropped_msgs
protected final java.util.concurrent.atomic.LongAdder num_dropped_msgs
Number of received messages dropped due to full buffer
-
-
Constructor Detail
-
FixedBuffer
public FixedBuffer()
-
FixedBuffer
public FixedBuffer(long offset)
-
FixedBuffer
public FixedBuffer(int capacity, long offset)
Creates a RingBuffer- Parameters:
capacity
- The number of elements the ring buffer's array should hold.offset
- The offset. The first element to be added has to be offset +1.
-
-
Method Detail
-
capacity
public int capacity()
Description copied from class:Buffer
Returns the current capacity in the buffer. This value is fixed in a fixed-size buffer (e.g.FixedBuffer
), but can change in a dynamic buffer (DynamicBuffer
)
-
numBlockings
public long numBlockings()
-
avgTimeBlocked
public AverageMinMax avgTimeBlocked()
-
numDroppedMessages
public long numDroppedMessages()
-
add
public boolean add(long seqno, T element, java.util.function.Predicate<T> remove_filter, Buffer.Options opts, boolean dont_block)
Description copied from class:Buffer
Adds an element if the element at the given index is null. Returns true if no element existed at the given index, else returns false and doesn't set the element.- Specified by:
add
in classBuffer<T>
- Parameters:
seqno
- The seqno of the elementelement
- The element to be addedremove_filter
- A filter used to remove all consecutive messages passing the filter (and non-null). This doesn't necessarily null a removed message, but may simply advance an index (e.g. highest delivered). Ignored if null.opts
- The options passed to the calldont_block
- If true, don't block when no space is available, but instead drop the element. This parameter is set by calling Message.isFlagSet(DONT_BLOCK)- Returns:
- True if the element at the computed index was null, else false
-
add
public boolean add(MessageBatch batch, java.util.function.Function<T,java.lang.Long> seqno_getter, boolean remove_from_batch, T const_value)
-
add
public boolean add(java.util.List<LongTuple<T>> list, boolean remove_added_elements, T const_value)
Description copied from class:Buffer
Adds elements from the list- Specified by:
add
in classBuffer<T>
- Parameters:
list
- The list of tuples of seqnos and elements. If remove_added_elements is true, if elements could not be added (e.g. because they were already present or the seqno was < HD), those elements will be removed from listremove_added_elements
- If true, elements that could not be added to the table are removed from listconst_value
- If non-null, this value should be used rather than the values of the list tuples- Returns:
- True if at least 1 element was added successfully, false otherwise.
-
remove
public T remove(boolean nullify)
Removes the next non-null element and advances hd
-
removeMany
public java.util.List<T> removeMany(boolean nullify, int max_results, java.util.function.Predicate<T> filter)
- Specified by:
removeMany
in classBuffer<T>
-
removeMany
public <R> R removeMany(boolean nullify, int max_results, java.util.function.Predicate<T> filter, java.util.function.Supplier<R> result_creator, java.util.function.BiConsumer<R,T> accumulator)
- Specified by:
removeMany
in classBuffer<T>
-
purge
public int purge(long seqno, boolean force)
Description copied from class:Buffer
Purges (nulls) all elements <= seqno.
-
changeCapacity
public void changeCapacity(int new_capacity)
Changes the size of the buffer. This method should NOT be used; it is only here to change config in perf tests dynamically!!
-
forEach
public void forEach(long from, long to, Buffer.Visitor<T> visitor, boolean nullify)
-
forEach
public void forEach(long from, long to, Buffer.Visitor<T> visitor, boolean nullify, boolean respect_stop)
-
resetStats
public void resetStats()
- Overrides:
resetStats
in classBuffer<T>
-
iterator
public java.util.Iterator<T> iterator()
Returns an iterator over the elements of the ring buffer in the range [LOW+1 .. HIGH]- Returns:
- FixedBufferIterator
- Throws:
java.util.NoSuchElementException
- is HD is moved forward during the iteration
-
iterator
public java.util.Iterator<T> iterator(long from, long to)
-
stream
public java.util.stream.Stream<T> stream(long from, long to)
-
index
protected int index(long seqno)
-
block
protected boolean block(long seqno)
-
increaseCapacity
protected void increaseCapacity(int new_cap)
-
decreaseCapacity
protected void decreaseCapacity(int new_cap)
-
-