int getSealedBufferWatermark() { long state = getState(); Preconditions.checkState(isSealed(state)); return bufferWatermark(state); }
/** * Returns the buffer offset at which the caller has reserved the ability to write `size` bytes exclusively, * or negative number, if the reservation attempt failed. */ private int tryReserveEventSizeAndLock(long state, int size) { Preconditions.checkArgument(size > 0); int bufferWatermark = bufferWatermark(state); while (true) { if (compareAndSetState(state, state + size + PARTY)) { return bufferWatermark; } state = getState(); if (isSealed(state)) { return -1; } bufferWatermark = bufferWatermark(state); int newBufferWatermark = bufferWatermark + size; Preconditions.checkState(newBufferWatermark > 0); if (newBufferWatermark > emitter.maxBufferWatermark) { return -1; } } }
@Override public String toString() { long state = getState(); return "Batch{" + "batchNumber=" + batchNumber + ", bufferWatermark=" + bufferWatermark(state) + ", parties=" + parties(state) + ", isSealed=" + isSealed(state) + "}"; }
private static void debugLogState(String name, long state) { if (log.isDebugEnabled()) { log.debug( "%s[bufferWatermark=%d, parties=%d, isSealed=%s]", name, bufferWatermark(state), parties(state), isSealed(state) ); } } }
/** * Tries to add (write) event to the batch, returns true, if successful. If fails, no subsequent attempts to add event * to this batch will succeed, the next batch should be taken. */ boolean tryAddEvent(byte[] event) { while (true) { long state = getState(); if (isSealed(state)) { return false; } int bufferWatermark = bufferWatermark(state); if (bufferWatermark == 0) { if (tryAddFirstEvent(event)) { return true; } } else if (newBufferWatermark(bufferWatermark, event) <= emitter.maxBufferWatermark) { if (tryAddNonFirstEvent(state, event)) { return true; } } else { seal(); return false; } } }
int getSealedBufferWatermark() { long state = getState(); Preconditions.checkState(isSealed(state)); return bufferWatermark(state); }
/** * Returns the buffer offset at which the caller has reserved the ability to write `size` bytes exclusively, * or negative number, if the reservation attempt failed. */ private int tryReserveEventSizeAndLock(long state, int size) { Preconditions.checkArgument(size > 0); int bufferWatermark = bufferWatermark(state); while (true) { if (compareAndSetState(state, state + size + PARTY)) { return bufferWatermark; } state = getState(); if (isSealed(state)) { return -1; } bufferWatermark = bufferWatermark(state); int newBufferWatermark = bufferWatermark + size; Preconditions.checkState(newBufferWatermark > 0); if (newBufferWatermark > emitter.maxBufferWatermark) { return -1; } } }
@Override public String toString() { long state = getState(); return "Batch{" + "batchNumber=" + batchNumber + ", bufferWatermark=" + bufferWatermark(state) + ", parties=" + parties(state) + ", isSealed=" + isSealed(state) + "}"; }
private static void debugLogState(String name, long state) { if (log.isDebugEnabled()) { log.debug( "%s[bufferWatermark=%d, parties=%d, isSealed=%s]", name, bufferWatermark(state), parties(state), isSealed(state) ); } } }
/** * Tries to add (write) event to the batch, returns true, if successful. If fails, no subsequent attempts to add event * to this batch will succeed, the next batch should be taken. */ boolean tryAddEvent(byte[] event) { while (true) { long state = getState(); if (isSealed(state)) { return false; } int bufferWatermark = bufferWatermark(state); if (bufferWatermark == 0) { if (tryAddFirstEvent(event)) { return true; } } else if (newBufferWatermark(bufferWatermark, event) <= emitter.maxBufferWatermark) { if (tryAddNonFirstEvent(state, event)) { return true; } } else { seal(); return false; } } }