예제 #1
0
        public void try_read_does_not_cache_anything_and_returns_record_once_it_is_written_later()
        {
            var writerchk = new InMemoryCheckpoint(0);
            var chaserchk = new InMemoryCheckpoint(0);
            var db        = new TFChunkDb(TFChunkHelper.CreateDbConfig(PathName, writerchk, chaserchk));

            db.Open();

            var writer = new TFChunkWriter(db);

            writer.Open();

            var reader = new TFChunkReader(db, writerchk, 0);

            Assert.IsFalse(reader.TryReadNext().Success);

            var  rec = LogRecord.SingleWrite(0, Guid.NewGuid(), Guid.NewGuid(), "ES", -1, "ET", new byte[] { 7 }, null);
            long tmp;

            Assert.IsTrue(writer.Write(rec, out tmp));
            writer.Flush();
            writer.Close();

            var res = reader.TryReadNext();

            Assert.IsTrue(res.Success);
            Assert.AreEqual(rec, res.LogRecord);

            db.Close();
        }
        public void all_records_could_be_read_doing_forward_backward_pass()
        {
            var seqReader = new TFChunkReader(_db, _db.Config.WriterCheckpoint, 0);

            SeqReadResult res;
            int           count1 = 0;

            while ((res = seqReader.TryReadNext()).Success)
            {
                var rec = _records[count1];
                Assert.AreEqual(rec, res.LogRecord);
                Assert.AreEqual(rec.LogPosition, res.RecordPrePosition);
                Assert.AreEqual(rec.LogPosition + rec.GetSizeWithLengthPrefixAndSuffix(), res.RecordPostPosition);

                ++count1;
            }
            Assert.AreEqual(RecordsCount, count1);

            int count2 = 0;

            while ((res = seqReader.TryReadPrev()).Success)
            {
                var rec = _records[RecordsCount - count2 - 1];
                Assert.AreEqual(rec, res.LogRecord);
                Assert.AreEqual(rec.LogPosition, res.RecordPrePosition);
                Assert.AreEqual(rec.LogPosition + rec.GetSizeWithLengthPrefixAndSuffix(), res.RecordPostPosition);

                ++count2;
            }
            Assert.AreEqual(RecordsCount, count2);
        }
예제 #3
0
		public void only_the_last_record_is_marked_eof() {
			var seqReader = new TFChunkReader(_db, _db.Config.WriterCheckpoint, 0);

			SeqReadResult res;
			int count = 0;
			while ((res = seqReader.TryReadNext()).Success) {
				++count;
				Assert.AreEqual(count == RecordsCount, res.Eof);
			}

			Assert.AreEqual(RecordsCount, count);
		}
예제 #4
0
        public void try_read_returns_false_when_writer_checksum_is_zero()
        {
            var writerchk = new InMemoryCheckpoint(0);
            var chaserchk = new InMemoryCheckpoint(0);
            var db        = new TFChunkDb(TFChunkHelper.CreateDbConfig(PathName, writerchk, chaserchk));

            db.Open();

            var reader = new TFChunkReader(db, writerchk, 0);

            Assert.IsFalse(reader.TryReadNext().Success);

            db.Close();
        }
예제 #5
0
		public void records_can_be_read_forward_starting_from_any_position() {
			for (int i = 0; i < RecordsCount; ++i) {
				var seqReader = new TFChunkReader(_db, _db.Config.WriterCheckpoint, _records[i].LogPosition);

				SeqReadResult res;
				int count = 0;
				while ((res = seqReader.TryReadNext()).Success) {
					var rec = _records[i + count];
					Assert.AreEqual(rec, res.LogRecord);
					Assert.AreEqual(rec.LogPosition, res.RecordPrePosition);
					Assert.AreEqual(rec.LogPosition + rec.GetSizeWithLengthPrefixAndSuffix(), res.RecordPostPosition);

					++count;
				}

				Assert.AreEqual(RecordsCount - i, count);
			}
		}
예제 #6
0
        public void try_read_returns_false_when_writer_checksum_is_zero()
        {
            var writerchk = new InMemoryCheckpoint(0);
            var db        = new TFChunkDb(new TFChunkDbConfig(PathName,
                                                              new VersionedPatternFileNamingStrategy(PathName, "chunk-"),
                                                              10000,
                                                              0,
                                                              writerchk,
                                                              new InMemoryCheckpoint(),
                                                              new InMemoryCheckpoint(-1),
                                                              new InMemoryCheckpoint(-1)));

            db.Open();

            var reader = new TFChunkReader(db, writerchk, 0);

            Assert.IsFalse(reader.TryReadNext().Success);

            db.Close();
        }
