Exemplo n.º 1
0
        public void ShouldAppendUnfragmentedFromVectorsToEmptyLog()
        {
            var headerLength = _defaultHeader.Capacity;
            var bufferOne    = new UnsafeBuffer(new byte[64]);
            var bufferTwo    = new UnsafeBuffer(new byte[256]);

            bufferOne.SetMemory(0, bufferOne.Capacity, (byte)'1');
            bufferTwo.SetMemory(0, bufferTwo.Capacity, (byte)'2');
            var msgLength          = bufferOne.Capacity + 200;
            var framgeLength       = msgLength + headerLength;
            var alignedFrameLength = BitUtil.Align(framgeLength, FrameDescriptor.FRAME_ALIGNMENT);
            var tail = 0;

            _logMetaDataBuffer.PutLong(TermTailCounterOffset, LogBufferDescriptor.PackTail(TermID, tail));

            var vectors = new[]
            {
                new DirectBufferVector(bufferOne, 0, bufferOne.Capacity),
                new DirectBufferVector(bufferTwo, 0, 200)
            };

            Assert.AreEqual(alignedFrameLength, _termAppender.AppendUnfragmentedMessage(_headerWriter, vectors, msgLength, RVS, TermID));

            Assert.AreEqual(LogBufferDescriptor.PackTail(TermID, tail + alignedFrameLength), LogBufferDescriptor.RawTailVolatile(_logMetaDataBuffer, PartionIndex));

            A.CallTo(() => _headerWriter.Write(_termBuffer, tail, framgeLength, TermID)).MustHaveHappened()
            .Then(A.CallTo(() => _termBuffer.PutBytes(headerLength, bufferOne, 0, bufferOne.Capacity)).MustHaveHappened())
            .Then(A.CallTo(() => _termBuffer.PutBytes(headerLength + bufferOne.Capacity, bufferTwo, 0, 200)).MustHaveHappened())
            .Then(A.CallTo(() => _termBuffer.PutLong(tail + DataHeaderFlyweight.RESERVED_VALUE_OFFSET, RV, ByteOrder.LittleEndian)).MustHaveHappened())
            .Then(A.CallTo(() => _termBuffer.PutIntOrdered(tail, framgeLength)).MustHaveHappened());
        }
Exemplo n.º 2
0
        public ClusterMarkFile(
            FileInfo file,
            ClusterComponentType type,
            int errorBufferLength,
            IEpochClock epochClock,
            long timeoutMs)
        {
            var markFileExists = file.Exists;

            markFile = new MarkFile(
                file,
                markFileExists,
                MarkFileHeaderDecoder.VersionEncodingOffset(),
                MarkFileHeaderDecoder.ActivityTimestampEncodingOffset(),
                HEADER_LENGTH + errorBufferLength,
                timeoutMs,
                epochClock,
                (version) =>
            {
                if (version != MarkFileHeaderDecoder.SCHEMA_VERSION)
                {
                    throw new ClusterException("mark file version " + version + " does not match software:" + MarkFileHeaderDecoder.SCHEMA_VERSION);
                }
            },
                null);

            buffer      = markFile.Buffer();
            errorBuffer = new UnsafeBuffer(buffer, HEADER_LENGTH, errorBufferLength);


            headerEncoder.Wrap(buffer, 0);
            headerDecoder.Wrap(buffer, 0, MarkFileHeaderDecoder.BLOCK_LENGTH, MarkFileHeaderDecoder.SCHEMA_VERSION);

            if (markFileExists)
            {
                var existingErrorBuffer = new UnsafeBuffer(
                    buffer, headerDecoder.HeaderLength(), headerDecoder.ErrorBufferLength());

                SaveExistingErrors(file, existingErrorBuffer, Console.Error);

                errorBuffer.SetMemory(0, errorBufferLength, 0);
            }
            else
            {
                headerEncoder.CandidateTermId(Aeron.Aeron.NULL_VALUE);
            }

            var existingType = headerDecoder.ComponentType();

            if (existingType != ClusterComponentType.NULL && existingType != type)
            {
                throw new InvalidOperationException("existing Mark file type " + existingType + " not same as required type " + type);
            }

            headerEncoder.ComponentType(type);
            headerEncoder.HeaderLength(HEADER_LENGTH);
            headerEncoder.ErrorBufferLength(errorBufferLength);
            headerEncoder.Pid(Process.GetCurrentProcess().Id);
            headerEncoder.StartTimestamp(epochClock.Time());
        }
