Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        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);
        }