Beispiel #1
0
        public void CanOpenDbAfterDeletingAndCompacting()
        {
            using (var fileCollection = new InMemoryFileCollection())
            {
                var options = new KeyValueDBOptions
                {
                    Compression                    = new NoCompressionStrategy(),
                    FileCollection                 = fileCollection,
                    FileSplitSize                  = 4096,
                    OpenUpToCommitUlong            = null,
                    PreserveHistoryUpToCommitUlong = null,
                    CompactorScheduler             = null,
                };

                using (var kvDb = new KeyValueDB(options))
                {
                    using (var tr = kvDb.StartWritingTransaction().Result)
                    {
                        tr.CreateOrUpdateKeyValue(new byte[5], new byte[3000]);
                        tr.CreateOrUpdateKeyValue(new byte[6], new byte[2000]);
                        tr.Commit();
                    }

                    kvDb.Compact(CancellationToken.None);
                }
                using (var kvDb = new KeyValueDB(options))
                {
                    using (var tr = kvDb.StartWritingTransaction().Result)
                    {
                        tr.FindFirstKey();
                        tr.EraseCurrent();
                        tr.Commit();
                    }

                    kvDb.Compact(CancellationToken.None);
                }

                using (var kvDb = new KeyValueDB(options))
                {
                    // If there is error in KVI 3 it will create new KVI 4, but there is no problem in KVI 3
                    Assert.Null(kvDb.FileCollection.FileInfoByIdx(4));
                }
            }
        }
Beispiel #2
0
 public void CompactionWaitsForFinishingOldTransactionsBeforeRemovingFiles()
 {
     using (var fileCollection = new InMemoryFileCollection())
     {
         using (var db = new KeyValueDB(fileCollection, new NoCompressionStrategy(), 1024, null))
         {
             using (var tr = db.StartTransaction())
             {
                 tr.CreateOrUpdateKeyValue(_key1, new byte[1024]);
                 tr.CreateOrUpdateKeyValue(Key2, new byte[10]);
                 tr.Commit();
             }
             var longTr = db.StartTransaction();
             using (var tr = db.StartTransaction())
             {
                 tr.FindExactKey(_key1);
                 tr.EraseCurrent();
                 tr.Commit();
             }
             Task.Run(() =>
             {
                 db.Compact(new CancellationToken());
             });
             Thread.Sleep(2000);
             Console.WriteLine(db.CalcStats());
             Assert.True(4 <= fileCollection.GetCount()); // 2 Logs, 1 Value, 1 KeyIndex, (optinal 1 Unknown (old KeyIndex))
             longTr.Dispose();
             Thread.Sleep(1000);
             Assert.Equal(2u, fileCollection.GetCount()); // 1 Log, 1 KeyIndex
             using (var tr = db.StartTransaction())
             {
                 tr.CreateOrUpdateKeyValue(_key3, new byte[10]);
                 tr.Commit();
             }
             using (var db2 = new KeyValueDB(fileCollection, new NoCompressionStrategy(), 1024))
             {
                 using (var tr = db2.StartTransaction())
                 {
                     Assert.True(tr.FindExactKey(_key3));
                 }
             }
         }
     }
 }
