/// <inheritdoc /> public override long Offer(DirectBufferVector[] vectors, ReservedValueSupplier reservedValueSupplier = null) { int length = DirectBufferVector.ValidateAndComputeLength(vectors); long newPosition = CLOSED; if (!_isClosed) { long limit = _positionLimit.GetVolatile(); int termCount = LogBufferDescriptor.ActiveTermCount(_logMetaDataBuffer); TermAppender termAppender = _termAppenders[LogBufferDescriptor.IndexByTermCount(termCount)]; long rawTail = termAppender.RawTailVolatile(); long termOffset = rawTail & 0xFFFF_FFFFL; int termId = LogBufferDescriptor.TermId(rawTail); long position = LogBufferDescriptor.ComputeTermBeginPosition(termId, PositionBitsToShift, InitialTermId) + termOffset; if (termCount != (termId - InitialTermId)) { return(ADMIN_ACTION); } if (position < limit) { int resultingOffset; if (length <= MaxPayloadLength) { resultingOffset = termAppender.AppendUnfragmentedMessage(_headerWriter, vectors, length, reservedValueSupplier, termId); } else { CheckMaxMessageLength(length); resultingOffset = termAppender.AppendFragmentedMessage(_headerWriter, vectors, length, MaxPayloadLength, reservedValueSupplier, termId); } newPosition = NewPosition(termCount, (int)termOffset, termId, position, resultingOffset); } else { newPosition = BackPressureStatus(position, length); } } return(newPosition); }
/// <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); }