public void LevelDbWriteLogTest() { Version version; { DirectoryInfo directory = TestUtils.GetTestDirectory(); var currentStream = File.OpenText(Path.Combine(directory.FullName, "CURRENT")); string manifestFilename = currentStream.ReadLine(); currentStream.Close(); Log.Debug($"Reading manifest from {manifestFilename}"); using var reader = new LogReader(new FileInfo($@"{directory}{manifestFilename}")); version = Manifest.ReadVersionEdit(reader); } // Now we want to write this version var stream = new MemoryStream(); { Span <byte> bytes = Manifest.EncodeVersion(version); Log.Debug($"Manifest (length:{bytes.Length}):\n{bytes.ToArray().HexDump()}"); var writer = new LogWriter(stream); writer.WriteData(bytes); Log.Debug($"Manifest (length:{stream.Position}):\n{stream.ToArray().HexDump()}"); } { stream.Position = 0; using var verify = new LogReader(stream); while (true) { ReadOnlySpan <byte> data = verify.ReadData(); if (verify.Eof) { break; } Log.Debug($"Data:\n{data.HexDump()}"); } stream.Position = 0; Manifest.ReadVersionEdit(verify); } }
public void LevelDbReadLogTest() { // https://github.com/google/leveldb/blob/master/doc/log_format.md DirectoryInfo directory = TestUtils.GetTestDirectory(); LogReader logReader = new LogReader(new FileInfo(Path.Combine(directory.FullName, "000047.log"))); BytewiseComparator comparator = new BytewiseComparator(); bool found = false; while (true) { ReadOnlySpan <byte> data = logReader.ReadData(); if (logReader.Eof) { break; } var dataReader = new SpanReader(data); long sequenceNumber = dataReader.ReadInt64(); long size = dataReader.ReadInt32(); while (!dataReader.Eof) { byte recType = dataReader.ReadByte(); ulong v1 = dataReader.ReadVarLong(); var currentKey = dataReader.Read(v1); //CurrentKey = f5 ff ff ff eb ff ff ff 36 if (comparator.Compare(new byte[] { 0xf5, 0xff, 0xff, 0xff, 0xeb, 0xff, 0xff, 0xff, 0x36 }, currentKey) == 0) { Assert.False(found); found = true; } ulong v2 = 0; ReadOnlySpan <byte> currentVal = ReadOnlySpan <byte> .Empty; switch (recType) { case 1: // value { if (recType == 1) { v2 = dataReader.ReadVarLong(); currentVal = dataReader.Read(v2); } break; } case 0: // delete { //Assert.Fail("Unexpected delete key"); break; } default: throw new Exception("Unknown record format"); } if (Log.IsDebugEnabled) { Log.Debug($"RecType={recType}, Sequence={sequenceNumber}, Size={size}, v1={v1}, v2={v2}\nCurrentKey={currentKey.HexDump(currentKey.Length, false, false)}\nCurrentVal=\n{currentVal.HexDump(cutAfterFive: true)} "); } } } Assert.True(found); }