Beispiel #3
0
        static void Main(string[] args)
        {
            if (args.Length < 1)
            {
                Console.WriteLine("Need to have just one parameter with directory of ObjectDB");
                Console.WriteLine(
                    "Optional second parameter: nicedump, comparedump, diskdump, dump, dumpnull, stat, fileheaders, compact, export, import, leaks, leakscode, size, frequency, interactive, check");
                return;
            }

            var action = "nicedump";

            if (args.Length > 1)
            {
                action = args[1].ToLowerInvariant();
            }

            switch (action)
            {
            case "realpath":
            {
                var res = PlatformMethods.Instance.RealPath(args[0]);
                if (res == null)
                {
                    Console.WriteLine("Error resolving real path for " + args[0]);
                }
                else
                {
                    Console.WriteLine(res);
                }
                break;
            }

            case "nicedump":
            {
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(new KeyValueDBOptions
                    {
                        FileCollection      = dfc,
                        ReadOnly            = true,
                        OpenUpToCommitUlong = args.Length >= 3 ? (ulong?) ulong.Parse(args[2]) : null
                    });
                using var odb = new ObjectDB();
                odb.Open(kdb, false);
                using var trkv = kdb.StartReadOnlyTransaction();
                using var tr   = odb.StartTransaction();
                Console.WriteLine("CommitUlong: " + tr.GetCommitUlong());
                Console.WriteLine("Ulong[0] oid: " + trkv.GetUlong(0));
                Console.WriteLine("Ulong[1] dictid: " + trkv.GetUlong(1));
                var visitor  = new ToConsoleVisitorNice();
                var iterator = new ODBIterator(tr, visitor);
                iterator.Iterate();

                break;
            }

            case "interactive":
            {
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(new KeyValueDBOptions
                    {
                        FileCollection      = dfc,
                        ReadOnly            = true,
                        OpenUpToCommitUlong = args.Length >= 3 ? (ulong?) ulong.Parse(args[2]) : null
                    });
                using var odb = new ObjectDB();
                odb.Open(kdb, false);
                using var trkv = kdb.StartReadOnlyTransaction();
                using var tr   = odb.StartTransaction();
                Console.WriteLine("CommitUlong: " + tr.GetCommitUlong());
                Console.WriteLine("Ulong[0] oid: " + trkv.GetUlong(0));
                Console.WriteLine("Ulong[1] dictid: " + trkv.GetUlong(1));
                var visitor  = new ToConsoleVisitorNice();
                var iterator = new ODBIterator(tr, visitor);
                iterator.LoadGlobalInfo(true);
                Interactive(iterator, visitor);

                break;
            }

            case "comparedump":
            {
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(new KeyValueDBOptions
                    {
                        FileCollection      = dfc,
                        ReadOnly            = true,
                        OpenUpToCommitUlong = args.Length >= 3 ? (ulong?) ulong.Parse(args[2]) : null
                    });
                using var odb = new ObjectDB();
                odb.Open(kdb, false);
                using var trkv = kdb.StartReadOnlyTransaction();
                using var tr   = odb.StartTransaction();
                var visitor  = new ToConsoleVisitorForComparison();
                var iterator = new ODBIterator(tr, visitor);
                iterator.Iterate(sortTableByNameAsc: true);

                break;
            }

            case "comparesplitdump":
            {
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(new KeyValueDBOptions
                    {
                        FileCollection      = dfc,
                        ReadOnly            = true,
                        OpenUpToCommitUlong = args.Length >= 3 ? (ulong?) ulong.Parse(args[2]) : null
                    });
                using var odb = new ObjectDB();
                odb.Open(kdb, false);
                using var trkv = kdb.StartReadOnlyTransaction();
                using var tr   = odb.StartTransaction();
                var visitor  = new ToFilesVisitorForComparison(HashType.Crc32);
                var iterator = new ODBIterator(tr, visitor);
                iterator.Iterate(sortTableByNameAsc: true);

                break;
            }

            case "diskdump":
            {
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(new KeyValueDBOptions
                    {
                        FileCollection      = dfc,
                        ReadOnly            = true,
                        OpenUpToCommitUlong = args.Length >= 3 ? (ulong?) ulong.Parse(args[2]) : null
                    });
                using var odb = new ObjectDB();
                using var tst = File.CreateText(Path.Combine(args[0], "dump.txt"));
                odb.Open(kdb, false);
                using var trkv = kdb.StartReadOnlyTransaction();
                using var tr   = odb.StartTransaction();
                tst.WriteLine("CommitUlong: " + tr.GetCommitUlong());
                tst.WriteLine("Ulong[0] oid: " + trkv.GetUlong(0));
                tst.WriteLine("Ulong[1] dictid: " + trkv.GetUlong(1));
                var visitor  = new ToFileVisitorNice(tst);
                var iterator = new ODBIterator(tr, visitor);
                iterator.Iterate();

                break;
            }

            case "dump":
            {
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(new KeyValueDBOptions
                    {
                        FileCollection      = dfc,
                        ReadOnly            = true,
                        OpenUpToCommitUlong = args.Length >= 3 ? (ulong?) ulong.Parse(args[2]) : null
                    });
                using var odb = new ObjectDB();
                odb.Open(kdb, false);
                using var trkv = kdb.StartReadOnlyTransaction();
                using var tr   = odb.StartTransaction();
                Console.WriteLine("CommitUlong: " + tr.GetCommitUlong());
                Console.WriteLine("Ulong[0] oid: " + trkv.GetUlong(0));
                Console.WriteLine("Ulong[1] dictid: " + trkv.GetUlong(1));
                var visitor  = new ToConsoleVisitor();
                var iterator = new ODBIterator(tr, visitor);
                iterator.Iterate();

                break;
            }

            case "dumpnull":
            case "null":
            {
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(new KeyValueDBOptions
                    {
                        FileCollection      = dfc,
                        ReadOnly            = true,
                        OpenUpToCommitUlong = args.Length >= 3 ? (ulong?) ulong.Parse(args[2]) : null
                    });
                using var odb = new ObjectDB();
                odb.Open(kdb, false);
                using var tr = odb.StartTransaction();
                var visitor  = new ToNullVisitor();
                var iterator = new ODBIterator(tr, visitor);
                iterator.Iterate();

                break;
            }

            case "check":
            {
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(new KeyValueDBOptions
                    {
                        FileCollection      = dfc,
                        ReadOnly            = true,
                        OpenUpToCommitUlong = args.Length >= 3 ? (ulong?) ulong.Parse(args[2]) : null
                    });
                using var transaction = kdb.StartReadOnlyTransaction();
                var keyValueCount = transaction.GetKeyValueCount();
                transaction.FindFirstKey();
                for (long kv = 0; kv < keyValueCount; kv++)
                {
                    transaction.GetKey();
                    transaction.GetValue();
                    transaction.FindNextKey();
                }

                break;
            }

            case "stat":
            {
                var sw = new Stopwatch();
                sw.Start();
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new BTreeKeyValueDB(new KeyValueDBOptions
                    {
                        FileCollection      = dfc,
                        ReadOnly            = true,
                        Compression         = new SnappyCompressionStrategy(),
                        OpenUpToCommitUlong = args.Length >= 3 ? (ulong?) ulong.Parse(args[2]) : null
                    });
                sw.Stop();
                Console.WriteLine(
                    $"Opened in {sw.Elapsed.TotalSeconds:F1}s Using {Process.GetCurrentProcess().WorkingSet64 / 1024 / 1024}MB RAM");
                Console.WriteLine(kdb.CalcStats());

                break;
            }

            case "statm":     // Stat but by old managed implementation
            {
                var sw = new Stopwatch();
                sw.Start();
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(new KeyValueDBOptions
                    {
                        FileCollection      = dfc,
                        ReadOnly            = true,
                        Compression         = new SnappyCompressionStrategy(),
                        OpenUpToCommitUlong = args.Length >= 3 ? (ulong?) ulong.Parse(args[2]) : null
                    });
                sw.Stop();
                Console.WriteLine(
                    $"Opened in {sw.Elapsed.TotalSeconds:F1}s Using {Process.GetCurrentProcess().WorkingSet64 / 1024 / 1024}MB RAM");
                Console.WriteLine(kdb.CalcStats());

                break;
            }

            case "kvi":
            {
                var sw = Stopwatch.StartNew();
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new BTreeKeyValueDB(dfc, new SnappyCompressionStrategy(), 100 * 1024 * 1024, null);
                Console.WriteLine(
                    $"Opened in {sw.Elapsed.TotalSeconds:F1}s Using {Process.GetCurrentProcess().WorkingSet64 / 1024 / 1024}MB RAM");
                sw.Restart();
                kdb.CreateKvi(CancellationToken.None);
                Console.WriteLine(
                    $"Created kvi in {sw.Elapsed.TotalSeconds:F1}s Using {Process.GetCurrentProcess().WorkingSet64 / 1024 / 1024}MB RAM");

                break;
            }

            case "kvim":     // Kvi but by old managed implementation
            {
                var sw = Stopwatch.StartNew();
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(dfc, new SnappyCompressionStrategy(), 100 * 1024 * 1024, null);
                Console.WriteLine(
                    $"Opened in {sw.Elapsed.TotalSeconds:F1}s Using {Process.GetCurrentProcess().WorkingSet64 / 1024 / 1024}MB RAM");
                sw.Restart();
                kdb.CreateKvi(CancellationToken.None);
                Console.WriteLine(
                    $"Created kvi in {sw.Elapsed.TotalSeconds:F1}s Using {Process.GetCurrentProcess().WorkingSet64 / 1024 / 1024}MB RAM");

                break;
            }

            case "fileheaders":
            {
                using var dfc = new OnDiskFileCollection(args[0]);
                var fcfi = new FileCollectionWithFileInfos(dfc);
                foreach (var fi in fcfi.FileInfos)
                {
                    var details = "";
                    switch (fi.Value)
                    {
                    case IKeyIndex keyIndex:
                    {
                        details =
                            $"KVCount:{keyIndex.KeyValueCount} CommitUlong:{keyIndex.CommitUlong} TrLogFileId:{keyIndex.TrLogFileId} TrLogOffset:{keyIndex.TrLogOffset}";
                        var usedFiles = keyIndex.UsedFilesInOlderGenerations;
                        if (usedFiles != null)
                        {
                            details += " UsedFiles:" + string.Join(",", usedFiles);
                        }

                        break;
                    }

                    case IFileTransactionLog trlog:
                        details = $"Previous File Id: {trlog.PreviousFileId}";
                        break;
                    }

                    Console.WriteLine("File {0} Guid:{3} Gen:{2} Type:{1} {4}", fi.Key,
                                      fi.Value.FileType.ToString(), fi.Value.Generation, fi.Value.Guid, details);
                }

                break;
            }

            case "compact":
            {
                var sw = new Stopwatch();
                sw.Start();
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(dfc, new SnappyCompressionStrategy(), 100 * 1024 * 1024, null);
                kdb.Logger    = new ConsoleKvdbLogger();
                sw.Stop();
                Console.WriteLine(
                    $"Opened in {sw.Elapsed.TotalSeconds:F1}s Using {Process.GetCurrentProcess().WorkingSet64 / 1024 / 1024}MB RAM");
                sw.Restart();
                while (kdb.Compact(new CancellationToken()))
                {
                    sw.Stop();
                    Console.WriteLine($"Compaction iteration in {sw.Elapsed.TotalSeconds:F1}");
                    sw.Restart();
                }

                sw.Stop();
                Console.WriteLine(
                    $"Final compaction in {sw.Elapsed.TotalSeconds:F1} Using {Process.GetCurrentProcess().WorkingSet64 / 1024 / 1024}MB RAM");
                Console.WriteLine(kdb.CalcStats());

                break;
            }

            case "export":
            {
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(new KeyValueDBOptions
                    {
                        FileCollection      = dfc,
                        ReadOnly            = true,
                        Compression         = new SnappyCompressionStrategy(),
                        OpenUpToCommitUlong = args.Length >= 3 ? (ulong?) ulong.Parse(args[2]) : null
                    });
                using var tr = kdb.StartReadOnlyTransaction();
                using var st = File.Create(Path.Combine(args[0], "snapshot.dat"));
                KeyValueDBExportImporter.Export(tr, st);

                break;
            }

            case "import":
            {
                using var st  = File.OpenRead(Path.Combine(args[0], "snapshot.dat"));
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(dfc);
                using var tr  = kdb.StartTransaction();
                KeyValueDBExportImporter.Import(tr, st);
                tr.Commit();

                break;
            }

            case "leaks":
            {
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(new KeyValueDBOptions
                    {
                        FileCollection      = dfc,
                        ReadOnly            = true,
                        Compression         = new SnappyCompressionStrategy(),
                        OpenUpToCommitUlong = args.Length >= 3 ? (ulong?) ulong.Parse(args[2]) : null
                    });
                using var odb = new ObjectDB();
                Console.WriteLine("Leaks: ");
                odb.Open(kdb, false);
                odb.DumpLeaks();

                break;
            }

            case "leakscode":
            {
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(new KeyValueDBOptions
                    {
                        FileCollection      = dfc,
                        ReadOnly            = true,
                        Compression         = new SnappyCompressionStrategy(),
                        OpenUpToCommitUlong = args.Length >= 3 ? (ulong?) ulong.Parse(args[2]) : null
                    });
                using var odb = new ObjectDB();
                odb.Open(kdb, false);
                odb.DumpLeaksCode();

                break;
            }

            case "frequency":
            {
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(new KeyValueDBOptions
                    {
                        FileCollection      = dfc,
                        ReadOnly            = true,
                        Compression         = new SnappyCompressionStrategy(),
                        OpenUpToCommitUlong = args.Length >= 3 ? (ulong?) ulong.Parse(args[2]) : null
                    });
                using var odb = new ObjectDB();
                odb.Open(kdb, false);
                using var tr = odb.StartTransaction();
                var visitor  = new ToConsoleFrequencyVisitor();
                var iterator = new ODBIterator(tr, visitor);
                iterator.Iterate();
                visitor.OutputStatistic();
            }
            break;

            case "size":
            {
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(new KeyValueDBOptions
                    {
                        FileCollection      = dfc,
                        ReadOnly            = true,
                        Compression         = new SnappyCompressionStrategy(),
                        OpenUpToCommitUlong = args.Length >= 3 ? (ulong?) ulong.Parse(args[2]) : null
                    });
                using var odb = new ObjectDB();
                odb.Open(kdb, false);
                using var tr = odb.StartTransaction();
                var visitor  = new ToConsoleSizeVisitor();
                var iterator = new ODBIterator(tr, visitor);
                iterator.Iterate();
            }
            break;

            default:
            {
                Console.WriteLine($"Unknown action: {action}");
                break;
            }
            }
        }
