/// <summary> /// Tombstone an entry in the log so it is no longer valid. /// </summary> /// <param name="leadershipTermId"> to match for validation. </param> /// <param name="entryIndex"> reached in the leadership term. </param> public void TombstoneEntry(long leadershipTermId, int entryIndex) { int index = -1; for (int i = 0, size = entries.Count; i < size; i++) { Entry entry = entries[i]; if (entry.leadershipTermId == leadershipTermId && entry.entryIndex == entryIndex) { index = entry.entryIndex; break; } } if (-1 == index) { throw new System.ArgumentException("Unknown entry index: " + entryIndex); } buffer.PutInt(0, NULL_VALUE); long filePosition = (index * ENTRY_LENGTH) + ENTRY_TYPE_OFFSET; using (var fileChannel = new FileStream(indexFile.FullName, FileMode.Append, FileAccess.Write, FileShare.ReadWrite, BitUtil.SIZE_OF_INT, FileOptions.WriteThrough)) { fileChannel.Position = filePosition; fileChannel.Write(byteBuffer, 0, BitUtil.SIZE_OF_INT); // Check } }
public void Run() { try { Barrier.SignalAndWait(); } catch (Exception) { // ignored } const int length = BitUtil.SIZE_OF_INT * 2; const int repsValueOffset = BitUtil.SIZE_OF_INT; var srcBuffer = new UnsafeBuffer(new byte[1024]); srcBuffer.PutInt(0, ProducerId); for (var i = 0; i < Reps; i++) { srcBuffer.PutInt(repsValueOffset, i); while (!_outerInstance._ringBuffer.Write(MsgTypeID, srcBuffer, 0, length)) { Thread.Yield(); } } }
public static Counter Allocate(Aeron.Aeron aeron, UnsafeBuffer tempBuffer, long recordingId, long controlSessionId, long correlationId, int sessionId, int streamId, string strippedChannel) { tempBuffer.PutLong(RECORDING_ID_OFFSET, recordingId); tempBuffer.PutLong(CONTROL_SESSION_ID_OFFSET, controlSessionId); tempBuffer.PutLong(CORRELATION_ID_OFFSET, correlationId); tempBuffer.PutInt(SESSION_ID_OFFSET, sessionId); tempBuffer.PutInt(STREAM_ID_OFFSET, streamId); int labelLength = 0; labelLength += tempBuffer.PutStringWithoutLengthAscii(KEY_LENGTH, NAME + ": "); labelLength += tempBuffer.PutLongAscii(KEY_LENGTH + labelLength, recordingId); labelLength += tempBuffer.PutStringWithoutLengthAscii(KEY_LENGTH + labelLength, " "); labelLength += tempBuffer.PutIntAscii(KEY_LENGTH + labelLength, sessionId); labelLength += tempBuffer.PutStringWithoutLengthAscii(KEY_LENGTH + labelLength, " "); labelLength += tempBuffer.PutIntAscii(KEY_LENGTH + labelLength, streamId); labelLength += tempBuffer.PutStringWithoutLengthAscii(KEY_LENGTH + labelLength, " "); labelLength += tempBuffer.PutStringWithoutLengthAscii(KEY_LENGTH + labelLength, strippedChannel, 0, CountersReader.MAX_LABEL_LENGTH - labelLength); return(aeron.AddCounter(RECORDING_POSITION_TYPE_ID, tempBuffer, 0, KEY_LENGTH, tempBuffer, KEY_LENGTH, labelLength)); }
public static void FillMetaData(UnsafeBuffer cncMetaDataBuffer, int toDriverBufferLength, int toClientsBufferLength, int counterMetaDataBufferLength, int counterValuesBufferLength, long clientLivenessTimeout, int errorLogBufferLength) { cncMetaDataBuffer.PutInt(ToDriverBufferLengthOffset(0), toDriverBufferLength); cncMetaDataBuffer.PutInt(ToClientsBufferLengthOffset(0), toClientsBufferLength); cncMetaDataBuffer.PutInt(CountersMetaDataBufferLengthOffset(0), counterMetaDataBufferLength); cncMetaDataBuffer.PutInt(CountersValuesBufferLengthOffset(0), counterValuesBufferLength); cncMetaDataBuffer.PutInt(ErrorLogBufferLengthOffset(0), errorLogBufferLength); cncMetaDataBuffer.PutLong(ClientLivenessTimeoutOffset(0), clientLivenessTimeout); }
/// <summary> /// Return an initialised default Data Frame Header. /// </summary> /// <param name="sessionId"> for the header </param> /// <param name="streamId"> for the header </param> /// <param name="termId"> for the header </param> /// <returns> byte array containing the header </returns> public static UnsafeBuffer CreateDefaultHeader(int sessionId, int streamId, int termId) { var buffer = new UnsafeBuffer(BufferUtil.AllocateDirectAligned(HEADER_LENGTH, FrameDescriptor.FRAME_ALIGNMENT)); buffer.PutByte(VERSION_FIELD_OFFSET, CURRENT_VERSION); buffer.PutByte(FLAGS_FIELD_OFFSET, (byte)BEGIN_AND_END_FLAGS); buffer.PutShort(TYPE_FIELD_OFFSET, HDR_TYPE_DATA); buffer.PutInt(SESSION_ID_FIELD_OFFSET, sessionId); buffer.PutInt(STREAM_ID_FIELD_OFFSET, streamId); buffer.PutInt(TERM_ID_FIELD_OFFSET, termId); buffer.PutLong(RESERVED_VALUE_OFFSET, DEFAULT_RESERVE_VALUE); return(buffer); }
/// <summary> /// Return an initialised default Data Frame Header. /// </summary> /// <param name="sessionId"> for the header </param> /// <param name="streamId"> for the header </param> /// <param name="termId"> for the header </param> /// <returns> byte array containing the header </returns> public static UnsafeBuffer CreateDefaultHeader(int sessionId, int streamId, int termId) { var buffer = new UnsafeBuffer(new byte[HEADER_LENGTH]); buffer.PutByte(VERSION_FIELD_OFFSET, CURRENT_VERSION); buffer.PutByte(FLAGS_FIELD_OFFSET, (byte)BEGIN_AND_END_FLAGS); buffer.PutShort(TYPE_FIELD_OFFSET, HDR_TYPE_DATA); buffer.PutInt(SESSION_ID_FIELD_OFFSET, sessionId); buffer.PutInt(STREAM_ID_FIELD_OFFSET, streamId); buffer.PutInt(TERM_ID_FIELD_OFFSET, termId); buffer.PutLong(RESERVED_VALUE_OFFSET, DEFAULT_RESERVE_VALUE); return(buffer); }
public static Counter Allocate(Aeron.Aeron aeron, UnsafeBuffer tempBuffer, long recordingId, int sessionId, int streamId, string strippedChannel, string sourceIdentity) { tempBuffer.PutLong(RECORDING_ID_OFFSET, recordingId); tempBuffer.PutInt(SESSION_ID_OFFSET, sessionId); var sourceIdentityLength = Math.Min(sourceIdentity.Length, CountersReader.MAX_KEY_LENGTH - SOURCE_IDENTITY_OFFSET); tempBuffer.PutStringAscii(SOURCE_IDENTITY_LENGTH_OFFSET, sourceIdentity); var keyLength = SOURCE_IDENTITY_OFFSET + sourceIdentityLength; int labelLength = 0; labelLength += tempBuffer.PutStringWithoutLengthAscii(keyLength, NAME + ": "); labelLength += tempBuffer.PutLongAscii(keyLength + labelLength, recordingId); labelLength += tempBuffer.PutStringWithoutLengthAscii(keyLength + labelLength, " "); labelLength += tempBuffer.PutIntAscii(keyLength + labelLength, sessionId); labelLength += tempBuffer.PutStringWithoutLengthAscii(keyLength + labelLength, " "); labelLength += tempBuffer.PutIntAscii(keyLength + labelLength, streamId); labelLength += tempBuffer.PutStringWithoutLengthAscii(keyLength + labelLength, " "); labelLength += tempBuffer.PutStringWithoutLengthAscii( keyLength + labelLength, strippedChannel, 0, CountersReader.MAX_LABEL_LENGTH - labelLength); return(aeron.AddCounter( RECORDING_POSITION_TYPE_ID, tempBuffer, 0, keyLength, tempBuffer, keyLength, labelLength)); }
/// <summary> /// Store the default frame header to the log meta data buffer. /// </summary> /// <param name="logMetaDataBuffer"> into which the default headers should be stored. </param> /// <param name="defaultHeader"> to be stored. </param> /// <exception cref="ArgumentException"> if the default header is larger than <seealso cref="LOG_DEFAULT_FRAME_HEADER_MAX_LENGTH"/> </exception> public static void StoreDefaultFrameHeader(UnsafeBuffer logMetaDataBuffer, IDirectBuffer defaultHeader) { if (defaultHeader.Capacity != DataHeaderFlyweight.HEADER_LENGTH) { throw new ArgumentException( $"Default header of {defaultHeader.Capacity:D} not equal to {DataHeaderFlyweight.HEADER_LENGTH:D}"); } logMetaDataBuffer.PutInt(LOG_DEFAULT_FRAME_HEADER_LENGTH_OFFSET, DataHeaderFlyweight.HEADER_LENGTH); logMetaDataBuffer.PutBytes(LOG_DEFAULT_FRAME_HEADER_OFFSET, defaultHeader, 0, DataHeaderFlyweight.HEADER_LENGTH); }
/// <summary> /// Fill the CnC file with metadata to define its sections. /// </summary> /// <param name="cncMetaDataBuffer"> that wraps the metadata section of the CnC file. </param> /// <param name="toDriverBufferLength"> for sending commands to the driver. </param> /// <param name="toClientsBufferLength"> for broadcasting events to the clients. </param> /// <param name="counterMetaDataBufferLength"> buffer length for counters metadata. </param> /// <param name="counterValuesBufferLength"> buffer length for counter values. </param> /// <param name="clientLivenessTimeoutNs"> timeout value in nanoseconds for client liveness and inter-service interval. </param> /// <param name="errorLogBufferLength"> for recording the distinct error log. </param> /// <param name="startTimestampMs"> epoch at which the driver started. </param> /// <param name="pid"> for the process hosting the driver. </param> public static void FillMetaData( UnsafeBuffer cncMetaDataBuffer, int toDriverBufferLength, int toClientsBufferLength, int counterMetaDataBufferLength, int counterValuesBufferLength, long clientLivenessTimeoutNs, int errorLogBufferLength, long startTimestampMs, long pid) { cncMetaDataBuffer.PutInt(ToDriverBufferLengthOffset(0), toDriverBufferLength); cncMetaDataBuffer.PutInt(ToClientsBufferLengthOffset(0), toClientsBufferLength); cncMetaDataBuffer.PutInt(CountersMetaDataBufferLengthOffset(0), counterMetaDataBufferLength); cncMetaDataBuffer.PutInt(CountersValuesBufferLengthOffset(0), counterValuesBufferLength); cncMetaDataBuffer.PutInt(ErrorLogBufferLengthOffset(0), errorLogBufferLength); cncMetaDataBuffer.PutLong(ClientLivenessTimeoutOffset(0), clientLivenessTimeoutNs); cncMetaDataBuffer.PutLong(StartTimestampOffset(0), startTimestampMs); cncMetaDataBuffer.PutLong(PidOffset(0), pid); }
public static void StoreDefaultFrameHeader(UnsafeBuffer metaDataBuffer, IDirectBuffer defaultHeader) { if (defaultHeader.Capacity != DataHeaderFlyweight.HEADER_LENGTH) { ThrowHelper.ThrowArgumentException( $"Default header length not equal to HEADER_LENGTH: length={defaultHeader.Capacity:D}"); return; } metaDataBuffer.PutInt(LOG_DEFAULT_FRAME_HEADER_LENGTH_OFFSET, DataHeaderFlyweight.HEADER_LENGTH); metaDataBuffer.PutBytes(LOG_DEFAULT_FRAME_HEADER_OFFSET, defaultHeader, 0, DataHeaderFlyweight.HEADER_LENGTH); }
public void ShouldInsertIntoEmptyBuffer() { UnsafeBuffer packet = new UnsafeBuffer(new byte[256]); const int termOffset = 0; const int srcOffset = 0; const int length = 256; packet.PutInt(srcOffset, length); A.CallTo(() => _termBuffer.GetInt(0)).Returns(length); TermRebuilder.Insert(_termBuffer, termOffset, packet, length); A.CallTo(() => _termBuffer.PutBytes(termOffset, packet, srcOffset, length)).MustHaveHappened() .Then(A.CallTo(() => _termBuffer.PutIntOrdered(termOffset, length)).MustHaveHappened()); }
public void ShouldInsertLastFrameIntoBuffer() { int frameLength = BitUtil.Align(256, FrameDescriptor.FRAME_ALIGNMENT); const int srcOffset = 0; int tail = TERM_BUFFER_CAPACITY - frameLength; int termOffset = tail; UnsafeBuffer packet = new UnsafeBuffer(new byte[frameLength]); packet.PutShort(FrameDescriptor.TypeOffset(srcOffset), (short)FrameDescriptor.PADDING_FRAME_TYPE); packet.PutInt(srcOffset, frameLength); TermRebuilder.Insert(_termBuffer, termOffset, packet, frameLength); A.CallTo(() => _termBuffer.PutBytes(tail + DataHeaderFlyweight.HEADER_LENGTH, packet, srcOffset + DataHeaderFlyweight.HEADER_LENGTH, frameLength - DataHeaderFlyweight.HEADER_LENGTH)).MustHaveHappened(); }
public void ShouldInsertIntoEmptyBuffer() { UnsafeBuffer packet = new UnsafeBuffer(new byte[256]); const int termOffset = 0; const int srcOffset = 0; const int length = 256; packet.PutInt(srcOffset, length); TermRebuilder.Insert(_termBuffer, termOffset, packet, length); A.CallTo(() => _termBuffer.PutBytes(termOffset + DataHeaderFlyweight.HEADER_LENGTH, packet, srcOffset + DataHeaderFlyweight.HEADER_LENGTH, length - DataHeaderFlyweight.HEADER_LENGTH)).MustHaveHappened() .Then(A.CallTo(() => _termBuffer.PutLong(termOffset + 24, packet.GetLong(24))).MustHaveHappened()) .Then(A.CallTo(() => _termBuffer.PutLong(termOffset + 16, packet.GetLong(16))).MustHaveHappened()) .Then(A.CallTo(() => _termBuffer.PutLong(termOffset + 8, packet.GetLong(8))).MustHaveHappened()) .Then(A.CallTo(() => _termBuffer.PutLongOrdered(termOffset, packet.GetLong(0))).MustHaveHappened()); }
public static void FrameTermId(UnsafeBuffer buffer, int termOffset, int termId) { buffer.PutInt(TermIdOffset(termOffset), termId); }
/// <summary> /// Set the value of the current active partition index for the producer. /// </summary> /// <param name="metaDataBuffer"> containing the metadata. </param> /// <param name="termCount"> value of the active term count used by the producer of this log. </param> public static void ActiveTermCount(UnsafeBuffer metaDataBuffer, int termCount) { metaDataBuffer.PutInt(LOG_ACTIVE_TERM_COUNT_OFFSET, termCount); }
/// <summary> /// Set the page size used for this log. /// </summary> /// <param name="metaDataBuffer"> containing the metadata. </param> /// <param name="pageSize"> value to be set. </param> public static void PageSize(UnsafeBuffer metaDataBuffer, int pageSize) { metaDataBuffer.PutInt(LOG_PAGE_SIZE_OFFSET, pageSize); }
/// <summary> /// Set the term length used for this log. /// </summary> /// <param name="metaDataBuffer"> containing the metadata. </param> /// <param name="termLength"> value to be set. </param> public static void TermLength(UnsafeBuffer metaDataBuffer, int termLength) { metaDataBuffer.PutInt(LOG_TERM_LENGTH_OFFSET, termLength); }
public static void MtuLength(UnsafeBuffer metaDataBuffer, int mtuLength) { metaDataBuffer.PutInt(LOG_MTU_LENGTH_OFFSET, mtuLength); }
public static void InitialTermId(UnsafeBuffer metaDataBuffer, int initialTermId) { metaDataBuffer.PutInt(LOG_INITIAL_TERM_ID_OFFSET, initialTermId); }
/// <summary> /// Set the value of the current active partition index for the producer. /// </summary> /// <param name="logMetaDataBuffer"> containing the meta data. </param> /// <param name="activePartitionIndex"> value of the active partition index used by the producer of this log. </param> public static void ActivePartitionIndex(UnsafeBuffer logMetaDataBuffer, int activePartitionIndex) { logMetaDataBuffer.PutInt(LOG_ACTIVE_PARTITION_INDEX_OFFSET, activePartitionIndex); }
public void ClusterId(int clusterId) { buffer.PutInt(MarkFileHeaderEncoder.ClusterIdEncodingOffset(), clusterId); }
/// <summary> /// Clean down the buffers for reuse by zeroing them out. /// </summary> public void Clean() { _termBuffer.SetMemory(0, _termBuffer.Capacity, 0); _metaDataBuffer.PutInt(LogBufferDescriptor.TERM_STATUS_OFFSET, LogBufferDescriptor.CLEAN); }
/// <summary> /// Write the session id field for a frame. /// </summary> /// <param name="buffer"> containing the frame. </param> /// <param name="termOffset"> at which a frame begins. </param> /// <param name="sessionId"> value for the frame. </param> public static void FrameSessionId(UnsafeBuffer buffer, int termOffset, int sessionId) { buffer.PutInt(SessionIdOffset(termOffset), sessionId, ByteOrder.LittleEndian); }