Esempio n. 1
0
        /// <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
            }
        }
Esempio n. 2
0
            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();
                    }
                }
            }
Esempio n. 3
0
        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));
        }
Esempio n. 4
0
 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);
 }
Esempio n. 5
0
        /// <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);
        }
Esempio n. 6
0
        /// <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);
        }
Esempio n. 7
0
        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));
        }
Esempio n. 8
0
        /// <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);
        }
Esempio n. 9
0
 /// <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);
 }
Esempio n. 10
0
        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);
        }
Esempio n. 11
0
        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());
        }
Esempio n. 12
0
        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();
        }
Esempio n. 13
0
        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());
        }
Esempio n. 14
0
 public static void FrameTermId(UnsafeBuffer buffer, int termOffset, int termId)
 {
     buffer.PutInt(TermIdOffset(termOffset), termId);
 }
Esempio n. 15
0
 /// <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);
 }
Esempio n. 16
0
 /// <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);
 }
Esempio n. 17
0
 /// <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);
 }
Esempio n. 18
0
 public static void MtuLength(UnsafeBuffer metaDataBuffer, int mtuLength)
 {
     metaDataBuffer.PutInt(LOG_MTU_LENGTH_OFFSET, mtuLength);
 }
Esempio n. 19
0
 public static void InitialTermId(UnsafeBuffer metaDataBuffer, int initialTermId)
 {
     metaDataBuffer.PutInt(LOG_INITIAL_TERM_ID_OFFSET, initialTermId);
 }
Esempio n. 20
0
 /// <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);
 }
Esempio n. 21
0
 public void ClusterId(int clusterId)
 {
     buffer.PutInt(MarkFileHeaderEncoder.ClusterIdEncodingOffset(), clusterId);
 }
Esempio n. 22
0
 /// <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);
 }
Esempio n. 23
0
 /// <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);
 }