Beispiel #4
0
        public void CanRoolback()
        {
            using (var fileCollection = new InMemoryFileCollection())
            {
                using (var kv = new KeyValueDB(new KeyValueDBOptions
                {
                    FileCollection = fileCollection,
                    FileSplitSize = 1024,
                    Compression = new NoCompressionStrategy()
                }))
                {
                    for (var i = 1; i < 100; i++)
                    {
                        using (var tr = kv.StartTransaction())
                        {
                            var key = new byte[4];
                            BTDB.Buffer.PackUnpack.PackInt32BE(key, 0, i);
                            tr.CreateOrUpdateKeyValueUnsafe(key, new byte[200]);
                            tr.CreateOrUpdateKeyValueUnsafe(key, new byte[0]);
                            tr.SetCommitUlong((ulong)i);
                            tr.Commit();
                        }
                        if (i % 5 == 0)
                        {
                            kv.Compact(new System.Threading.CancellationToken());
                        }
                        if (i == 50)
                        {
                            kv.PreserveHistoryUpToCommitUlong = (ulong)i;
                        }
                    }
                }
                using (var kv = new KeyValueDB(new KeyValueDBOptions
                {
                    FileCollection = fileCollection,
                    FileSplitSize = 1024,
                    OpenUpToCommitUlong = 50,
                    PreserveHistoryUpToCommitUlong = 80,
                    Compression = new NoCompressionStrategy()
                }))
                {
                    using (var tr = kv.StartTransaction())
                    {
                        Assert.Equal(50, tr.GetKeyValueCount());
                    }
                    kv.Compact(new System.Threading.CancellationToken());
                }
                using (var kv = new KeyValueDB(new KeyValueDBOptions
                {
                    FileCollection = fileCollection,
                    FileSplitSize = 1024,
                    OpenUpToCommitUlong = 80,
                    PreserveHistoryUpToCommitUlong = 80,
                    Compression = new NoCompressionStrategy()
                }))
                {
                    using (var tr = kv.StartTransaction())
                    {
                        Assert.Equal(80, tr.GetKeyValueCount());
                    }
                }

                // Openning without long enough preserving in previous open, removed posibility to rollback before it
                using (var kv = new KeyValueDB(new KeyValueDBOptions
                {
                    FileCollection = fileCollection,
                    FileSplitSize = 1024,
                    OpenUpToCommitUlong = 50,
                    PreserveHistoryUpToCommitUlong = 80,
                    Compression = new NoCompressionStrategy()
                }))
                {
                    using (var tr = kv.StartTransaction())
                    {
                        Assert.Equal(80, tr.GetKeyValueCount());
                    }
                }
            }
        }
Beispiel #5
0
        public void CompatorShouldNotBePesimistDespiteRunningTransactions()
        {
            using (var fileCollection = new InMemoryFileCollection())
            {
                var options = new KeyValueDBOptions
                {
                    Compression        = new NoCompressionStrategy(),
                    FileCollection     = fileCollection,
                    FileSplitSize      = 8096,
                    CompactorScheduler = CompactorScheduler.Instance,
                };

                using (var kvDb = new KeyValueDB(options))
                {
                    for (var i = 0; i < 100; i++)
                    {
                        using (var tr = kvDb.StartWritingTransaction().Result)
                        {
                            var key = new byte[4];
                            BTDB.Buffer.PackUnpack.PackInt32BE(key, 0, i);
                            tr.CreateOrUpdateKeyValueUnsafe(key, new byte[2000]);
                            tr.Commit();
                        }
                    }
                    kvDb.Compact(new System.Threading.CancellationToken());
                    var fileCountAfterFirstCompaction = fileCollection.GetCount();
                    using (var trOlder = kvDb.StartReadOnlyTransaction())
                    {
                        for (var i = 0; i < 50; i++)
                        {
                            using (var tr = kvDb.StartWritingTransaction().Result)
                            {
                                var key = new byte[4];
                                BTDB.Buffer.PackUnpack.PackInt32BE(key, 0, i * 2);
                                tr.FindExactKey(key);
                                tr.EraseCurrent();
                                tr.Commit();
                            }
                        }
                        while (kvDb.Compact(new System.Threading.CancellationToken()))
                        {
                            ;
                        }
                        Assert.InRange(fileCollection.GetCount(), fileCountAfterFirstCompaction + 2, fileCountAfterFirstCompaction + 50);
                    }
                    for (var i = 0; i < 4; i++)
                    {
                        using (var tr = kvDb.StartWritingTransaction().Result)
                        {
                            var key = new byte[4];
                            BTDB.Buffer.PackUnpack.PackInt32BE(key, 0, i);
                            tr.CreateOrUpdateKeyValueUnsafe(key, new byte[2000]);
                            tr.Commit();
                        }
                    }
                    while (kvDb.Compact(new System.Threading.CancellationToken()))
                    {
                        ;
                    }
                    Assert.InRange(fileCollection.GetCount(), fileCountAfterFirstCompaction / 3, 2 * fileCountAfterFirstCompaction / 3);
                }
            }
        }
Beispiel #6
0
        public void CompatorShouldNotBePesimist()
        {
            using (var fileCollection = new InMemoryFileCollection())
            {
                var options = new KeyValueDBOptions
                {
                    Compression                    = new NoCompressionStrategy(),
                    FileCollection                 = fileCollection,
                    FileSplitSize                  = 8096,
                    OpenUpToCommitUlong            = null,
                    PreserveHistoryUpToCommitUlong = null,
                    CompactorScheduler             = CompactorScheduler.Instance,
                };

                using (var kvDb = new KeyValueDB(options))
                {
                    for (var i = 0; i < 100; i++)
                    {
                        using (var tr = kvDb.StartWritingTransaction().Result)
                        {
                            var key = new byte[4];
                            BTDB.Buffer.PackUnpack.PackInt32BE(key, 0, i);
                            tr.CreateOrUpdateKeyValueUnsafe(key, new byte[2000]);
                            tr.SetCommitUlong((ulong)i);
                            tr.Commit();
                        }
                    }
                    kvDb.PreserveHistoryUpToCommitUlong = 100;
                    kvDb.Compact(new System.Threading.CancellationToken());
                    var fileCountAfterFirstCompaction = fileCollection.GetCount();
                    for (var i = 0; i < 50; i++)
                    {
                        using (var tr = kvDb.StartWritingTransaction().Result)
                        {
                            var key = new byte[4];
                            BTDB.Buffer.PackUnpack.PackInt32BE(key, 0, i);
                            tr.FindExactKey(key);
                            tr.EraseCurrent();
                            tr.SetCommitUlong(100 + (ulong)i);
                            tr.Commit();
                        }
                    }
                    kvDb.PreserveHistoryUpToCommitUlong = 150;
                    kvDb.Compact(new System.Threading.CancellationToken());
                    Assert.InRange(fileCollection.GetCount(), fileCountAfterFirstCompaction + 1, fileCountAfterFirstCompaction + 3);
                    using (var trOlder = kvDb.StartReadOnlyTransaction())
                    {
                        for (var i = 50; i < 100; i++)
                        {
                            using (var tr = kvDb.StartWritingTransaction().Result)
                            {
                                var key = new byte[4];
                                BTDB.Buffer.PackUnpack.PackInt32BE(key, 0, i);
                                tr.FindExactKey(key);
                                tr.EraseCurrent();
                                tr.SetCommitUlong(100 + (ulong)i);
                                tr.Commit();
                            }
                        }
                        kvDb.Compact(new System.Threading.CancellationToken());
                        Assert.InRange(fileCollection.GetCount(), fileCountAfterFirstCompaction / 3, 2 * fileCountAfterFirstCompaction / 3);
                        kvDb.PreserveHistoryUpToCommitUlong = 200;
                        kvDb.Compact(new System.Threading.CancellationToken());
                        Assert.InRange(fileCollection.GetCount(), fileCountAfterFirstCompaction / 3, 2 * fileCountAfterFirstCompaction / 3);
                    }
                    kvDb.Compact(new System.Threading.CancellationToken());
                    Assert.InRange <uint>(fileCollection.GetCount(), 1, 4);
                }
            }
        }