Exemplo n.º 3
0
        public void ShouldAppendUnfragmentedFromVectorsToEmptyLog()
        {
            var headerLength = _defaultHeader.Capacity;
            var bufferOne    = new UnsafeBuffer(new byte[64]);
            var bufferTwo    = new UnsafeBuffer(new byte[256]);

            bufferOne.SetMemory(0, bufferOne.Capacity, (byte)'1');
            bufferTwo.SetMemory(0, bufferTwo.Capacity, (byte)'2');
            var msgLength          = bufferOne.Capacity + 200;
            var framgeLength       = msgLength + headerLength;
            var alignedFrameLength = BitUtil.Align(framgeLength, FrameDescriptor.FRAME_ALIGNMENT);
            var tail = 0;

            _logMetaDataBuffer.PutLong(TermTailCounterOffset, LogBufferDescriptor.PackTail(TermID, tail));

            var vectors = new[]
            {
                new DirectBufferVector(bufferOne, 0, bufferOne.Capacity),
                new DirectBufferVector(bufferTwo, 0, 200)
            };

            Assert.That(_termAppender.AppendUnfragmentedMessage(_headerWriter, vectors, msgLength, RVS, TermID), Is.EqualTo(alignedFrameLength));

            Assert.AreEqual(LogBufferDescriptor.RawTailVolatile(_logMetaDataBuffer, PartionIndex), LogBufferDescriptor.PackTail(TermID, tail + alignedFrameLength));
        }
Exemplo n.º 4
0
        public void ShouldFreeSessionBuffer()
        {
            A.CallTo(() => header.Flags).ReturnsNextFromSequence(FrameDescriptor.BEGIN_FRAG_FLAG, FrameDescriptor.END_FRAG_FLAG);

            var       srcBuffer = new UnsafeBuffer(new byte[1024]);
            const int offset    = 0;
            var       length    = srcBuffer.Capacity / 2;

            srcBuffer.SetMemory(0, length, 65);
            srcBuffer.SetMemory(length, length, 66);

            Assert.False(adapter.FreeSessionBuffer(SESSION_ID));

            adapter.OnFragment(srcBuffer, offset, length, header);
            adapter.OnFragment(srcBuffer, length, length, header);

            Assert.True(adapter.FreeSessionBuffer(SESSION_ID));
            Assert.False(adapter.FreeSessionBuffer(SESSION_ID));
        }
Exemplo n.º 5
0
        public void ShouldAssembleTwoPartMessage()
        {
            A.CallTo(() => header.Flags).ReturnsNextFromSequence(FrameDescriptor.BEGIN_FRAG_FLAG, FrameDescriptor.END_FRAG_FLAG, FrameDescriptor.END_FRAG_FLAG);
            // Need to add this twice because FakeItEasy doesn't fall back to the implementation

            var       srcBuffer = new UnsafeBuffer(new byte[1024]);
            const int offset    = 0;
            var       length    = srcBuffer.Capacity / 2;

            srcBuffer.SetMemory(0, length, 65);
            srcBuffer.SetMemory(length, length, 66);

            adapter.OnFragment(srcBuffer, offset, length, header);
            adapter.OnFragment(srcBuffer, length, length, header);

            Func <UnsafeBuffer, bool> bufferAssertion = capturedBuffer =>
            {
                for (var i = 0; i < srcBuffer.Capacity; i++)
                {
                    if (capturedBuffer.GetByte(i) != srcBuffer.GetByte(i))
                    {
                        return(false);
                    }
                }
                return(true);
            };

            Func <Header, bool> headerAssertion = capturedHeader => capturedHeader.SessionId == SESSION_ID &&
                                                  capturedHeader.Flags == FrameDescriptor.END_FRAG_FLAG;

            A.CallTo(() => delegateFragmentHandler(
                         A <UnsafeBuffer> .That.Matches(bufferAssertion, "buffer"),
                         offset,
                         length * 2,
                         A <Header> .That.Matches(headerAssertion, "header")))
            .MustHaveHappened(Repeated.Exactly.Once);
        }