예제 #7
0
        public void can_add_epochs_to_cache()
        {
            Assert.That(_cache.Count == 0);
            //add fist epoch to empty cache
            _epochManager.AddEpochToCache(_epochs[3]);

            Assert.That(_cache.Count == 4);
            Assert.That(_cache.First.Value.EpochNumber == _epochs[0].EpochNumber);
            Assert.That(_cache.Last.Value.EpochNumber == _epochs[3].EpochNumber);

            //add new last epoch
            _epochManager.AddEpochToCache(_epochs[4]);

            Assert.That(_cache.Count == 5);
            Assert.That(_cache.First.Value.EpochNumber == _epochs[0].EpochNumber);
            Assert.That(_cache.Last.Value.EpochNumber == _epochs[4].EpochNumber);

            //idempotent add
            _epochManager.AddEpochToCache(_epochs[1]);
            _epochManager.AddEpochToCache(_epochs[2]);
            _epochManager.AddEpochToCache(_epochs[3]);

            Assert.That(_cache.Count == 5);
            Assert.That(_cache.First.Value.EpochNumber == _epochs[0].EpochNumber);
            Assert.That(_cache.Last.Value.EpochNumber == _epochs[4].EpochNumber);

            //add new skip 1 last epoch
            _epochManager.AddEpochToCache(_epochs[6]);

            Assert.That(_cache.Count == 7);
            Assert.That(_cache.First.Value.EpochNumber == _epochs[0].EpochNumber);
            Assert.That(_cache.Last.Value.EpochNumber == _epochs[6].EpochNumber);

            //add new skip 5 last epoch
            _epochManager.AddEpochToCache(_epochs[11]);

            Assert.That(_cache.Count == 10);
            Assert.That(_cache.First.Value.EpochNumber == _epochs[2].EpochNumber);
            Assert.That(_cache.Last.Value.EpochNumber == _epochs[11].EpochNumber);

            //add last rolls cache
            _epochManager.AddEpochToCache(_epochs[12]);

            Assert.That(_cache.Count == 10);
            Assert.That(_cache.First.Value.EpochNumber == _epochs[3].EpochNumber);
            Assert.That(_cache.Last.Value.EpochNumber == _epochs[12].EpochNumber);


            //add epoch before cache
            _epochManager.AddEpochToCache(_epochs[1]);

            Assert.That(_cache.Count == 10);
            Assert.That(_cache.First.Value.EpochNumber == _epochs[3].EpochNumber);
            Assert.That(_cache.Last.Value.EpochNumber == _epochs[12].EpochNumber);

            //add idempotent first epoch
            _epochManager.AddEpochToCache(_epochs[2]);

            Assert.That(_cache.Count == 10);
            Assert.That(_cache.First.Value.EpochNumber == _epochs[3].EpochNumber);
            Assert.That(_cache.Last.Value.EpochNumber == _epochs[12].EpochNumber);

            //add idempotent last epoch
            _epochManager.AddEpochToCache(_epochs[12]);

            Assert.That(_cache.Count == 10);
            Assert.That(_cache.First.Value.EpochNumber == _epochs[3].EpochNumber);
            Assert.That(_cache.Last.Value.EpochNumber == _epochs[12].EpochNumber);

            //add disjunct skip epoch
            _epochManager.AddEpochToCache(_epochs[24]);

            Assert.That(_cache.Count == 10);
            Assert.That(_cache.First.Value.EpochNumber == _epochs[15].EpochNumber);
            Assert.That(_cache.Last.Value.EpochNumber == _epochs[24].EpochNumber);


            //cannot get epoch ahead of last cached on master
            var nextEpoch = _epochManager.GetEpochAfter(_epochs[24].EpochNumber, false);

            Assert.Null(nextEpoch);

            Assert.That(_cache.Count == 10);
            Assert.That(_cache.First.Value.EpochNumber == _epochs[15].EpochNumber);
            Assert.That(_cache.Last.Value.EpochNumber == _epochs[24].EpochNumber);

            //cannot get epoch ahead of cache on master
            nextEpoch = _epochManager.GetEpochAfter(_epochs[25].EpochNumber, false);
            Assert.Null(nextEpoch);

            Assert.That(_cache.Count == 10);
            Assert.That(_cache.First.Value.EpochNumber == _epochs[15].EpochNumber);
            Assert.That(_cache.Last.Value.EpochNumber == _epochs[24].EpochNumber);

            //can get next  in cache
            nextEpoch = _epochManager.GetEpochAfter(_epochs[20].EpochNumber, false);

            Assert.That(nextEpoch.EpochPosition == _epochs[21].EpochPosition);
            Assert.That(_cache.Count == 10);
            Assert.That(_cache.First.Value.EpochNumber == _epochs[15].EpochNumber);
            Assert.That(_cache.Last.Value.EpochNumber == _epochs[24].EpochNumber);

            //can get next from first
            nextEpoch = _epochManager.GetEpochAfter(_epochs[15].EpochNumber, false);

            Assert.That(nextEpoch.EpochPosition == _epochs[16].EpochPosition);
            Assert.That(_cache.Count == 10);
            Assert.That(_cache.First.Value.EpochNumber == _epochs[15].EpochNumber);
            Assert.That(_cache.Last.Value.EpochNumber == _epochs[24].EpochNumber);

            //can get next epoch from just before cache
            nextEpoch = _epochManager.GetEpochAfter(_epochs[14].EpochNumber, false);

            Assert.That(nextEpoch.EpochPosition == _epochs[15].EpochPosition);
            Assert.That(_cache.Count == 10);
            Assert.That(_cache.First.Value.EpochNumber == _epochs[15].EpochNumber);
            Assert.That(_cache.Last.Value.EpochNumber == _epochs[24].EpochNumber);

            //can get next epoch from before cache
            nextEpoch = _epochManager.GetEpochAfter(_epochs[10].EpochNumber, false);

            Assert.That(nextEpoch.EpochPosition == _epochs[11].EpochPosition);
            Assert.That(_cache.Count == 10);
            Assert.That(_cache.First.Value.EpochNumber == _epochs[15].EpochNumber);
            Assert.That(_cache.Last.Value.EpochNumber == _epochs[24].EpochNumber);

            //can get next epoch from 0 epoch
            nextEpoch = _epochManager.GetEpochAfter(_epochs[0].EpochNumber, false);

            Assert.That(nextEpoch.EpochPosition == _epochs[1].EpochPosition);
            Assert.That(_cache.Count == 10);
            Assert.That(_cache.First.Value.EpochNumber == _epochs[15].EpochNumber);
            Assert.That(_cache.Last.Value.EpochNumber == _epochs[24].EpochNumber);


            //can add last epoch in log
            _epochManager.AddEpochToCache(_epochs[29]);

            Assert.That(_cache.Count == 10);
            Assert.That(_cache.First.Value.EpochNumber == _epochs[20].EpochNumber);
            Assert.That(_cache.Last.Value.EpochNumber == _epochs[29].EpochNumber);

            // can write an epoch with epoch information (even though previous epochs
            // dont have epoch information)
            _epochManager.WriteNewEpoch(GetNextEpoch());
            _epochManager.WriteNewEpoch(GetNextEpoch());
            var epochsWritten = _published.OfType <SystemMessage.EpochWritten>().ToArray();

            Assert.AreEqual(2, epochsWritten.Length);
            for (int i = 0; i < epochsWritten.Length; i++)
            {
                _reader.Reposition(epochsWritten[i].Epoch.EpochPosition);
                _reader.TryReadNext();                 // read epoch
                IPrepareLogRecord <TStreamId> epochInfo;
                while (true)
                {
                    var result = _reader.TryReadNext();
                    Assert.True(result.Success);
                    if (result.LogRecord is IPrepareLogRecord <TStreamId> prepare)
                    {
                        epochInfo = prepare;
                        break;
                    }
                }
                var expectedStreamId = LogFormatHelper <TLogFormat, TStreamId> .Choose <TStreamId>(
                    SystemStreams.EpochInformationStream,
                    LogV3SystemStreams.EpochInformationStreamNumber);

                var expectedEventType = LogFormatHelper <TLogFormat, TStreamId> .Choose <TStreamId>(
                    SystemEventTypes.EpochInformation,
                    LogV3SystemEventTypes.EpochInformationNumber);

                Assert.AreEqual(expectedStreamId, epochInfo.EventStreamId);
                Assert.AreEqual(expectedEventType, epochInfo.EventType);
                Assert.AreEqual(i - 1, epochInfo.ExpectedVersion);
                Assert.AreEqual(_instanceId, epochInfo.Data.ParseJson <EpochDto>().LeaderInstanceId);
            }
        }