Beispiel #7
0
 public void ReopenAndReopenWithRoolbackDoesNotCorruptDB()
 {
     using (var fileCollection = new InMemoryFileCollection())
     {
         using (var kv = new KeyValueDB(new KeyValueDBOptions
         {
             FileCollection = fileCollection,
             FileSplitSize = 4096,
             Compression = new NoCompressionStrategy()
         }))
         {
             for (var i = 1; i < 60; i++)
             {
                 using (var tr = kv.StartTransaction())
                 {
                     var key = new byte[4];
                     BTDB.Buffer.PackUnpack.PackInt32BE(key, 0, i);
                     tr.CreateOrUpdateKeyValueUnsafe(key, new byte[2000]);
                     tr.SetCommitUlong((ulong)i);
                     tr.Commit();
                 }
                 if (i % 2 == 0)
                 {
                     using (var tr = kv.StartTransaction())
                     {
                         var key = new byte[4];
                         BTDB.Buffer.PackUnpack.PackInt32BE(key, 0, i - 1);
                         tr.FindExactKey(key);
                         tr.EraseCurrent();
                         tr.Commit();
                     }
                 }
                 if (i % 5 == 0)
                 {
                     kv.Compact(new System.Threading.CancellationToken());
                 }
                 if (i == 50)
                 {
                     kv.PreserveHistoryUpToCommitUlong = (ulong)i;
                 }
             }
         }
         using (var kv = new KeyValueDB(new KeyValueDBOptions
         {
             FileCollection = fileCollection,
             FileSplitSize = 4096,
             PreserveHistoryUpToCommitUlong = 50,
             Compression = new NoCompressionStrategy()
         }))
         {
             kv.Compact(new System.Threading.CancellationToken());
             ReadAllValues(kv);
         }
         using (var kv = new KeyValueDB(new KeyValueDBOptions
         {
             FileCollection = fileCollection,
             FileSplitSize = 4096,
             PreserveHistoryUpToCommitUlong = 50,
             OpenUpToCommitUlong = 50,
             Compression = new NoCompressionStrategy()
         }))
         {
             ReadAllValues(kv);
         }
     }
 }
        public void Run()
        {
            var collection = new InMemoryFileCollection();

            using (var kvDb = new KeyValueDB(collection, new NoCompressionStrategy(), 100 * 1024 * 1024))
            {
                ulong itemsCount = 0;
                using (var objDb = new ObjectDB())
                {
                    objDb.Open(kvDb, false);

                    Console.WriteLine("started generating");
                    using (var tr = objDb.StartWritingTransaction().Result)
                    {
                        var objects = tr.Singleton <SmallObjects>();
                        while (true)
                        {
                            objects.Items.Add(itemsCount, new SmallObject()
                            {
                                Id = itemsCount, Label = "bu"
                            });

                            if (itemsCount % 1_000_000 == 0)
                            {
                                Console.WriteLine("Generated {0}", itemsCount);
                            }

                            if (itemsCount % 1000 == 0 && collection.GetCount() == 20)
                            {
                                break;
                            }

                            itemsCount++;
                        }

                        tr.Commit();
                    }
                    Console.WriteLine("finished generating");


                    using (var tr = objDb.StartWritingTransaction().Result)
                    {
                        var objects = tr.Singleton <SmallObjects>();
                        itemsCount = (ulong)objects.Items.Count;
                        tr.Commit();
                    }

                    Console.WriteLine("removing items started");
                    using (var tr = objDb.StartWritingTransaction().Result)
                    {
                        var objects = tr.Singleton <SmallObjects>();
                        for (ulong i = 0; i < itemsCount / 5; i++)
                        {
                            if (i % 2 == 0)
                            {
                                continue;
                            }

                            objects.Items.Remove(i);
                        }

                        tr.Commit();
                    }

                    Console.WriteLine("removing items finished");

                    var transactionCreationStarted = new ManualResetEventSlim(false);
                    var compactionFinished         = new ManualResetEventSlim(false);

                    Task.Run(() =>
                    {
                        Console.WriteLine("Started waiting for transaction creating");
                        transactionCreationStarted.Wait();
                        Console.WriteLine("Started Compacting");
                        Trace.Assert(kvDb.Compact(CancellationToken.None));
                        Console.WriteLine("Finished Compacting");
                        compactionFinished.Set();
                    });

                    Console.WriteLine("Started concurrent transaction creation");

                    long      msMax      = 0;
                    long      average    = 0;
                    long      iterations = 0;
                    Stopwatch watch      = new Stopwatch();

                    while (true)
                    {
                        var compactionFinishedBeforeLasttransaction = compactionFinished.IsSet;
                        iterations++;
                        watch.Start();
                        var task = objDb.StartWritingTransaction();
                        if (!transactionCreationStarted.IsSet)
                        {
                            transactionCreationStarted.Set();
                        }

                        task.Wait();

                        var ms = watch.ElapsedMilliseconds;
                        average += ms;
                        msMax    = Math.Max(ms, msMax);
                        watch.Reset();
                        using (var tr = task.Result)
                        {
                            tr.Commit();
                        }

                        if ((compactionFinishedBeforeLasttransaction && compactionFinished.IsSet))
                        {
                            break;
                        }
                    }
                    Console.WriteLine("Finished concurrent transaction creation, longest transaction create time was {0}ms, " +
                                      "average {1}ms, iterations {2}", msMax, average / (double)iterations, iterations);
                }
            }
        }
Beispiel #9
0
 public void PreapprovedCommitAndCompaction()
 {
     using (var fileCollection = new InMemoryFileCollection())
     {
         using (var db = new KeyValueDB(fileCollection, new NoCompressionStrategy(), 1024))
         {
             using (var tr = db.StartWritingTransaction().Result)
             {
                 tr.CreateOrUpdateKeyValue(_key1, new byte[1024]);
                 tr.CreateOrUpdateKeyValue(Key2, new byte[10]);
                 tr.Commit();
             }
             db.Compact(new CancellationToken());
             using (var tr = db.StartWritingTransaction().Result)
             {
                 tr.EraseRange(0, 0);
                 tr.Commit();
             }
             db.Compact(new CancellationToken());
             using (var db2 = new KeyValueDB(fileCollection, new NoCompressionStrategy(), 1024))
             {
                 using (var tr = db2.StartTransaction())
                 {
                     Assert.False(tr.FindExactKey(_key1));
                     Assert.True(tr.FindExactKey(Key2));
                 }
             }
         }
     }
 }
Beispiel #10
0
 public void CompactionDoesNotRemoveStillUsedFiles()
 {
     using (var fileCollection = new InMemoryFileCollection())
     {
         using (var db = new KeyValueDB(fileCollection, new NoCompressionStrategy(), 1024, null))
         {
             using (var tr = db.StartTransaction())
             {
                 tr.CreateOrUpdateKeyValue(_key1, new byte[1024]);
                 tr.CreateOrUpdateKeyValue(Key2, new byte[10]);
                 tr.Commit();
             }
             var longTr = db.StartTransaction();
             using (var tr = db.StartTransaction())
             {
                 tr.FindExactKey(_key1);
                 tr.EraseCurrent();
                 tr.Commit();
             }
             db.Compact(new CancellationToken());
             Assert.Equal(3u, fileCollection.GetCount()); // 2 Logs, 1 KeyIndex
             longTr.Dispose();
             db.Compact(new CancellationToken());
             Assert.Equal(2u, fileCollection.GetCount()); // 1 Log, 1 KeyIndex
             using (var tr = db.StartTransaction())
             {
                 tr.CreateOrUpdateKeyValue(_key3, new byte[10]);
                 tr.Commit();
             }
             using (var db2 = new KeyValueDB(fileCollection, new NoCompressionStrategy(), 1024))
             {
                 using (var tr = db2.StartTransaction())
                 {
                     Assert.True(tr.FindExactKey(_key3));
                 }
             }
         }
     }
 }
