public boolean trySend(Dispatcher sendBuffer) { final int requiredLength = getLength(); long claimedOffset; do { claimedOffset = sendBuffer.claim(claimedFragment, requiredLength, remoteStreamId); } while (claimedOffset == -2); if (claimedOffset >= 0) { try { final MutableDirectBuffer buffer = claimedFragment.getBuffer(); final int writeOffset = claimedFragment.getOffset(); write(buffer, writeOffset); claimedFragment.commit(); return true; } catch (Throwable e) { claimedFragment.abort(); } } return false; }
public boolean isOpen() { return getFragmentLength() > 0; } }
private boolean handleControlMessageRequest( final RecordMetadata eventMetadata, final DirectBuffer buffer, final int messageOffset, final int messageLength) { boolean isHandled = false; long publishPosition; do { publishPosition = controlMessageDispatcher.claim( claimedControlMessageFragment, ControlMessageRequestHeaderDescriptor.framedLength(messageLength)); } while (publishPosition == -2); if (publishPosition >= 0) { final MutableDirectBuffer writeBuffer = claimedControlMessageFragment.getBuffer(); int writeBufferOffset = claimedControlMessageFragment.getOffset(); controlMessageRequestHeaderDescriptor .wrap(writeBuffer, writeBufferOffset) .streamId(eventMetadata.getRequestStreamId()) .requestId(eventMetadata.getRequestId()); writeBufferOffset += ControlMessageRequestHeaderDescriptor.headerLength(); writeBuffer.putBytes(writeBufferOffset, buffer, messageOffset, messageLength); claimedControlMessageFragment.commit(); isHandled = true; } return isHandled; }
protected Answer<?> claimFragment(final long offset) { return invocation -> { final ClaimedFragment claimedFragment = (ClaimedFragment) invocation.getArguments()[0]; final int length = (int) invocation.getArguments()[1]; fragmentOffset = claimedFragment.getOffset(); claimedFragment.wrap(sendBuffer, 0, alignedFramedLength(length), () -> {}); final long claimedPosition = offset + alignedFramedLength(length); return claimedPosition; }; }
@SuppressWarnings("restriction") public int claim( final LogBufferPartition partition, final int activePartitionId, final ClaimedFragment claim, final int length, final int streamId, Runnable onComplete) { final int partitionSize = partition.getPartitionSize(); final int framedMessageLength = framedLength(length); final int alignedFrameLength = alignedLength(framedMessageLength); // 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(); // write negative length field buffer.putIntOrdered(lengthOffset(frameOffset), -framedMessageLength); UNSAFE.storeFence(); buffer.putShort(typeOffset(frameOffset), TYPE_MESSAGE); buffer.putInt(streamIdOffset(frameOffset), streamId); claim.wrap(buffer, frameOffset, framedMessageLength, onComplete); // Do not commit the message } else { newTail = onEndOfPartition(partition, frameOffset); } return newTail; }
/** Commit the fragment so that it can be read by subscriptions. */ public void commit() { // commit the message by writing the positive framed length buffer.putIntOrdered(lengthOffset(0), buffer.capacity()); onCompleteHandler.run(); reset(); }
private boolean handleControlMessageRequest( final RecordMetadata eventMetadata, final DirectBuffer buffer, final int messageOffset, final int messageLength) { boolean isHandled = false; long publishPosition; do { publishPosition = controlMessageDispatcher.claim( claimedControlMessageFragment, ControlMessageRequestHeaderDescriptor.framedLength(messageLength)); } while (publishPosition == -2); if (publishPosition >= 0) { final MutableDirectBuffer writeBuffer = claimedControlMessageFragment.getBuffer(); int writeBufferOffset = claimedControlMessageFragment.getOffset(); controlMessageRequestHeaderDescriptor .wrap(writeBuffer, writeBufferOffset) .streamId(eventMetadata.getRequestStreamId()) .requestId(eventMetadata.getRequestId()); writeBufferOffset += ControlMessageRequestHeaderDescriptor.headerLength(); writeBuffer.putBytes(writeBufferOffset, buffer, messageOffset, messageLength); claimedControlMessageFragment.commit(); isHandled = true; } return isHandled; }
protected Answer<?> claimFragment(final long offset) { return invocation -> { final ClaimedFragment claimedFragment = (ClaimedFragment) invocation.getArguments()[0]; final int length = (int) invocation.getArguments()[1]; fragmentOffset = claimedFragment.getOffset(); claimedFragment.wrap(sendBuffer, 0, alignedFramedLength(length), () -> {}); final long claimedPosition = offset + alignedFramedLength(length); return claimedPosition; }; }
@SuppressWarnings("restriction") public int claim( final LogBufferPartition partition, final int activePartitionId, final ClaimedFragment claim, final int length, final int streamId, Runnable onComplete) { final int partitionSize = partition.getPartitionSize(); final int framedMessageLength = framedLength(length); final int alignedFrameLength = alignedLength(framedMessageLength); // 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(); // write negative length field buffer.putIntOrdered(lengthOffset(frameOffset), -framedMessageLength); UNSAFE.storeFence(); buffer.putShort(typeOffset(frameOffset), TYPE_MESSAGE); buffer.putInt(streamIdOffset(frameOffset), streamId); claim.wrap(buffer, frameOffset, framedMessageLength, onComplete); // Do not commit the message } else { newTail = onEndOfPartition(partition, frameOffset); } return newTail; }
/** Commit the fragment so that it can be read by subscriptions. */ public void commit() { // commit the message by writing the positive framed length buffer.putIntOrdered(lengthOffset(0), buffer.capacity()); onCompleteHandler.run(); reset(); }
public boolean trySend(Dispatcher sendBuffer) { final int requiredLength = getLength(); long claimedOffset; do { claimedOffset = sendBuffer.claim(claimedFragment, requiredLength, remoteStreamId); } while (claimedOffset == -2); if (claimedOffset >= 0) { try { final MutableDirectBuffer buffer = claimedFragment.getBuffer(); final int writeOffset = claimedFragment.getOffset(); write(buffer, writeOffset); claimedFragment.commit(); return true; } catch (Throwable e) { claimedFragment.abort(); } } return false; }
/** Commit the fragment and mark it as failed. It will be ignored by subscriptions. */ public void abort() { // abort the message by setting type to padding and writing the positive framed length buffer.putInt(typeOffset(0), TYPE_PADDING); buffer.putIntOrdered(lengthOffset(0), buffer.capacity()); onCompleteHandler.run(); reset(); }
public boolean isOpen() { return getFragmentLength() > 0; } }
/** Commit the fragment and mark it as failed. It will be ignored by subscriptions. */ public void abort() { // abort the message by setting type to padding and writing the positive framed length buffer.putInt(typeOffset(0), TYPE_PADDING); buffer.putIntOrdered(lengthOffset(0), buffer.capacity()); onCompleteHandler.run(); reset(); }