Exemplo n.º 6
0
        public void ShouldAppendFragmentedFromVectorsWithNonZeroOffsetToEmptyLog()
        {
            var mtu                  = 2048;
            var headerLength         = _defaultHeader.Capacity;
            var maxPayloadLength     = mtu - headerLength;
            var bufferOneLength      = 64;
            var offset               = 15;
            var bufferTwoTotalLength = 3000;
            var bufferTwoLength      = bufferTwoTotalLength - offset;
            var bufferOne            = new UnsafeBuffer(new byte[bufferOneLength]);
            var bufferTwo            = new UnsafeBuffer(new byte[bufferTwoTotalLength]);

            bufferOne.SetMemory(0, bufferOne.Capacity, (byte)'1');
            bufferTwo.SetMemory(0, bufferTwo.Capacity, (byte)'2');
            var msgLength       = bufferOneLength + bufferTwoLength;
            var tail            = 0;
            var frameOneLength  = mtu;
            var frameTwoLength  = (msgLength - (mtu - headerLength)) + headerLength;
            var resultingOffset = frameOneLength + BitUtil.Align(frameTwoLength, FrameDescriptor.FRAME_ALIGNMENT);

            _logMetaDataBuffer.PutLong(TermTailCounterOffset, LogBufferDescriptor.PackTail(TermID, tail));

            var vectors = new[]
            {
                new DirectBufferVector(bufferOne, 0, bufferOneLength),
                new DirectBufferVector(bufferTwo, offset, bufferTwoLength)
            };

            Assert.That(_termAppender.AppendFragmentedMessage(_headerWriter, vectors, msgLength, maxPayloadLength, RVS, TermID), Is.EqualTo(resultingOffset));

            var tail2                    = tail + frameOneLength;
            var bufferTwoOffset          = maxPayloadLength - bufferOneLength + offset;
            var fragmentTwoPayloadLength = bufferTwoLength - (maxPayloadLength - bufferOneLength);

            A.CallTo(() => _headerWriter.Write(_termBuffer, tail, frameOneLength, TermID)).MustHaveHappened()
            .Then(A.CallTo(() => _termBuffer.PutBytes(headerLength, bufferOne, 0, bufferOneLength)).MustHaveHappened())
            .Then(A.CallTo(() => _termBuffer.PutBytes(headerLength + bufferOneLength, bufferTwo, offset, maxPayloadLength - bufferOneLength)).MustHaveHappened())
            .Then(A.CallTo(() => _termBuffer.PutLong(tail + DataHeaderFlyweight.RESERVED_VALUE_OFFSET, RV, ByteOrder.LittleEndian)).MustHaveHappened())
            .Then(A.CallTo(() => _termBuffer.PutIntOrdered(tail, frameOneLength)).MustHaveHappened())
            .Then(A.CallTo(() => _headerWriter.Write(_termBuffer, tail2, frameTwoLength, TermID)).MustHaveHappened())
            .Then(A.CallTo(() => _termBuffer.PutBytes(tail2 + headerLength, bufferTwo, bufferTwoOffset, fragmentTwoPayloadLength)).MustHaveHappened())
            .Then(A.CallTo(() => _termBuffer.PutLong(tail2 + DataHeaderFlyweight.RESERVED_VALUE_OFFSET, RV, ByteOrder.LittleEndian)).MustHaveHappened())
            .Then(A.CallTo(() => _termBuffer.PutIntOrdered(tail2, frameTwoLength)).MustHaveHappened());
        }