Beispiel #11
0
        static void Main(string[] args)
        {
            if (args.Length < 1)
            {
                Console.WriteLine("Need to have just one parameter with directory of ObjectDB");
                return;
            }

            var action = "nicedump";

            if (args.Length > 1)
            {
                action = args[1].ToLowerInvariant();
            }

            switch (action)
            {
            case "nicedump":
            {
                using (var dfc = new OnDiskFileCollection(args[0]))
                    using (var kdb = new KeyValueDB(dfc))
                        using (var odb = new ObjectDB())
                        {
                            odb.Open(kdb, false);
                            using (var trkv = kdb.StartReadOnlyTransaction())
                                using (var tr = odb.StartTransaction())
                                {
                                    Console.WriteLine("CommitUlong: " + tr.GetCommitUlong());
                                    Console.WriteLine("Ulong[0] oid: " + trkv.GetUlong(0));
                                    Console.WriteLine("Ulong[1] dictid: " + trkv.GetUlong(1));
                                    var visitor  = new ToConsoleVisitorNice();
                                    var iterator = new ODBIterator(tr, visitor);
                                    iterator.Iterate();
                                }
                        }

                break;
            }

            case "diskdump":
            {
                using (var dfc = new OnDiskFileCollection(args[0]))
                    using (var kdb = new KeyValueDB(dfc))
                        using (var odb = new ObjectDB())
                            using (var tst = File.CreateText(Path.Combine(args[0], "dump.txt")))
                            {
                                odb.Open(kdb, false);
                                using (var trkv = kdb.StartReadOnlyTransaction())
                                    using (var tr = odb.StartTransaction())
                                    {
                                        tst.WriteLine("CommitUlong: " + tr.GetCommitUlong());
                                        tst.WriteLine("Ulong[0] oid: " + trkv.GetUlong(0));
                                        tst.WriteLine("Ulong[1] dictid: " + trkv.GetUlong(1));
                                        var visitor  = new ToFileVisitorNice(tst);
                                        var iterator = new ODBIterator(tr, visitor);
                                        iterator.Iterate();
                                    }
                            }

                break;
            }

            case "dump":
            {
                using (var dfc = new OnDiskFileCollection(args[0]))
                    using (var kdb = new KeyValueDB(dfc))
                        using (var odb = new ObjectDB())
                        {
                            odb.Open(kdb, false);
                            using (var trkv = kdb.StartReadOnlyTransaction())
                                using (var tr = odb.StartTransaction())
                                {
                                    Console.WriteLine("CommitUlong: " + tr.GetCommitUlong());
                                    Console.WriteLine("Ulong[0] oid: " + trkv.GetUlong(0));
                                    Console.WriteLine("Ulong[1] dictid: " + trkv.GetUlong(1));
                                    var visitor  = new ToConsoleVisitor();
                                    var iterator = new ODBIterator(tr, visitor);
                                    iterator.Iterate();
                                }
                        }

                break;
            }

            case "dumpnull":
            case "null":
            {
                using (var dfc = new OnDiskFileCollection(args[0]))
                    using (var kdb = new KeyValueDB(dfc))
                        using (var odb = new ObjectDB())
                        {
                            odb.Open(kdb, false);
                            using (var tr = odb.StartTransaction())
                            {
                                var visitor  = new ToNullVisitor();
                                var iterator = new ODBIterator(tr, visitor);
                                iterator.Iterate();
                            }
                        }

                break;
            }

            case "stat":
            {
                using (var dfc = new OnDiskFileCollection(args[0]))
                    using (var kdb = new KeyValueDB(dfc))
                    {
                        Console.WriteLine(kdb.CalcStats());
                    }

                break;
            }

            case "fileheaders":
            {
                using (var dfc = new OnDiskFileCollection(args[0]))
                {
                    var fcfi = new FileCollectionWithFileInfos(dfc);
                    foreach (var fi in fcfi.FileInfos)
                    {
                        var details = "";
                        switch (fi.Value)
                        {
                        case IKeyIndex keyindex:
                        {
                            details =
                                $"KVCount:{keyindex.KeyValueCount} CommitUlong:{keyindex.CommitUlong} TrLogFileId:{keyindex.TrLogFileId} TrLogOffset:{keyindex.TrLogOffset}";
                            var usedFiles = keyindex.UsedFilesInOlderGenerations;
                            if (usedFiles != null)
                            {
                                details += " UsedFiles:" + string.Join(",", usedFiles);
                            }

                            break;
                        }

                        case IFileTransactionLog trlog:
                            details = string.Format("Previous File Id: {0}", trlog.PreviousFileId);
                            break;
                        }

                        Console.WriteLine("File {0} Guid:{3} Gen:{2} Type:{1} {4}", fi.Key,
                                          fi.Value.FileType.ToString(), fi.Value.Generation, fi.Value.Guid, details);
                    }
                }

                break;
            }

            case "compact":
            {
                var sw = new Stopwatch();
                sw.Start();
                using (var dfc = new OnDiskFileCollection(args[0]))
                    using (var kdb = new KeyValueDB(dfc, new SnappyCompressionStrategy(), 100 * 1024 * 1024, null))
                    {
                        kdb.Logger = new ConsoleKvdbLogger();
                        sw.Stop();
                        Console.WriteLine($"Opened in {sw.Elapsed.TotalSeconds:F1}");
                        sw.Restart();
                        while (kdb.Compact(new CancellationToken()))
                        {
                            sw.Stop();
                            Console.WriteLine($"Compaction iteration in {sw.Elapsed.TotalSeconds:F1}");
                            sw.Restart();
                        }

                        sw.Stop();
                        Console.WriteLine($"Final compaction in {sw.Elapsed.TotalSeconds:F1}");
                        Console.WriteLine(kdb.CalcStats());
                    }

                break;
            }

            case "export":
            {
                using (var dfc = new OnDiskFileCollection(args[0]))
                    using (var kdb = new KeyValueDB(dfc))
                        using (var tr = kdb.StartReadOnlyTransaction())
                            using (var st = File.Create(Path.Combine(args[0], "snapshot.dat")))
                            {
                                KeyValueDBExportImporter.Export(tr, st);
                            }

                break;
            }

            case "import":
            {
                using (var st = File.OpenRead(Path.Combine(args[0], "snapshot.dat")))
                    using (var dfc = new OnDiskFileCollection(args[0]))
                        using (var kdb = new KeyValueDB(dfc))
                            using (var tr = kdb.StartTransaction())
                            {
                                KeyValueDBExportImporter.Import(tr, st);
                                tr.Commit();
                            }

                break;
            }

            default:
            {
                Console.WriteLine($"Unknown action: {action}");
                break;
            }
            }
        }
Beispiel #12
0
        static void Main(string[] args)
        {
            if (args.Length < 1)
            {
                Console.WriteLine("Need to have just one parameter with directory of ObjectDB");
                return;
            }
            var action = "nicedump";

            if (args.Length > 1)
            {
                action = args[1].ToLowerInvariant();
            }

            switch (action)
            {
            case "nicedump":
            {
                using (var dfc = new OnDiskFileCollection(args[0]))
                    using (var kdb = new KeyValueDB(dfc))
                        using (var odb = new ObjectDB())
                        {
                            odb.Open(kdb, false);
                            using (var trkv = kdb.StartReadOnlyTransaction())
                                using (var tr = odb.StartTransaction())
                                {
                                    Console.WriteLine("CommitUlong: " + tr.GetCommitUlong());
                                    Console.WriteLine("Ulong[0] oid: " + trkv.GetUlong(0));
                                    Console.WriteLine("Ulong[1] dictid: " + trkv.GetUlong(1));
                                    var visitor  = new ToConsoleVisitorNice();
                                    var iterator = new ODBIterator(tr, visitor);
                                    iterator.Iterate();
                                }
                        }
                break;
            }

            case "dump":
            {
                using (var dfc = new OnDiskFileCollection(args[0]))
                    using (var kdb = new KeyValueDB(dfc))
                        using (var odb = new ObjectDB())
                        {
                            odb.Open(kdb, false);
                            using (var trkv = kdb.StartReadOnlyTransaction())
                                using (var tr = odb.StartTransaction())
                                {
                                    Console.WriteLine("CommitUlong: " + tr.GetCommitUlong());
                                    Console.WriteLine("Ulong[0] oid: " + trkv.GetUlong(0));
                                    Console.WriteLine("Ulong[1] dictid: " + trkv.GetUlong(1));
                                    var visitor  = new ToConsoleVisitor();
                                    var iterator = new ODBIterator(tr, visitor);
                                    iterator.Iterate();
                                }
                        }
                break;
            }

            case "dumpnull":
            case "null":
            {
                using (var dfc = new OnDiskFileCollection(args[0]))
                    using (var kdb = new KeyValueDB(dfc))
                        using (var odb = new ObjectDB())
                        {
                            odb.Open(kdb, false);
                            using (var tr = odb.StartTransaction())
                            {
                                var visitor  = new ToNullVisitor();
                                var iterator = new ODBIterator(tr, visitor);
                                iterator.Iterate();
                            }
                        }
                break;
            }

            case "stat":
            {
                using (var dfc = new OnDiskFileCollection(args[0]))
                    using (var kdb = new KeyValueDB(dfc))
                    {
                        Console.WriteLine(kdb.CalcStats());
                    }
                break;
            }

            case "compact":
            {
                using (var dfc = new OnDiskFileCollection(args[0]))
                    using (var kdb = new KeyValueDB(dfc, new SnappyCompressionStrategy(), 100 * 1024 * 1024, null))
                    {
                        Console.WriteLine("Starting first compaction");
                        while (kdb.Compact(new CancellationToken()))
                        {
                            Console.WriteLine(kdb.CalcStats());
                            Console.WriteLine("Another compaction needed");
                        }
                        Console.WriteLine(kdb.CalcStats());
                    }
                break;
            }

            case "export":
            {
                using (var dfc = new OnDiskFileCollection(args[0]))
                    using (var kdb = new KeyValueDB(dfc))
                        using (var tr = kdb.StartReadOnlyTransaction())
                            using (var st = File.Create(Path.Combine(args[0], "export.dat")))
                            {
                                KeyValueDBExportImporter.Export(tr, st);
                            }
                break;
            }

            default:
            {
                Console.WriteLine($"Unknown action: {action}");
                break;
            }
            }
        }
