/// <summary> /// Append a padding record log of a given length to make up the log to a position. /// </summary> /// <param name="length"> of the range to claim, in bytes.. </param> /// <returns> The new stream position, otherwise a negative error value of <seealso cref="Publication.NOT_CONNECTED"/>, /// <seealso cref="Publication.BACK_PRESSURED"/>, <seealso cref="Publication.ADMIN_ACTION"/>, <seealso cref="Publication.CLOSED"/>, or <seealso cref="Publication.MAX_POSITION_EXCEEDED"/>. </returns> /// <exception cref="ArgumentException"> if the length is greater than <seealso cref="Publication.MaxMessageLength"/>. </exception> public long AppendPadding(int length) { CheckMaxMessageLength(length); long newPosition = CLOSED; if (!_isClosed) { long limit = _positionLimit.GetVolatile(); ExclusiveTermAppender termAppender = _termAppenders[_activePartitionIndex]; long position = _termBeginPosition + _termOffset; if (position < limit) { CheckPositiveLength(length); int result = termAppender.AppendPadding(_termId, _termOffset, _headerWriter, length); newPosition = NewPosition(result); } else { newPosition = BackPressureStatus(position, length); } } return(newPosition); }
/// <summary> /// Offer a block of pre-formatted message fragments directly into the current term. /// </summary> /// <param name="buffer"> containing the pre-formatted block of message fragments. </param> /// <param name="offset"> offset in the buffer at which the first fragment begins. </param> /// <param name="length"> in bytes of the encoded block. </param> /// <returns> The new stream position, otherwise a negative error value of <seealso cref="Publication.NOT_CONNECTED"/>, /// <seealso cref="Publication.BACK_PRESSURED"/>, <seealso cref="Publication.ADMIN_ACTION"/>, <seealso cref="Publication.CLOSED"/>, /// or <seealso cref="Publication.MAX_POSITION_EXCEEDED"/>. </returns> /// <exception cref="ArgumentException"> if the length is greater than remaining size of the current term. </exception> /// <exception cref="ArgumentException"> if the first frame within the block is not properly formatted, i.e. if the /// <code>streamId</code> is not equal to the value returned by the <seealso cref="Publication.StreamId"/> /// method or if the <code>sessionId</code> is not equal to the value returned by the /// <seealso cref="Publication.SessionId"/> method or if the frame type is not equal to the /// <seealso cref="HeaderFlyweight.HDR_TYPE_DATA"/>. </exception> public long OfferBlock(IMutableDirectBuffer buffer, int offset, int length) { if (IsClosed) { return(CLOSED); } if (_termOffset >= TermBufferLength) { RotateTerm(); } long limit = _positionLimit.GetVolatile(); long position = _termBeginPosition + _termOffset; if (position < limit) { CheckBlockLength(length); CheckFirstFrame(buffer, offset); ExclusiveTermAppender termAppender = _termAppenders[_activePartitionIndex]; int result = termAppender.AppendBlock(_termId, _termOffset, buffer, offset, length); return(NewPosition(result)); } else { return(BackPressureStatus(position, length)); } }
public long TryClaim(int length, ExclusiveBufferClaim bufferClaim) { CheckForMaxPayloadLength(length); var newPosition = CLOSED; if (!_isClosed) { var limit = _positionLimit.Volatile; ExclusiveTermAppender termAppender = _termAppenders[_activePartitionIndex]; long position = _termBeginPosition + _termOffset; if (position < limit) { int result = termAppender.Claim(_termId, _termOffset, _headerWriter, length, bufferClaim); newPosition = NewPosition(result); } else if (_conductor.IsPublicationConnected(LogBufferDescriptor.TimeOfLastStatusMessage(_logMetaDataBuffer))) { newPosition = BACK_PRESSURED; } else { newPosition = NOT_CONNECTED; } } return(newPosition); }
/// <inheritdoc /> public override long Offer(IDirectBuffer bufferOne, int offsetOne, int lengthOne, IDirectBuffer bufferTwo, int offsetTwo, int lengthTwo, ReservedValueSupplier reservedValueSupplier = null) { long newPosition = CLOSED; if (!_isClosed) { long limit = _positionLimit.GetVolatile(); ExclusiveTermAppender termAppender = _termAppenders[_activePartitionIndex]; long position = _termBeginPosition + _termOffset; int length = ValidateAndComputeLength(lengthOne, lengthTwo); if (position < limit) { int result; if (length <= MaxPayloadLength) { CheckPositiveLength(length); result = termAppender.AppendUnfragmentedMessage( _termId, _termOffset, _headerWriter, bufferOne, offsetOne, lengthOne, bufferTwo, offsetTwo, lengthTwo, reservedValueSupplier); } else { CheckMaxMessageLength(length); result = termAppender.AppendFragmentedMessage( _termId, _termOffset, _headerWriter, bufferOne, offsetOne, lengthOne, bufferTwo, offsetTwo, lengthTwo, MaxPayloadLength, reservedValueSupplier); } newPosition = NewPosition(result); } else { newPosition = BackPressureStatus(position, length); } } return(newPosition); }
internal ExclusivePublication( ClientConductor clientConductor, string channel, int streamId, int sessionId, IReadablePosition positionLimit, LogBuffers logBuffers, long originalRegistrationId, long registrationId) { var buffers = logBuffers.TermBuffers(); var logMetaDataBuffer = logBuffers.MetaDataBuffer(); for (var i = 0; i < LogBufferDescriptor.PARTITION_COUNT; i++) { _termAppenders[i] = new ExclusiveTermAppender(buffers[i], logMetaDataBuffer, i); } var termLength = logBuffers.TermLength(); _termBufferLength = termLength; MaxPayloadLength = LogBufferDescriptor.MtuLength(logMetaDataBuffer) - DataHeaderFlyweight.HEADER_LENGTH; MaxMessageLength = FrameDescriptor.ComputeExclusiveMaxMessageLength(termLength); _maxPossiblePosition = termLength * (1L << 31); _conductor = clientConductor; Channel = channel; StreamId = streamId; SessionId = sessionId; _logMetaDataBuffer = logMetaDataBuffer; _originalRegistrationId = originalRegistrationId; RegistrationId = registrationId; _positionLimit = positionLimit; _logBuffers = logBuffers; _positionBitsToShift = IntUtil.NumberOfTrailingZeros(termLength); _headerWriter = new HeaderWriter(LogBufferDescriptor.DefaultFrameHeader(logMetaDataBuffer)); InitialTermId = LogBufferDescriptor.InitialTermId(logMetaDataBuffer); var activeIndex = LogBufferDescriptor.ActivePartitionIndex(logMetaDataBuffer); _activePartitionIndex = activeIndex; long rawTail = LogBufferDescriptor.RawTail(_logMetaDataBuffer, activeIndex); _termId = LogBufferDescriptor.TermId(rawTail); _termOffset = LogBufferDescriptor.TermOffset(rawTail, termLength); _termBeginPosition = LogBufferDescriptor.ComputeTermBeginPosition(_termId, _positionBitsToShift, InitialTermId); }
internal ExclusivePublication( ClientConductor clientConductor, string channel, int streamId, int sessionId, IReadablePosition positionLimit, int channelStatusId, LogBuffers logBuffers, long originalRegistrationId, long registrationId) : base( clientConductor, channel, streamId, sessionId, positionLimit, channelStatusId, logBuffers, originalRegistrationId, registrationId, FrameDescriptor.ComputeExclusiveMaxMessageLength(logBuffers.TermLength()) ) { var buffers = logBuffers.DuplicateTermBuffers(); var logMetaDataBuffer = logBuffers.MetaDataBuffer(); for (var i = 0; i < LogBufferDescriptor.PARTITION_COUNT; i++) { _termAppenders[i] = new ExclusiveTermAppender(buffers[i], logMetaDataBuffer, i); } var termCount = LogBufferDescriptor.ActiveTermCount(logMetaDataBuffer); var index = LogBufferDescriptor.IndexByTermCount(termCount); _activePartitionIndex = index; var rawTail = LogBufferDescriptor.RawTail(_logMetaDataBuffer, index); _termId = LogBufferDescriptor.TermId(rawTail); _termOffset = LogBufferDescriptor.TermOffset(rawTail); _termBeginPosition = LogBufferDescriptor.ComputeTermBeginPosition(_termId, _positionBitsToShift, InitialTermId); }
/// <inheritdoc /> public override long Offer(DirectBufferVector[] vectors, ReservedValueSupplier reservedValueSupplier = null) { int length = DirectBufferVector.ValidateAndComputeLength(vectors); var newPosition = CLOSED; if (!_isClosed) { var limit = _positionLimit.GetVolatile(); ExclusiveTermAppender termAppender = _termAppenders[_activePartitionIndex]; long position = _termBeginPosition + _termOffset; if (position < limit) { int result; if (length <= MaxPayloadLength) { result = termAppender.AppendUnfragmentedMessage( _termId, _termOffset, _headerWriter, vectors, length, reservedValueSupplier); } else { CheckMaxMessageLength(length); result = termAppender.AppendFragmentedMessage( _termId, _termOffset, _headerWriter, vectors, length, MaxPayloadLength, reservedValueSupplier); } newPosition = NewPosition(result); } else { newPosition = BackPressureStatus(position, length); } } return(newPosition); }
public long Offer( UnsafeBuffer buffer, int offset, int length, ReservedValueSupplier reservedValueSupplier = null) { var newPosition = CLOSED; if (!_isClosed) { var limit = _positionLimit.Volatile; ExclusiveTermAppender termAppender = _termAppenders[_activePartitionIndex]; long position = _termBeginPosition + this._termOffset; if (position < limit) { int result; if (length <= MaxPayloadLength) { result = termAppender.AppendUnfragmentedMessage(_termId, _termOffset, _headerWriter, buffer, offset, length, reservedValueSupplier); } else { CheckForMaxMessageLength(length); result = termAppender.AppendFragmentedMessage(_termId, _termOffset, _headerWriter, buffer, offset, length, MaxPayloadLength, reservedValueSupplier); } newPosition = NewPosition(result); } else if (_conductor.IsPublicationConnected(LogBufferDescriptor.TimeOfLastStatusMessage(_logMetaDataBuffer))) { newPosition = BACK_PRESSURED; } else { newPosition = NOT_CONNECTED; } } return(newPosition); }
public long Offer( UnsafeBuffer buffer, int offset, int length, ReservedValueSupplier reservedValueSupplier = null) { var newPosition = CLOSED; if (!_isClosed) { var limit = _positionLimit.Volatile; ExclusiveTermAppender termAppender = _termAppenders[_activePartitionIndex]; long position = _termBeginPosition + _termOffset; if (position < limit) { int result; if (length <= MaxPayloadLength) { result = termAppender.AppendUnfragmentedMessage(_termId, _termOffset, _headerWriter, buffer, offset, length, reservedValueSupplier); } else { CheckForMaxMessageLength(length); result = termAppender.AppendFragmentedMessage(_termId, _termOffset, _headerWriter, buffer, offset, length, MaxPayloadLength, reservedValueSupplier); } newPosition = NewPosition(result); } else { newPosition = BackPressureStatus(position, length); } } return(newPosition); }
public override long TryClaim(int length, BufferClaim bufferClaim) { CheckPayloadLength(length); var newPosition = CLOSED; if (!_isClosed) { var limit = _positionLimit.GetVolatile(); ExclusiveTermAppender termAppender = _termAppenders[_activePartitionIndex]; long position = _termBeginPosition + _termOffset; if (position < limit) { int result = termAppender.Claim(_termId, _termOffset, _headerWriter, length, bufferClaim); newPosition = NewPosition(result); } else { newPosition = BackPressureStatus(position, length); } } return(newPosition); }