Пример #1
0
        static string DumpRelationContent(string dbDir, string relationName, ulong?openUpToCommitUlong)
        {
            using var dfc = new OnDiskFileCollection(dbDir);
            using var kdb = new KeyValueDB(new KeyValueDBOptions
            {
                FileCollection      = dfc,
                ReadOnly            = true,
                OpenUpToCommitUlong = openUpToCommitUlong
            });
            using var odb = new ObjectDB();
            odb.Open(kdb, false);
            using var trkv = kdb.StartReadOnlyTransaction();
            using var tr   = odb.StartTransaction();

            var visitor  = new ToStringFastVisitor();
            var iterator = new ODBIterator(tr, visitor);

            iterator.LoadGlobalInfo();
            var relationIdInfo = iterator.RelationId2Info.FirstOrDefault(kvp => kvp.Value.Name.EndsWith(relationName));

            if (relationIdInfo.Value == null)
            {
                return("");
            }
            iterator.IterateRelation(relationIdInfo.Value);
            return(visitor.ToString());
        }
Пример #2
0
 public void Iterate(IObjectDBTransaction tr)
 {
     var iterator = new ODBIterator(tr, new VisitorForFindUnused(this));
     using (_kvtr = _keyValueDb.StartWritingTransaction().Result)
     {
         iterator.Iterate();
         _kvtr.Commit();
     }
     _kvtr = null;
 }
Пример #3
0
 void IterateWithApprove([CallerMemberName] string testName = null)
 {
     using (var tr = _db.StartTransaction())
     {
         var fastVisitor = new ToStringFastVisitor();
         var visitor     = new ToStringVisitor();
         var iterator    = new ODBIterator(tr, fastVisitor);
         iterator.Iterate();
         iterator = new ODBIterator(tr, visitor);
         iterator.Iterate();
         var text = visitor.ToString();
         this.Assent(text, null, testName);
         Assert.Equal(fastVisitor.Keys.ToByteArray(), visitor.Keys.ToByteArray());
     }
 }
Пример #4
0
 void IterateWithApprove()
 {
     using (var tr = _db.StartTransaction())
     {
         var fastVisitor = new ToStringFastVisitor();
         var visitor     = new ToStringVisitor();
         var iterator    = new ODBIterator(tr, fastVisitor);
         iterator.Iterate();
         iterator = new ODBIterator(tr, visitor);
         iterator.Iterate();
         var text = visitor.ToString();
         Approvals.Verify(text);
         Assert.Equal(fastVisitor.Keys.ToByteArray(), visitor.Keys.ToByteArray());
     }
 }
Пример #5
0
        static void DiskDump(string dbDir, string fileName, ulong?openUpToCommitUlong)
        {
            using var dfc = new OnDiskFileCollection(dbDir);
            using var kdb = new KeyValueDB(new KeyValueDBOptions
            {
                FileCollection      = dfc,
                ReadOnly            = true,
                OpenUpToCommitUlong = openUpToCommitUlong
            });
            using var odb = new ObjectDB();
            using var tst = File.CreateText(fileName);
            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();
        }
Пример #6
0
 static void Main(string[] args)
 {
     if (args.Length < 1)
     {
         Console.WriteLine("Need to have just one parameter with directory of ObjectDB");
         return;
     }
     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);
         }
     }
 }
Пример #7
0
        static void Interactive(ODBIterator iterator, ToConsoleVisitorNice visitor)
        {
            Console.WriteLine("Enter command:");
            var currentRelationId = -1;

            while (true)
            {
                var line  = Console.ReadLine();
                var words = line.Split(' ');
                switch (words[0])
                {
                default:
                    Console.WriteLine("Unknown command " + words[0]);
                    goto case "help";

                case "":
                case "h":
                case "help":
                    Console.WriteLine("Commands help:");
                    Console.WriteLine("l list");
                    Console.WriteLine("e exit");
                    continue;

                case "s":
                case "select":
                    if (words.Length == 1)
                    {
                        Console.WriteLine("Select command help:");
                        Console.WriteLine("select relation id");
                        continue;
                    }

                    if (long.TryParse(words[1], out var selectId))
                    {
                        if (currentRelationId >= 0)
                        {
                            iterator.IterateRelationRow(iterator.RelationId2Info[(uint)currentRelationId],
                                                        selectId);
                        }

                        break;
                    }

                    switch (words[1])
                    {
                    case "r":
                    case "relation":
                        if (words.Length == 3)
                        {
                            if (uint.TryParse(words[2], out var id) && iterator.RelationId2Info.ContainsKey(id))
                            {
                                currentRelationId = (int)id;
                            }

                            break;
                        }

                        break;
                    }

                    break;

                case "l":
                case "list":
                    if (words.Length == 1)
                    {
                        Console.WriteLine("List command help:");
                        Console.WriteLine("list relation");
                        Console.WriteLine("list nonempty relations");
                        continue;
                    }

                    switch (words[1])
                    {
                    case "r":
                    case "relation":
                        if (words.Length == 2)
                        {
                            foreach (var rel in iterator.RelationId2Info.Values.OrderBy(r => r.Id))
                            {
                                Console.WriteLine(rel.Id + " " + rel.Name + " " + rel.RowCount);
                            }
                        }

                        break;

                    case "n":
                    case "nonempty":
                        if (words.Length == 3)
                        {
                            switch (words[2])
                            {
                            case "r":
                            case "relations":
                                foreach (var rel in iterator.RelationId2Info.Values
                                         .Where(r => r.RowCount > 0).OrderBy(r => r.RowCount))
                                {
                                    Console.WriteLine(rel.Id + " " + rel.Name + " " + rel.RowCount);
                                }

                                break;
                            }
                        }

                        break;
                    }

                    break;

                case "e":
                case "exit":
                    return;
                }
            }
        }
Пример #8
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;
            }
            }
        }
Пример #9
0
 void IterateWithApprove()
 {
     using (var tr = _db.StartTransaction())
     {
         var fastVisitor = new ToStringFastVisitor();
         var visitor = new ToStringVisitor();
         var iterator = new ODBIterator(tr, fastVisitor);
         iterator.Iterate();
         iterator = new ODBIterator(tr, visitor);
         iterator.Iterate();
         var text = visitor.ToString();
         Approvals.Verify(text);
         Assert.Equal(fastVisitor.Keys.ToByteArray(), visitor.Keys.ToByteArray());
     }
 }
Пример #10
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;
            }
            }
        }
Пример #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 "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;
            }
            }
        }
Пример #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 = "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;
                    }
            }
        }
Пример #13
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;
            }
            }
        }
Пример #14
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;
            }
            }
        }