Beispiel #13
0
        static void Main(string[] args)
        {
            if (args.Length < 1)
            {
                Console.WriteLine("Need to have just one parameter with directory of ObjectDB");
                return;
            }
            var action = "dump";
            if (args.Length > 1)
            {
                action = args[1].ToLowerInvariant();
            }

            switch (action)
            {
                case "dump":
                    {
                        using (var dfc = new OnDiskFileCollection(args[0]))
                        using (var kdb = new KeyValueDB(dfc))
                        using (var odb = new ObjectDB())
                        {
                            odb.Open(kdb, false);
                            using (var tr = odb.StartTransaction())
                            {
                                var visitor = new ToStringVisitor();
                                var iterator = new ODBIterator(tr, visitor);
                                iterator.Iterate();
                                var text = visitor.ToString();
                                Console.WriteLine(text);
                            }
                        }
                        break;
                    }
                case "stat":
                    {
                        using (var dfc = new OnDiskFileCollection(args[0]))
                        using (var kdb = new KeyValueDB(dfc))
                        {
                            Console.WriteLine(kdb.CalcStats());
                        }
                        break;
                    }
                case "compact":
                    {
                        using (var dfc = new OnDiskFileCollection(args[0]))
                        using (var kdb = new KeyValueDB(dfc, new SnappyCompressionStrategy(), 100 * 1024 * 1024, null))
                        {
                            Console.WriteLine("Starting first compaction");
                            while (kdb.Compact(new CancellationToken()))
                            {
                                Console.WriteLine(kdb.CalcStats());
                                Console.WriteLine("Another compaction needed");
                            }
                            Console.WriteLine(kdb.CalcStats());
                        }
                        break;
                    }
                case "export":
                    {
                        using (var dfc = new OnDiskFileCollection(args[0]))
                        using (var kdb = new KeyValueDB(dfc))
                        using (var tr = kdb.StartReadOnlyTransaction())
                        using (var st = File.Create(Path.Combine(args[0], "export.dat")))
                        {
                            KeyValueDBExportImporter.Export(tr, st);
                        }
                        break;
                    }
                default:
                    {
                        Console.WriteLine($"Unknown action: {action}");
                        break;
                    }
            }
        }
Beispiel #14
0
 public void CompactionWaitsForFinishingOldTransactionsBeforeRemovingFiles()
 {
     using (var fileCollection = new InMemoryFileCollection())
     {
         using (var db = new KeyValueDB(fileCollection, new NoCompressionStrategy(), 1024))
         {
             using (var tr = db.StartTransaction())
             {
                 tr.CreateOrUpdateKeyValue(_key1, new byte[1024]);
                 tr.CreateOrUpdateKeyValue(Key2, new byte[10]);
                 tr.Commit();
             }
             var longTr = db.StartTransaction();
             using (var tr = db.StartTransaction())
             {
                 tr.FindExactKey(_key1);
                 tr.EraseCurrent();
                 tr.Commit();
             }
             db.Compact();
             Thread.Sleep(2000);
             Console.WriteLine(db.CalcStats());
             Assert.True(4 <= fileCollection.GetCount()); // 2 Logs, 1 Value, 1 KeyIndex, (optinal 1 Unknown (old KeyIndex))
             longTr.Dispose();
             Thread.Sleep(1000);
             Assert.Equal(2u, fileCollection.GetCount()); // 1 Log, 1 KeyIndex
             using (var tr = db.StartTransaction())
             {
                 tr.CreateOrUpdateKeyValue(_key3, new byte[10]);
                 tr.Commit();
             }
             using (var db2 = new KeyValueDB(fileCollection, new NoCompressionStrategy(), 1024))
             {
                 using (var tr = db2.StartTransaction())
                 {
                     Assert.True(tr.FindExactKey(_key3));
                 }
             }
         }
     }
 }
