public NetworkPublicationThreadLocals() { final ByteBuffer byteBuffer = BufferUtil.allocateDirectAligned(192, BitUtil.CACHE_LINE_LENGTH); byteBuffer.limit(DataHeaderFlyweight.HEADER_LENGTH); heartbeatBuffer = byteBuffer.slice(); dataHeader = new DataHeaderFlyweight(heartbeatBuffer); byteBuffer.limit(64 + SetupFlyweight.HEADER_LENGTH).position(64); setupBuffer = byteBuffer.slice(); setupHeader = new SetupFlyweight(setupBuffer); byteBuffer.limit(128 + RttMeasurementFlyweight.HEADER_LENGTH).position(128); rttMeasurementBuffer = byteBuffer.slice(); rttMeasurementHeader = new RttMeasurementFlyweight(rttMeasurementBuffer); dataHeader .version(HeaderFlyweight.CURRENT_VERSION) .flags((byte)DataHeaderFlyweight.BEGIN_AND_END_FLAGS) .headerType(HeaderFlyweight.HDR_TYPE_DATA) .frameLength(0); setupHeader .version(HeaderFlyweight.CURRENT_VERSION) .headerType(HeaderFlyweight.HDR_TYPE_SETUP) .frameLength(SetupFlyweight.HEADER_LENGTH); rttMeasurementHeader .version(HeaderFlyweight.CURRENT_VERSION) .headerType(HeaderFlyweight.HDR_TYPE_RTTM) .frameLength(RttMeasurementFlyweight.HEADER_LENGTH); }
.version(HeaderFlyweight.CURRENT_VERSION) .headerType(HeaderFlyweight.HDR_TYPE_SM) .frameLength(StatusMessageFlyweight.HEADER_LENGTH + applicationSpecificFeedback.length); .frameLength(NakFlyweight.HEADER_LENGTH); .version(HeaderFlyweight.CURRENT_VERSION) .headerType(HeaderFlyweight.HDR_TYPE_RTTM) .frameLength(RttMeasurementFlyweight.HEADER_LENGTH);
@Test public void shouldWriteCorrectValuesForGenericHeaderFields() { encodeHeader.wrap(aBuff); encodeHeader.version((short)1); encodeHeader.flags(DataHeaderFlyweight.BEGIN_AND_END_FLAGS); encodeHeader.headerType(HeaderFlyweight.HDR_TYPE_DATA); encodeHeader.frameLength(8); // little endian assertThat(buffer.get(0), is((byte)0x08)); assertThat(buffer.get(1), is((byte)0x00)); assertThat(buffer.get(2), is((byte)0x00)); assertThat(buffer.get(3), is((byte)0x00)); assertThat(buffer.get(4), is((byte)0x01)); assertThat(buffer.get(5), is((byte)0xC0)); assertThat(buffer.get(6), is((byte)HeaderFlyweight.HDR_TYPE_DATA)); assertThat(buffer.get(7), is((byte)0x00)); }
@Test public void shouldReadWhatIsWrittenToGenericHeaderFields() { encodeHeader.wrap(aBuff); encodeHeader.version((short)1); encodeHeader.flags((short)0); encodeHeader.headerType(HeaderFlyweight.HDR_TYPE_DATA); encodeHeader.frameLength(8); decodeHeader.wrap(aBuff); assertThat(decodeHeader.version(), is((short)1)); assertThat(decodeHeader.headerType(), is(HeaderFlyweight.HDR_TYPE_DATA)); assertThat(decodeHeader.frameLength(), is(8)); }
@Test public void shouldWriteAndReadMultipleFramesCorrectly() { encodeHeader.wrap(aBuff); encodeHeader.version((short)1); encodeHeader.flags((short)0); encodeHeader.headerType(HeaderFlyweight.HDR_TYPE_DATA); encodeHeader.frameLength(8); encodeHeader.wrap(aBuff, 8, aBuff.capacity() - 8); encodeHeader.version((short)2); encodeHeader.flags((short)0x01); encodeHeader.headerType(HeaderFlyweight.HDR_TYPE_SM); encodeHeader.frameLength(8); decodeHeader.wrap(aBuff); assertThat(decodeHeader.version(), is((short)1)); assertThat(decodeHeader.flags(), is((short)0)); assertThat(decodeHeader.headerType(), is(HeaderFlyweight.HDR_TYPE_DATA)); assertThat(decodeHeader.frameLength(), is(8)); decodeHeader.wrap(aBuff, 8, aBuff.capacity() - 8); assertThat(decodeHeader.version(), is((short)2)); assertThat(decodeHeader.flags(), is((short)0x01)); assertThat(decodeHeader.headerType(), is(HeaderFlyweight.HDR_TYPE_SM)); assertThat(decodeHeader.frameLength(), is(8)); }
@Before public void before() throws Exception { when(mockPosition.getWeak()).then((invocation) -> positionLong); when(mockPosition.get()).then((invocation) -> positionLong); doAnswer( (invocation) -> { positionLong = invocation.getArgument(0); return null; }) .when(mockPosition).setOrdered(anyLong()); termFile = File.createTempFile("test.rec", "sourceIdentity"); mockLogBufferChannel = FileChannel.open(termFile.toPath(), CREATE, READ, WRITE); mockLogBufferMapped = new UnsafeBuffer( mockLogBufferChannel.map(FileChannel.MapMode.READ_WRITE, 0, TERM_BUFFER_LENGTH)); final DataHeaderFlyweight headerFlyweight = new DataHeaderFlyweight(); headerFlyweight.wrap(mockLogBufferMapped, TERM_OFFSET, DataHeaderFlyweight.HEADER_LENGTH); headerFlyweight .termOffset(TERM_OFFSET) .sessionId(SESSION_ID) .streamId(STREAM_ID) .headerType(DataHeaderFlyweight.HDR_TYPE_DATA) .frameLength(RECORDED_BLOCK_LENGTH); context = new Archive.Context() .segmentFileLength(SEGMENT_LENGTH) .archiveDir(archiveDir) .catalog(mockCatalog) .epochClock(epochClock); }
.flags(DataHeaderFlyweight.BEGIN_AND_END_FLAGS) .headerType(HeaderFlyweight.HDR_TYPE_DATA) .frameLength(FRAME_LENGTH); encodeDataHeader .sessionId(SESSION_ID)
.flags(DataHeaderFlyweight.BEGIN_AND_END_FLAGS) .headerType(HeaderFlyweight.HDR_TYPE_DATA) .frameLength(FRAME_LENGTH); encodeDataHeader .sessionId(SESSION_ID) .flags(DataHeaderFlyweight.BEGIN_AND_END_FLAGS) .headerType(HeaderFlyweight.HDR_TYPE_DATA) .frameLength(24); encodeDataHeader .sessionId(SESSION_ID)
.flags((short)0) .headerType(HeaderFlyweight.HDR_TYPE_SM) .frameLength(StatusMessageFlyweight.HEADER_LENGTH); byteBuffer.position(0).limit(statusMessage.frameLength());
@Test public void shouldFillGapAfterExistingFrame() { final int gapOffset = 128; final int gapLength = 64; dataFlyweight .sessionId(SESSION_ID) .termId(TERM_ID) .streamId(STREAM_ID) .flags(UNFRAGMENTED) .frameLength(gapOffset); dataFlyweight.setMemory(0, gapOffset - DataHeaderFlyweight.HEADER_LENGTH, (byte)'x'); assertTrue(TermGapFiller.tryFillGap(metaDataBuffer, termBuffer, TERM_ID, gapOffset, gapLength)); dataFlyweight.wrap(termBuffer, gapOffset, termBuffer.capacity() - gapOffset); assertThat(dataFlyweight.frameLength(), is(gapLength)); assertThat(dataFlyweight.termOffset(), is(gapOffset)); assertThat(dataFlyweight.sessionId(), is(SESSION_ID)); assertThat(dataFlyweight.termId(), is(TERM_ID)); assertThat(dataFlyweight.headerType(), is(PADDING_FRAME_TYPE)); assertThat((byte)(dataFlyweight.flags()), is(UNFRAGMENTED)); }
@Test public void shouldFillGapAtEndOfTerm() { final int gapOffset = termBuffer.capacity() - 64; final int gapLength = 64; dataFlyweight .sessionId(SESSION_ID) .termId(TERM_ID) .streamId(STREAM_ID) .flags(UNFRAGMENTED) .frameLength(termBuffer.capacity() - gapOffset); dataFlyweight.setMemory(0, gapOffset - DataHeaderFlyweight.HEADER_LENGTH, (byte)'x'); assertTrue(TermGapFiller.tryFillGap(metaDataBuffer, termBuffer, TERM_ID, gapOffset, gapLength)); dataFlyweight.wrap(termBuffer, gapOffset, termBuffer.capacity() - gapOffset); assertThat(dataFlyweight.frameLength(), is(gapLength)); assertThat(dataFlyweight.termOffset(), is(gapOffset)); assertThat(dataFlyweight.sessionId(), is(SESSION_ID)); assertThat(dataFlyweight.termId(), is(TERM_ID)); assertThat(dataFlyweight.headerType(), is(PADDING_FRAME_TYPE)); assertThat((byte)(dataFlyweight.flags()), is(UNFRAGMENTED)); } }
.streamId(STREAM_ID) .flags(UNFRAGMENTED) .frameLength(gapOffset) .setMemory(0, gapOffset - DataHeaderFlyweight.HEADER_LENGTH, (byte)'x'); .streamId(STREAM_ID) .flags(UNFRAGMENTED) .frameLength(64);
private void recordFragment( final RecordingWriter recordingWriter, final UnsafeBuffer buffer, final DataHeaderFlyweight headerFlyweight, final Header header, final int message, final byte flags, final int type) { final int offset = INITIAL_TERM_OFFSET + message * FRAME_LENGTH; headerFlyweight.wrap(buffer, offset, HEADER_LENGTH); headerFlyweight .streamId(STREAM_ID) .sessionId(SESSION_ID) .termOffset(offset) .termId(INITIAL_TERM_ID) .reservedValue(message) .headerType(type) .flags(flags) .frameLength(FRAME_LENGTH); buffer.setMemory( offset + HEADER_LENGTH, FRAME_LENGTH - HEADER_LENGTH, (byte)message); header.offset(offset); recordingWriter.onBlock(buffer, offset, FRAME_LENGTH, SESSION_ID, INITIAL_TERM_ID); recordingPosition += FRAME_LENGTH; }
public NetworkPublicationThreadLocals() { final ByteBuffer byteBuffer = BufferUtil.allocateDirectAligned(192, BitUtil.CACHE_LINE_LENGTH); byteBuffer.limit(DataHeaderFlyweight.HEADER_LENGTH); heartbeatBuffer = byteBuffer.slice(); dataHeader = new DataHeaderFlyweight(heartbeatBuffer); byteBuffer.limit(64 + SetupFlyweight.HEADER_LENGTH).position(64); setupBuffer = byteBuffer.slice(); setupHeader = new SetupFlyweight(setupBuffer); byteBuffer.limit(128 + RttMeasurementFlyweight.HEADER_LENGTH).position(128); rttMeasurementBuffer = byteBuffer.slice(); rttMeasurementHeader = new RttMeasurementFlyweight(rttMeasurementBuffer); dataHeader .version(HeaderFlyweight.CURRENT_VERSION) .flags((byte)DataHeaderFlyweight.BEGIN_AND_END_FLAGS) .headerType(HeaderFlyweight.HDR_TYPE_DATA) .frameLength(0); setupHeader .version(HeaderFlyweight.CURRENT_VERSION) .headerType(HeaderFlyweight.HDR_TYPE_SETUP) .frameLength(SetupFlyweight.HEADER_LENGTH); rttMeasurementHeader .version(HeaderFlyweight.CURRENT_VERSION) .headerType(HeaderFlyweight.HDR_TYPE_RTTM) .frameLength(RttMeasurementFlyweight.HEADER_LENGTH); }
public NetworkPublicationThreadLocals() { final ByteBuffer byteBuffer = BufferUtil.allocateDirectAligned(192, BitUtil.CACHE_LINE_LENGTH); byteBuffer.limit(DataHeaderFlyweight.HEADER_LENGTH); heartbeatBuffer = byteBuffer.slice(); dataHeader = new DataHeaderFlyweight(heartbeatBuffer); byteBuffer.limit(64 + SetupFlyweight.HEADER_LENGTH).position(64); setupBuffer = byteBuffer.slice(); setupHeader = new SetupFlyweight(setupBuffer); byteBuffer.limit(128 + RttMeasurementFlyweight.HEADER_LENGTH).position(128); rttMeasurementBuffer = byteBuffer.slice(); rttMeasurementHeader = new RttMeasurementFlyweight(rttMeasurementBuffer); dataHeader .version(HeaderFlyweight.CURRENT_VERSION) .flags((byte)DataHeaderFlyweight.BEGIN_AND_END_FLAGS) .headerType(HeaderFlyweight.HDR_TYPE_DATA) .frameLength(0); setupHeader .version(HeaderFlyweight.CURRENT_VERSION) .headerType(HeaderFlyweight.HDR_TYPE_SETUP) .frameLength(SetupFlyweight.HEADER_LENGTH); rttMeasurementHeader .version(HeaderFlyweight.CURRENT_VERSION) .headerType(HeaderFlyweight.HDR_TYPE_RTTM) .frameLength(RttMeasurementFlyweight.HEADER_LENGTH); }
.version(HeaderFlyweight.CURRENT_VERSION) .headerType(HeaderFlyweight.HDR_TYPE_SM) .frameLength(StatusMessageFlyweight.HEADER_LENGTH + applicationSpecificFeedback.length); .frameLength(NakFlyweight.HEADER_LENGTH); .version(HeaderFlyweight.CURRENT_VERSION) .headerType(HeaderFlyweight.HDR_TYPE_RTTM) .frameLength(RttMeasurementFlyweight.HEADER_LENGTH);
.version(HeaderFlyweight.CURRENT_VERSION) .headerType(HeaderFlyweight.HDR_TYPE_SM) .frameLength(StatusMessageFlyweight.HEADER_LENGTH + applicationSpecificFeedback.length); .frameLength(NakFlyweight.HEADER_LENGTH); .version(HeaderFlyweight.CURRENT_VERSION) .headerType(HeaderFlyweight.HDR_TYPE_RTTM) .frameLength(RttMeasurementFlyweight.HEADER_LENGTH);