@Override public long tryWrite() { if (eventCount == 0) { if (valueWriter == null) { return 0; } copyExistingEventToBuffer(); } long result = claimBatchForEvents(); if (result >= 0) { try { // return position of last event result = writeEventsToBuffer(claimedBatch.getBuffer()); claimedBatch.commit(); } catch (final Exception e) { claimedBatch.abort(); LangUtil.rethrowUnchecked(e); } finally { reset(); } } return result; }
/** * Commit all fragments of the batch and mark them as failed. They will be ignored by * subscriptions. */ public void abort() { // discard all fragments by set the type to padding int fragmentOffset = 0; while (fragmentOffset < nextOffset) { final int fragmentLength = -buffer.getInt(lengthOffset(fragmentOffset)); buffer.putInt(typeOffset(fragmentOffset), TYPE_PADDING); buffer.putIntOrdered(lengthOffset(fragmentOffset), fragmentLength); fragmentOffset += DataFrameDescriptor.alignedLength(fragmentLength); } fillRemainingBatchSize(); onCompleteHandler.run(); reset(); }
final long nextFragmentPosition = claimedBatch.nextFragment(fragmentLength, logId); final int bufferOffset = claimedBatch.getFragmentOffset();
public int claim( final LogBufferPartition partition, final int activePartitionId, final ClaimedFragmentBatch batch, final int fragmentCount, final int batchLength, final Runnable onComplete) { final int partitionSize = partition.getPartitionSize(); // reserve enough space for frame alignment because each batch fragment must start on an aligned // position final int framedMessageLength = batchLength + fragmentCount * (HEADER_LENGTH + FRAME_ALIGNMENT) + FRAME_ALIGNMENT; final int alignedFrameLength = align(framedMessageLength, FRAME_ALIGNMENT); // move the tail of the partition final int frameOffset = partition.getAndAddTail(alignedFrameLength); int newTail = frameOffset + alignedFrameLength; if (newTail <= (partitionSize - HEADER_LENGTH)) { final UnsafeBuffer buffer = partition.getDataBuffer(); // all fragment data are written using the claimed batch batch.wrap(buffer, activePartitionId, frameOffset, alignedFrameLength, onComplete); } else { newTail = onEndOfPartition(partition, frameOffset); } return newTail; }
final long nextFragmentPosition = claimedBatch.nextFragment(fragmentLength, logId); final int bufferOffset = claimedBatch.getFragmentOffset();
public int claim( final LogBufferPartition partition, final int activePartitionId, final ClaimedFragmentBatch batch, final int fragmentCount, final int batchLength, final Runnable onComplete) { final int partitionSize = partition.getPartitionSize(); // reserve enough space for frame alignment because each batch fragment must start on an aligned // position final int framedMessageLength = batchLength + fragmentCount * (HEADER_LENGTH + FRAME_ALIGNMENT) + FRAME_ALIGNMENT; final int alignedFrameLength = align(framedMessageLength, FRAME_ALIGNMENT); // move the tail of the partition final int frameOffset = partition.getAndAddTail(alignedFrameLength); int newTail = frameOffset + alignedFrameLength; if (newTail <= (partitionSize - HEADER_LENGTH)) { final UnsafeBuffer buffer = partition.getDataBuffer(); // all fragment data are written using the claimed batch batch.wrap(buffer, activePartitionId, frameOffset, alignedFrameLength, onComplete); } else { newTail = onEndOfPartition(partition, frameOffset); } return newTail; }
@Override public long tryWrite() { if (eventCount == 0) { if (valueWriter == null) { return 0; } copyExistingEventToBuffer(); } long result = claimBatchForEvents(); if (result >= 0) { try { // return position of last event result = writeEventsToBuffer(claimedBatch.getBuffer()); claimedBatch.commit(); } catch (final Exception e) { claimedBatch.abort(); LangUtil.rethrowUnchecked(e); } finally { reset(); } } return result; }
/** * Commit all fragments of the batch and mark them as failed. They will be ignored by * subscriptions. */ public void abort() { // discard all fragments by set the type to padding int fragmentOffset = 0; while (fragmentOffset < nextOffset) { final int fragmentLength = -buffer.getInt(lengthOffset(fragmentOffset)); buffer.putInt(typeOffset(fragmentOffset), TYPE_PADDING); buffer.putIntOrdered(lengthOffset(fragmentOffset), fragmentLength); fragmentOffset += DataFrameDescriptor.alignedLength(fragmentLength); } fillRemainingBatchSize(); onCompleteHandler.run(); reset(); }
/** Commit all fragments of the batch so that it can be read by subscriptions. */ public void commit() { final int firstFragmentFramedLength = -buffer.getInt(lengthOffset(FIRST_FRAGMENT_OFFSET)); // do not set batch flags if only one fragment in the batch if (currentOffset > 0) { // set batch begin flag final byte firstFragmentFlags = buffer.getByte(flagsOffset(FIRST_FRAGMENT_OFFSET)); buffer.putByte(flagsOffset(FIRST_FRAGMENT_OFFSET), enableFlagBatchBegin(firstFragmentFlags)); // set positive length => commit fragment int fragmentOffset = DataFrameDescriptor.alignedLength(firstFragmentFramedLength); while (fragmentOffset < nextOffset) { final int fragmentFramedLength = -buffer.getInt(lengthOffset(fragmentOffset)); buffer.putInt(lengthOffset(fragmentOffset), fragmentFramedLength); fragmentOffset += DataFrameDescriptor.alignedLength(fragmentFramedLength); } // set batch end flag final byte lastFragmentFlags = buffer.getByte(flagsOffset(currentOffset)); buffer.putByte(flagsOffset(currentOffset), enableFlagBatchEnd(lastFragmentFlags)); } fillRemainingBatchSize(); // commit the first fragment at the end so that the batch can be read at // once buffer.putIntOrdered(lengthOffset(FIRST_FRAGMENT_OFFSET), firstFragmentFramedLength); onCompleteHandler.run(); reset(); }
/** Commit all fragments of the batch so that it can be read by subscriptions. */ public void commit() { final int firstFragmentFramedLength = -buffer.getInt(lengthOffset(FIRST_FRAGMENT_OFFSET)); // do not set batch flags if only one fragment in the batch if (currentOffset > 0) { // set batch begin flag final byte firstFragmentFlags = buffer.getByte(flagsOffset(FIRST_FRAGMENT_OFFSET)); buffer.putByte(flagsOffset(FIRST_FRAGMENT_OFFSET), enableFlagBatchBegin(firstFragmentFlags)); // set positive length => commit fragment int fragmentOffset = DataFrameDescriptor.alignedLength(firstFragmentFramedLength); while (fragmentOffset < nextOffset) { final int fragmentFramedLength = -buffer.getInt(lengthOffset(fragmentOffset)); buffer.putInt(lengthOffset(fragmentOffset), fragmentFramedLength); fragmentOffset += DataFrameDescriptor.alignedLength(fragmentFramedLength); } // set batch end flag final byte lastFragmentFlags = buffer.getByte(flagsOffset(currentOffset)); buffer.putByte(flagsOffset(currentOffset), enableFlagBatchEnd(lastFragmentFlags)); } fillRemainingBatchSize(); // commit the first fragment at the end so that the batch can be read at // once buffer.putIntOrdered(lengthOffset(FIRST_FRAGMENT_OFFSET), firstFragmentFramedLength); onCompleteHandler.run(); reset(); }