Beispiel #15
0
        static void Main(string[] args)
        {
            if (args.Length < 1)
            {
                Console.WriteLine("Need to have just one parameter with directory of ObjectDB");
                Console.WriteLine(
                    "Optional second parameter: nicedump, comparedump, diskdump, dump, dumpnull, stat, fileheaders, compact, export, import, leaks, leakscode, size, frequency, interactive, check, findsplitbrain, fulldiskdump, trldump");
                return;
            }

            var action = "nicedump";

            if (args.Length > 1)
            {
                action = args[1].ToLowerInvariant();
            }

            switch (action)
            {
            case "realpath":
            {
                var res = PlatformMethods.Instance.RealPath(args[0]);
                if (res == null)
                {
                    Console.WriteLine("Error resolving real path for " + args[0]);
                }
                else
                {
                    Console.WriteLine(res);
                }
                break;
            }

            case "nicedump":
            {
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(new KeyValueDBOptions
                    {
                        FileCollection      = dfc,
                        ReadOnly            = true,
                        OpenUpToCommitUlong = args.Length >= 3 ? (ulong?) ulong.Parse(args[2]) : null
                    });
                using var odb = new ObjectDB();
                odb.Open(kdb, false);
                using var trkv = kdb.StartReadOnlyTransaction();
                using var tr   = odb.StartTransaction();
                Console.WriteLine("CommitUlong: " + tr.GetCommitUlong());
                Console.WriteLine("Ulong[0] oid: " + trkv.GetUlong(0));
                Console.WriteLine("Ulong[1] dictid: " + trkv.GetUlong(1));
                var visitor  = new ToConsoleVisitorNice();
                var iterator = new ODBIterator(tr, visitor);
                iterator.Iterate();

                break;
            }

            case "interactive":
            {
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(new KeyValueDBOptions
                    {
                        FileCollection      = dfc,
                        ReadOnly            = true,
                        OpenUpToCommitUlong = args.Length >= 3 ? (ulong?) ulong.Parse(args[2]) : null
                    });
                using var odb = new ObjectDB();
                odb.Open(kdb, false);
                using var trkv = kdb.StartReadOnlyTransaction();
                using var tr   = odb.StartTransaction();
                Console.WriteLine("CommitUlong: " + tr.GetCommitUlong());
                Console.WriteLine("Ulong[0] oid: " + trkv.GetUlong(0));
                Console.WriteLine("Ulong[1] dictid: " + trkv.GetUlong(1));
                var visitor  = new ToConsoleVisitorNice();
                var iterator = new ODBIterator(tr, visitor);
                iterator.LoadGlobalInfo(true);
                Interactive(iterator, visitor);

                break;
            }

            case "comparedump":
            {
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(new KeyValueDBOptions
                    {
                        FileCollection      = dfc,
                        ReadOnly            = true,
                        OpenUpToCommitUlong = args.Length >= 3 ? (ulong?) ulong.Parse(args[2]) : null
                    });
                using var odb = new ObjectDB();
                odb.Open(kdb, false);
                using var trkv = kdb.StartReadOnlyTransaction();
                using var tr   = odb.StartTransaction();
                var visitor  = new ToConsoleVisitorForComparison();
                var iterator = new ODBIterator(tr, visitor);
                iterator.Iterate(sortTableByNameAsc: true);

                break;
            }

            case "comparesplitdump":
            {
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(new KeyValueDBOptions
                    {
                        FileCollection      = dfc,
                        ReadOnly            = true,
                        OpenUpToCommitUlong = args.Length >= 3 ? (ulong?) ulong.Parse(args[2]) : null
                    });
                using var odb = new ObjectDB();
                odb.Open(kdb, false);
                using var trkv    = kdb.StartReadOnlyTransaction();
                using var tr      = odb.StartTransaction();
                using var visitor = new ToFilesVisitorForComparison(HashType.Crc32);
                var iterator = new ODBIterator(tr, visitor);
                iterator.Iterate(sortTableByNameAsc: true);

                break;
            }

            case "fulldiskdump":
            {
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(new KeyValueDBOptions
                    {
                        FileCollection      = dfc,
                        ReadOnly            = true,
                        OpenUpToCommitUlong = args.Length >= 3 ? (ulong?) ulong.Parse(args[2]) : null
                    });
                using var odb = new ObjectDB();
                odb.Open(kdb, false);
                using var trkv    = kdb.StartReadOnlyTransaction();
                using var tr      = odb.StartTransaction();
                using var visitor = new ToFilesVisitorWithSecondaryKeys();
                var iterator = new ODBIterator(tr, visitor);
                iterator.Iterate(sortTableByNameAsc: true);

                break;
            }

            case "diskdump":
            {
                var dbDir = args[0];
                var openUpToCommitUlong = args.Length >= 3 ? (ulong?)ulong.Parse(args[2]) : null;
                var fileName            = Path.Combine(dbDir, "dump.txt");

                DiskDump(dbDir, fileName, openUpToCommitUlong);
                break;
            }

            case "dump":
            {
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(new KeyValueDBOptions
                    {
                        FileCollection      = dfc,
                        ReadOnly            = true,
                        OpenUpToCommitUlong = args.Length >= 3 ? (ulong?) ulong.Parse(args[2]) : null
                    });
                using var odb = new ObjectDB();
                odb.Open(kdb, false);
                using var trkv = kdb.StartReadOnlyTransaction();
                using var tr   = odb.StartTransaction();
                Console.WriteLine("CommitUlong: " + tr.GetCommitUlong());
                Console.WriteLine("Ulong[0] oid: " + trkv.GetUlong(0));
                Console.WriteLine("Ulong[1] dictid: " + trkv.GetUlong(1));
                var visitor  = new ToConsoleVisitor();
                var iterator = new ODBIterator(tr, visitor);
                iterator.Iterate();

                break;
            }

            case "dumpnull":
            case "null":
            {
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(new KeyValueDBOptions
                    {
                        FileCollection      = dfc,
                        ReadOnly            = true,
                        OpenUpToCommitUlong = args.Length >= 3 ? (ulong?) ulong.Parse(args[2]) : null
                    });
                using var odb = new ObjectDB();
                odb.Open(kdb, false);
                using var tr = odb.StartTransaction();
                var visitor  = new ToNullVisitor();
                var iterator = new ODBIterator(tr, visitor);
                iterator.Iterate();

                break;
            }

            case "check":
            {
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(new KeyValueDBOptions
                    {
                        FileCollection      = dfc,
                        ReadOnly            = true,
                        OpenUpToCommitUlong = args.Length >= 3 ? (ulong?) ulong.Parse(args[2]) : null
                    });
                using var transaction = kdb.StartReadOnlyTransaction();
                var keyValueCount = transaction.GetKeyValueCount();
                transaction.FindFirstKey(ReadOnlySpan <byte> .Empty);
                for (long kv = 0; kv < keyValueCount; kv++)
                {
                    transaction.GetKey();
                    transaction.GetValue();
                    transaction.FindNextKey(ReadOnlySpan <byte> .Empty);
                }

                break;
            }

            case "stat":
            {
                var sw = new Stopwatch();
                sw.Start();
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(new KeyValueDBOptions
                    {
                        FileCollection      = dfc,
                        ReadOnly            = true,
                        Compression         = new SnappyCompressionStrategy(),
                        OpenUpToCommitUlong = args.Length >= 3 ? (ulong?) ulong.Parse(args[2]) : null
                    });
                sw.Stop();
                Console.WriteLine(
                    $"Opened in {sw.Elapsed.TotalSeconds:F1}s Using {Process.GetCurrentProcess().WorkingSet64 / 1024 / 1024}MB RAM");
                Console.WriteLine(kdb.CalcStats());

                break;
            }

            case "statm":     // Stat but by old managed implementation
            {
                var sw = new Stopwatch();
                sw.Start();
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(new KeyValueDBOptions
                    {
                        FileCollection      = dfc,
                        ReadOnly            = true,
                        Compression         = new SnappyCompressionStrategy(),
                        OpenUpToCommitUlong = args.Length >= 3 ? (ulong?) ulong.Parse(args[2]) : null
                    });
                sw.Stop();
                Console.WriteLine(
                    $"Opened in {sw.Elapsed.TotalSeconds:F1}s Using {Process.GetCurrentProcess().WorkingSet64 / 1024 / 1024}MB RAM");
                Console.WriteLine(kdb.CalcStats());

                break;
            }

            case "kvi":
            {
                var sw = Stopwatch.StartNew();
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new BTreeKeyValueDB(dfc, new SnappyCompressionStrategy(), 100 * 1024 * 1024, null);
                Console.WriteLine(
                    $"Opened in {sw.Elapsed.TotalSeconds:F1}s Using {Process.GetCurrentProcess().WorkingSet64 / 1024 / 1024}MB RAM");
                sw.Restart();
                kdb.CreateKvi(CancellationToken.None);
                Console.WriteLine(
                    $"Created kvi in {sw.Elapsed.TotalSeconds:F1}s Using {Process.GetCurrentProcess().WorkingSet64 / 1024 / 1024}MB RAM");

                break;
            }

            case "kvim":     // Kvi but by old managed implementation
            {
                var sw = Stopwatch.StartNew();
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(dfc, new SnappyCompressionStrategy(), 100 * 1024 * 1024, null);
                Console.WriteLine(
                    $"Opened in {sw.Elapsed.TotalSeconds:F1}s Using {Process.GetCurrentProcess().WorkingSet64 / 1024 / 1024}MB RAM");
                sw.Restart();
                kdb.CreateKvi(CancellationToken.None);
                Console.WriteLine(
                    $"Created kvi in {sw.Elapsed.TotalSeconds:F1}s Using {Process.GetCurrentProcess().WorkingSet64 / 1024 / 1024}MB RAM");

                break;
            }

            case "fileheaders":
            {
                using var dfc = new OnDiskFileCollection(args[0]);
                var fcfi = new FileCollectionWithFileInfos(dfc);
                foreach (var fi in fcfi.FileInfos)
                {
                    var details = "";
                    switch (fi.Value)
                    {
                    case IKeyIndex keyIndex:
                    {
                        details =
                            $"KVCount:{keyIndex.KeyValueCount} CommitUlong:{keyIndex.CommitUlong} TrLogFileId:{keyIndex.TrLogFileId} TrLogOffset:{keyIndex.TrLogOffset}\n";
                        details += LoadUsedFilesFromKvi(keyIndex, fcfi, fi.Key);
                        break;
                    }

                    case IFileTransactionLog trlog:
                        details = $"Previous File Id: {trlog.PreviousFileId}";
                        break;
                    }

                    Console.WriteLine("File {0} Guid:{3} Gen:{2} Type:{1} {4}", fi.Key,
                                      fi.Value.FileType.ToString(), fi.Value.Generation, fi.Value.Guid, details);
                }

                break;
            }

            case "compact":
            {
                var sw = new Stopwatch();
                sw.Start();
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(dfc, new SnappyCompressionStrategy(), 100 * 1024 * 1024, null);
                kdb.Logger    = new ConsoleKvdbLogger();
                sw.Stop();
                Console.WriteLine(
                    $"Opened in {sw.Elapsed.TotalSeconds:F1}s Using {Process.GetCurrentProcess().WorkingSet64 / 1024 / 1024}MB RAM");
                sw.Restart();
                while (kdb.Compact(new CancellationToken()))
                {
                    sw.Stop();
                    Console.WriteLine($"Compaction iteration in {sw.Elapsed.TotalSeconds:F1}");
                    sw.Restart();
                }

                sw.Stop();
                Console.WriteLine(
                    $"Final compaction in {sw.Elapsed.TotalSeconds:F1} Using {Process.GetCurrentProcess().WorkingSet64 / 1024 / 1024}MB RAM");
                Console.WriteLine(kdb.CalcStats());

                break;
            }

            case "export":
            {
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(new KeyValueDBOptions
                    {
                        FileCollection      = dfc,
                        ReadOnly            = true,
                        Compression         = new SnappyCompressionStrategy(),
                        OpenUpToCommitUlong = args.Length >= 3 ? (ulong?) ulong.Parse(args[2]) : null
                    });
                using var tr = kdb.StartReadOnlyTransaction();
                using var st = File.Create(Path.Combine(args[0], "snapshot.dat"));
                KeyValueDBExportImporter.Export(tr, st);

                break;
            }

            case "import":
            {
                using var st  = File.OpenRead(Path.Combine(args[0], "snapshot.dat"));
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(dfc);
                using var tr  = kdb.StartTransaction();
                KeyValueDBExportImporter.Import(tr, st);
                tr.Commit();

                break;
            }

            case "leaks":
            {
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(new KeyValueDBOptions
                    {
                        FileCollection      = dfc,
                        ReadOnly            = true,
                        Compression         = new SnappyCompressionStrategy(),
                        OpenUpToCommitUlong = args.Length >= 3 ? (ulong?) ulong.Parse(args[2]) : null
                    });
                using var odb = new ObjectDB();
                Console.WriteLine("Leaks: ");
                odb.Open(kdb, false);
                odb.DumpLeaks();

                break;
            }

            case "leakscode":
            {
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(new KeyValueDBOptions
                    {
                        FileCollection      = dfc,
                        ReadOnly            = true,
                        Compression         = new SnappyCompressionStrategy(),
                        OpenUpToCommitUlong = args.Length >= 3 ? (ulong?) ulong.Parse(args[2]) : null
                    });
                using var odb = new ObjectDB();
                odb.Open(kdb, false);
                odb.DumpLeaksCode();

                break;
            }

            case "frequency":
            {
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(new KeyValueDBOptions
                    {
                        FileCollection      = dfc,
                        ReadOnly            = true,
                        Compression         = new SnappyCompressionStrategy(),
                        OpenUpToCommitUlong = args.Length >= 3 ? (ulong?) ulong.Parse(args[2]) : null
                    });
                using var odb = new ObjectDB();
                odb.Open(kdb, false);
                using var tr = odb.StartTransaction();
                var visitor  = new ToConsoleFrequencyVisitor();
                var iterator = new ODBIterator(tr, visitor);
                iterator.Iterate();
                visitor.OutputStatistic();
            }
            break;

            case "size":
            {
                using var dfc = new OnDiskFileCollection(args[0]);
                using var kdb = new KeyValueDB(new KeyValueDBOptions
                    {
                        FileCollection      = dfc,
                        ReadOnly            = true,
                        Compression         = new SnappyCompressionStrategy(),
                        OpenUpToCommitUlong = args.Length >= 3 ? (ulong?) ulong.Parse(args[2]) : null
                    });
                using var odb = new ObjectDB();
                odb.Open(kdb, false);
                using var tr = odb.StartTransaction();
                var visitor  = new ToConsoleSizeVisitor();
                var iterator = new ODBIterator(tr, visitor);
                iterator.Iterate();
            }
            break;

            case "findsplitbrain":
            {
                if (args.Length != 6)
                {
                    Console.WriteLine(
                        "usage: ODBDump Eagle_0 findsplitbrain Eagle_1 1000 100000 INestedEventTable");
                    return;
                }

                var startEvent   = ulong.Parse(args[3]);
                var endEvent     = ulong.Parse(args[4]);
                var relationName = args[5];

                var(found, lastGood, firstBad) =
                    FindSplitBrain(args[0], args[2], relationName, startEvent, endEvent);
                if (found)
                {
                    Console.WriteLine($"Split occured between {lastGood} and {firstBad}");
                    DiskDump(args[0], $"dump_{lastGood}_0.txt", lastGood);
                    DiskDump(args[2], $"dump_{lastGood}_1.txt", lastGood);
                    DiskDump(args[0], $"dump_{firstBad}_0.txt", firstBad);
                    DiskDump(args[2], $"dump_{firstBad}_1.txt", firstBad);
                }
            }
            break;

            case "trldump":
            {
                ITrlVisitor visitor = new ConsoleTrlVisitor();
                using var dfc = new OnDiskFileCollection(args[0]);
                foreach (var file in dfc.Enumerate())
                {
                    try
                    {
                        visitor.StartFile(file.Index, file.GetSize());
                        var reader = new TrlFileReader(file);
                        reader.Iterate(visitor);
                    }
                    catch (Exception e)
                    {
                        visitor.OperationDetail("Failure " + e.Message);
                    }

                    visitor.EndOperation();
                }
            }
            break;

            default:
            {
                Console.WriteLine($"Unknown action: {action}");
                break;
            }
            }
        }
