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); }
/** * return flags field value * * @return flags field value */ public short flags() { return (short)(getByte(FLAGS_FIELD_OFFSET) & 0xFF); }
/** * return frame length field * * @return frame length field */ public int frameLength() { return getInt(FRAME_LENGTH_FIELD_OFFSET, LITTLE_ENDIAN); }
@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)); }
.receiverId(receiverId) .version(HeaderFlyweight.CURRENT_VERSION) .headerType(HeaderFlyweight.HDR_TYPE_SM) .frameLength(StatusMessageFlyweight.HEADER_LENGTH + applicationSpecificFeedback.length); .headerType(HeaderFlyweight.HDR_TYPE_NAK) .frameLength(NakFlyweight.HEADER_LENGTH); .headerType(HeaderFlyweight.HDR_TYPE_RTTM) .frameLength(RttMeasurementFlyweight.HEADER_LENGTH);
private void insertPaddingFrame(final int activeTermId, final int termOffset) { dataHeader .termId(INITIAL_TERM_ID) .streamId(STREAM_ID) .sessionId(SESSION_ID) .frameLength(TERM_BUFFER_LENGTH - termOffset) .headerType(HeaderFlyweight.HDR_TYPE_PAD) .flags(DataHeaderFlyweight.BEGIN_AND_END_FLAGS) .version(HeaderFlyweight.CURRENT_VERSION); final int activeIndex = indexByTerm(INITIAL_TERM_ID, activeTermId); TermRebuilder.insert(termBuffers[activeIndex], termOffset, rcvBuffer, TERM_BUFFER_LENGTH - termOffset); }
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; }
@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); }
.streamId(STREAM_ID) .flags(UNFRAGMENTED) .frameLength(gapOffset) .setMemory(0, gapOffset - DataHeaderFlyweight.HEADER_LENGTH, (byte)'x'); .streamId(STREAM_ID) .flags(UNFRAGMENTED) .frameLength(64);
/** * set the flags field value * * @param flags field value * @return flyweight */ public HeaderFlyweight flags(final short flags) { putByte(FLAGS_FIELD_OFFSET, (byte)flags); return this; }
/** * return header type field * * @return type field value */ public int headerType() { return getShort(TYPE_FIELD_OFFSET, LITTLE_ENDIAN) & 0xFFFF; }
/** * set frame length field * * @param length field value * @return flyweight */ public HeaderFlyweight frameLength(final int length) { putInt(FRAME_LENGTH_FIELD_OFFSET, length, LITTLE_ENDIAN); return this; } }
/** * set header type field * * @param type field value * @return flyweight */ public HeaderFlyweight headerType(final int type) { putShort(TYPE_FIELD_OFFSET, (short)type, LITTLE_ENDIAN); return this; }
@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)); }
private void fillSetupFrame(final SetupFlyweight header, final int termOffset) { header.wrap(setupBuffer); header .streamId(STREAM_ID) .sessionId(SESSION_ID) .initialTermId(INITIAL_TERM_ID) .activeTermId(ACTIVE_TERM_ID) .termOffset(termOffset) .frameLength(SetupFlyweight.HEADER_LENGTH) .headerType(HeaderFlyweight.HDR_TYPE_SETUP) .flags((byte)0) .version(HeaderFlyweight.CURRENT_VERSION); } }
.receiverId(receiverId) .version(HeaderFlyweight.CURRENT_VERSION) .headerType(HeaderFlyweight.HDR_TYPE_SM) .frameLength(StatusMessageFlyweight.HEADER_LENGTH + applicationSpecificFeedback.length); .headerType(HeaderFlyweight.HDR_TYPE_NAK) .frameLength(NakFlyweight.HEADER_LENGTH); .headerType(HeaderFlyweight.HDR_TYPE_RTTM) .frameLength(RttMeasurementFlyweight.HEADER_LENGTH);
@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)); }
/** * set version field value * * @param version field value * @return flyweight */ public HeaderFlyweight version(final short version) { putByte(VERSION_FIELD_OFFSET, (byte)version); return this; }
/** * return header type field * * @return type field value */ public int headerType() { return getShort(TYPE_FIELD_OFFSET, LITTLE_ENDIAN) & 0xFFFF; }
/** * set frame length field * * @param length field value * @return flyweight */ public HeaderFlyweight frameLength(final int length) { putInt(FRAME_LENGTH_FIELD_OFFSET, length, LITTLE_ENDIAN); return this; } }