Exemplo n.º 7
0
        public void ShouldAssembleFourPartMessage()
        {
            A.CallTo(() => header.Flags).ReturnsNextFromSequence <byte>(FrameDescriptor.BEGIN_FRAG_FLAG, 0, 0, FrameDescriptor.END_FRAG_FLAG, FrameDescriptor.END_FRAG_FLAG);

            var       srcBuffer = new UnsafeBuffer(new byte[1024]);
            const int offset    = 0;
            var       length    = srcBuffer.Capacity / 4;

            for (var i = 0; i < 4; i++)
            {
                srcBuffer.SetMemory(i * length, length, (byte)(65 + i));
            }

            adapter.OnFragment(srcBuffer, offset, length, header);
            adapter.OnFragment(srcBuffer, offset + length, length, header);
            adapter.OnFragment(srcBuffer, offset + (length * 2), length, header);
            adapter.OnFragment(srcBuffer, offset + (length * 3), length, header);


            Func <UnsafeBuffer, bool> bufferAssertion = capturedBuffer =>
            {
                for (var i = 0; i < srcBuffer.Capacity; i++)
                {
                    if (capturedBuffer.GetByte(i) != srcBuffer.GetByte(i))
                    {
                        return(false);
                    }
                }
                return(true);
            };

            Func <Header, bool> headerAssertion = capturedHeader => capturedHeader.SessionId == SESSION_ID &&
                                                  capturedHeader.Flags == FrameDescriptor.END_FRAG_FLAG;

            A.CallTo(() => delegateFragmentHandler(
                         A <UnsafeBuffer> .That.Matches(bufferAssertion, "buffer"),
                         offset,
                         length * 4,
                         A <Header> .That.Matches(headerAssertion, "header")))
            .MustHaveHappened(Repeated.Exactly.Once);
        }
Exemplo n.º 8
0
        public ClusterMarkFile(
            FileInfo file,
            ClusterComponentType type,
            int errorBufferLength,
            IEpochClock epochClock,
            long timeoutMs)
        {
            var markFileExists = file.Exists;

            markFile = new MarkFile(
                file,
                markFileExists,
                MarkFileHeaderDecoder.VersionEncodingOffset(),
                MarkFileHeaderDecoder.ActivityTimestampEncodingOffset(),
                HEADER_LENGTH + errorBufferLength,
                timeoutMs,
                epochClock,
                (version) =>
            {
                if (VERSION_FAILED == version && markFileExists)
                {
                    Console.WriteLine("mark file version -1 indicates error on previous startup.");
                }
                else if (SemanticVersion.Major(version) != AeronCluster.Configuration.MAJOR_VERSION)
                {
                    throw new ArgumentException("mark file major version " + SemanticVersion.Major(version) +
                                                " does not match software:" + AeronCluster.Configuration.MAJOR_VERSION);
                }
            },
                null);

            buffer      = markFile.Buffer();
            errorBuffer = new UnsafeBuffer(buffer, HEADER_LENGTH, errorBufferLength);


            headerEncoder.Wrap(buffer, 0);
            headerDecoder.Wrap(buffer, 0, MarkFileHeaderDecoder.BLOCK_LENGTH, MarkFileHeaderDecoder.SCHEMA_VERSION);

            if (markFileExists)
            {
                var existingErrorBuffer = new UnsafeBuffer(
                    buffer, headerDecoder.HeaderLength(), headerDecoder.ErrorBufferLength());

                SaveExistingErrors(file, existingErrorBuffer, Console.Error);

                errorBuffer.SetMemory(0, errorBufferLength, 0);
            }
            else
            {
                headerEncoder.CandidateTermId(Aeron.Aeron.NULL_VALUE);
            }

            var existingType = headerDecoder.ComponentType();

            if (existingType != ClusterComponentType.NULL && existingType != type)
            {
                if (existingType != ClusterComponentType.BACKUP || ClusterComponentType.CONSENSUS_MODULE != type)
                {
                    throw new InvalidOperationException(
                              "existing Mark file type " + existingType + " not same as required type " + type);
                }
            }

            headerEncoder.ComponentType(type);
            headerEncoder.HeaderLength(HEADER_LENGTH);
            headerEncoder.ErrorBufferLength(errorBufferLength);
            headerEncoder.Pid(Process.GetCurrentProcess().Id);
            headerEncoder.StartTimestamp(epochClock.Time());
        }
Exemplo n.º 9
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);
 }