Beispiel #16
0
        static void Main(string[] args)
        {
            if (args.Length < 1)
            {
                Console.WriteLine("Need to have just one parameter with directory of ObjectDB");
                return;
            }
            var action = "nicedump";

            if (args.Length > 1)
            {
                action = args[1].ToLowerInvariant();
            }

            switch (action)
            {
            case "nicedump":
            {
                using (var dfc = new OnDiskFileCollection(args[0]))
                    using (var kdb = new KeyValueDB(dfc))
                        using (var odb = new ObjectDB())
                        {
                            odb.Open(kdb, false);
                            using (var trkv = kdb.StartReadOnlyTransaction())
                                using (var tr = odb.StartTransaction())
                                {
                                    Console.WriteLine("CommitUlong: " + tr.GetCommitUlong());
                                    Console.WriteLine("Ulong[0] oid: " + trkv.GetUlong(0));
                                    Console.WriteLine("Ulong[1] dictid: " + trkv.GetUlong(1));
                                    var visitor  = new ToConsoleVisitorNice();
                                    var iterator = new ODBIterator(tr, visitor);
                                    iterator.Iterate();
                                }
                        }
                break;
            }

            case "dump":
            {
                using (var dfc = new OnDiskFileCollection(args[0]))
                    using (var kdb = new KeyValueDB(dfc))
                        using (var odb = new ObjectDB())
                        {
                            odb.Open(kdb, false);
                            using (var trkv = kdb.StartReadOnlyTransaction())
                                using (var tr = odb.StartTransaction())
                                {
                                    Console.WriteLine("CommitUlong: " + tr.GetCommitUlong());
                                    Console.WriteLine("Ulong[0] oid: " + trkv.GetUlong(0));
                                    Console.WriteLine("Ulong[1] dictid: " + trkv.GetUlong(1));
                                    var visitor  = new ToConsoleVisitor();
                                    var iterator = new ODBIterator(tr, visitor);
                                    iterator.Iterate();
                                }
                        }
                break;
            }

            case "dumpnull":
            case "null":
            {
                using (var dfc = new OnDiskFileCollection(args[0]))
                    using (var kdb = new KeyValueDB(dfc))
                        using (var odb = new ObjectDB())
                        {
                            odb.Open(kdb, false);
                            using (var tr = odb.StartTransaction())
                            {
                                var visitor  = new ToNullVisitor();
                                var iterator = new ODBIterator(tr, visitor);
                                iterator.Iterate();
                            }
                        }
                break;
            }

            case "stat":
            {
                using (var dfc = new OnDiskFileCollection(args[0]))
                    using (var kdb = new KeyValueDB(dfc))
                    {
                        Console.WriteLine(kdb.CalcStats());
                    }
                break;
            }

            case "fileheaders":
            {
                using (var dfc = new OnDiskFileCollection(args[0]))
                {
                    var fcfi = new FileCollectionWithFileInfos(dfc);
                    foreach (var fi in fcfi.FileInfos)
                    {
                        var details  = "";
                        var keyindex = fi.Value as IKeyIndex;
                        if (keyindex != null)
                        {
                            details = string.Format("KVCount:{0} CommitUlong:{1} TrLogFileId:{2} TrLogOffset:{3}", keyindex.KeyValueCount, keyindex.CommitUlong, keyindex.TrLogFileId, keyindex.TrLogOffset);
                            var usedFiles = keyindex.UsedFilesInOlderGenerations;
                            if (usedFiles != null)
                            {
                                details += " UsedFiles:" + string.Join(",", usedFiles);
                            }
                        }
                        var trlog = fi.Value as IFileTransactionLog;
                        if (trlog != null)
                        {
                            details = string.Format("Previous File Id: {0}", trlog.PreviousFileId);
                        }
                        Console.WriteLine("File {0} Guid:{3} Gen:{2} Type:{1} {4}", fi.Key, fi.Value.FileType.ToString(), fi.Value.Generation, fi.Value.Guid, details);
                    }
                }
                break;
            }

            case "compact":
            {
                using (var dfc = new OnDiskFileCollection(args[0]))
                    using (var kdb = new KeyValueDB(dfc, new SnappyCompressionStrategy(), 100 * 1024 * 1024, null))
                    {
                        Console.WriteLine("Starting first compaction");
                        while (kdb.Compact(new CancellationToken()))
                        {
                            Console.WriteLine(kdb.CalcStats());
                            Console.WriteLine("Another compaction needed");
                        }
                        Console.WriteLine(kdb.CalcStats());
                    }
                break;
            }

            case "export":
            {
                using (var dfc = new OnDiskFileCollection(args[0]))
                    using (var kdb = new KeyValueDB(dfc))
                        using (var tr = kdb.StartReadOnlyTransaction())
                            using (var st = File.Create(Path.Combine(args[0], "export.dat")))
                            {
                                KeyValueDBExportImporter.Export(tr, st);
                            }
                break;
            }

            default:
            {
                Console.WriteLine($"Unknown action: {action}");
                break;
            }
            }
        }