Beispiel #1
0
        public void DebugValidate(Transaction tx, long root)
        {
            if (NumberOfEntries == 0)
            {
                return;
            }

            var prev  = GetNodeKey(0);
            var pages = new HashSet <long>();

            for (int i = 1; i < NumberOfEntries; i++)
            {
                var node    = GetNode(i);
                var current = GetNodeKey(i);

                if (prev.Compare(current) >= 0)
                {
                    DebugStuff.RenderAndShow(tx, root, 1);
                    throw new InvalidOperationException("The page " + PageNumber + " is not sorted");
                }

                if (node->Flags == (NodeFlags.PageRef))
                {
                    if (pages.Add(node->PageNumber) == false)
                    {
                        DebugStuff.RenderAndShow(tx, root, 1);
                        throw new InvalidOperationException("The page " + PageNumber + " references same page multiple times");
                    }
                }

                prev = current;
            }
        }
Beispiel #2
0
        public Task FixedSizeTreeStructure()
        {
            var treeName = GetStringQueryString("name", required: true);

            using (ContextPool.AllocateOperationContext(out DocumentsOperationContext context))
                using (var tx = context.OpenReadTransaction())
                {
                    FixedSizeTree tree;
                    try
                    {
                        tree = tx.InnerTransaction.FixedTreeFor(treeName);
                    }
                    catch (Exception e)
                    {
                        throw new InvalidOperationException("Existing trees: " +
                                                            string.Join(", ", GetTreeNames(tx.InnerTransaction, RootObjectType.FixedSizeTree))
                                                            , e);
                    }


                    HttpContext.Response.ContentType = "text/html";
                    DebugStuff.DumpFixedSizedTreeToStream(tx.InnerTransaction.LowLevelTransaction, tree, ResponseBodyStream());
                }

            return(Task.CompletedTask);
        }
Beispiel #3
0
        public void DebugValidateTree(long rootPageNumber)
        {
            var pages = new HashSet <long>();
            var stack = new Stack <Page>();
            var root  = _tx.GetReadOnlyPage(rootPageNumber);

            stack.Push(root);
            pages.Add(rootPageNumber);
            while (stack.Count > 0)
            {
                var p = stack.Pop();
                if (p.NumberOfEntries == 0 && p != root)
                {
                    DebugStuff.RenderAndShow(_tx, rootPageNumber, 1);
                    throw new InvalidOperationException("The page " + p.PageNumber + " is empty");
                }
                p.DebugValidate(_tx, rootPageNumber);
                if (p.IsBranch == false)
                {
                    continue;
                }
                for (int i = 0; i < p.NumberOfEntries; i++)
                {
                    var page = p.GetNode(i)->PageNumber;
                    if (pages.Add(page) == false)
                    {
                        DebugStuff.RenderAndShow(_tx, rootPageNumber, 1);
                        throw new InvalidOperationException("The page " + page + " already appeared in the tree!");
                    }
                    stack.Push(_tx.GetReadOnlyPage(page));
                }
            }
        }
        public void CouldNotReadPagesThatWereFilteredOutByJournalApplicator_2()
        {
            var bytes = new byte[1000];

            using (var txw = Env.WriteTransaction())
            {
                var tree = txw.CreateTree("foo");

                tree.Add("bars/1", new MemoryStream(bytes));
                tree.Add("bars/2", new MemoryStream(bytes));
                tree.Add("bars/3", new MemoryStream(bytes));
                tree.Add("bars/4", new MemoryStream(bytes));

                txw.Commit();

                DebugStuff.RenderAndShow(tree);
            }

            using (var txw = Env.WriteTransaction())
            {
                var tree = txw.CreateTree("foo");

                tree.Add("bars/0", new MemoryStream());
                tree.Add("bars/5", new MemoryStream());

                txw.Commit();

                DebugStuff.RenderAndShow(tree);
            }

            using (var txw = Env.WriteTransaction())
            {
                txw.CreateTree("bar");

                txw.Commit();
            }

            using (var txw = Env.WriteTransaction())
            {
                txw.CreateTree("baz");

                txw.Commit();
            }

            using (var txr = Env.ReadTransaction())
            {
                using (var txw = Env.WriteTransaction())
                {
                    var tree = txw.CreateTree("foo");

                    tree.Add("bars/4", new MemoryStream());

                    txw.Commit();
                }

                Env.FlushLogToDataFile();

                Assert.NotNull(txr.CreateTree("foo").Read("bars/5"));
            }
        }
Beispiel #5
0
        public void ShouldNotThrowPageFullExceptionDuringPageSplit()
        {
            using (var tx = Env.NewTransaction(TransactionFlags.ReadWrite))
            {
                Env.CreateTree(tx, "foo");
                tx.Commit();
            }

            using (var tx = Env.NewTransaction(TransactionFlags.ReadWrite))
            {
                var tree = tx.ReadTree("foo");

                var normal = new byte[150];

                var small = new byte[0];

                var large = new byte[366];

                new Random(1).NextBytes(small);

                tree.Add("01", small);
                tree.Add("02", small);
                tree.Add("03", small);
                tree.Add("04", small);
                tree.Add("05", small);
                tree.Add("06", small);
                tree.Add("07", small);
                tree.Add("08", small);
                tree.Add("09", small);
                tree.Add("10", small);
                tree.Add("11", large);
                tree.Add("12", large);
                tree.Add("13", large);
                tree.Add("14", large);
                tree.Add("15", large);
                tree.Add("16", large);
                tree.Add("17", large);
                tree.Add("18", large);
                tree.Add("19", large);
                tree.Add("21", large);
                tree.Add("22", large);
                tree.Add("23", large);
                tree.Add("24", normal);
                tree.Add("25", normal);
                tree.Add("26", normal);
                tree.Add("27", normal);
                tree.Add("28", normal);
                tree.Add("29", normal);
                tree.Add("30", normal);

                DebugStuff.RenderAndShow(tx, tree.State.RootPageNumber);

                const int toInsert = 230;

                tree.Add("20", new byte[toInsert]);

                DebugStuff.RenderAndShow(tx, tree.State.RootPageNumber);
            }
        }
Beispiel #6
0
        static void MainForm_WindowLoad(object sender, EventArgs e)
        {
            DebugStuff.AppStarted();


            // Скрываем форму загрузки
            SplashForm.Dismiss();
        }
Beispiel #7
0
        protected void RenderAndShow(Transaction tx, Tree root)
        {
            if (Debugger.IsAttached == false)
            {
                return;
            }
            var rootPageNumber = tx.Environment.CreateTree(tx, root.Name).State.RootPageNumber;

            DebugStuff.RenderAndShow(root);
        }
Beispiel #8
0
        public void SinglePageModificationDoNotCauseCopyingAllIntermediatePages()
        {
            var keySize = 1024;

            using (var tx = Env.WriteTransaction())
            {
                var tree = tx.CreateTree("foo");
                tree.Add(new string('9', keySize), new MemoryStream(new byte[3]));
                DebugStuff.RenderAndShow(tree);
                tree.Add(new string('1', keySize), new MemoryStream(new byte[3]));
                DebugStuff.RenderAndShow(tree);
                tree.Add(new string('4', 1000), new MemoryStream(new byte[2]));
                DebugStuff.RenderAndShow(tree);
                tree.Add(new string('5', keySize), new MemoryStream(new byte[2]));
                DebugStuff.RenderAndShow(tree);
                tree.Add(new string('8', keySize), new MemoryStream(new byte[3]));
                DebugStuff.RenderAndShow(tree);
                tree.Add(new string('2', keySize), new MemoryStream(new byte[2]));
                DebugStuff.RenderAndShow(tree);
                tree.Add(new string('6', keySize), new MemoryStream(new byte[2]));
                DebugStuff.RenderAndShow(tree);
                tree.Add(new string('0', keySize), new MemoryStream(new byte[4]));
                DebugStuff.RenderAndShow(tree);
                tree.Add(new string('3', 1000), new MemoryStream(new byte[1]));
                DebugStuff.RenderAndShow(tree);
                tree.Add(new string('7', keySize), new MemoryStream(new byte[1]));

                tx.Commit();
            }

            var afterAdds = Env.NextPageNumber;

            using (var tx = Env.WriteTransaction())
            {
                var tree = tx.CreateTree("foo");
                tree.Delete(new string('0', keySize));

                tree.Add(new string('4', 1000), new MemoryStream(new byte[21]));

                tx.Commit();
            }

            Assert.Equal(afterAdds, Env.NextPageNumber);

            // ensure changes were applied
            using (var tx = Env.ReadTransaction())
            {
                var tree = tx.CreateTree("foo");
                Assert.Null(tree.Read(new string('0', keySize)));

                var readResult = tree.Read(new string('4', 1000));

                Assert.Equal(21, readResult.Reader.Length);
            }
        }
Beispiel #9
0
        public void DebugValidate(Tree tree, long root)
        {
            if (NumberOfEntries == 0)
            {
                return;
            }
#if VALIDATE
            if (Freed)
            {
                return;
            }
#endif
            if (IsBranch && NumberOfEntries < 2)
            {
                throw new InvalidOperationException("The branch page " + PageNumber + " has " + NumberOfEntries + " entry");
            }

            Slice prev;
            var   prevScope = GetNodeKey(tree.Llt, 0, out prev);
            try
            {
                var pages = new HashSet <long>();
                for (int i = 1; i < NumberOfEntries; i++)
                {
                    var   node = GetNode(i);
                    Slice current;
                    var   currentScope = GetNodeKey(tree.Llt, i, out current);

                    if (SliceComparer.CompareInline(prev, current) >= 0)
                    {
                        DebugStuff.RenderAndShowTree(tree, root);
                        throw new InvalidOperationException("The page " + PageNumber + " is not sorted");
                    }

                    if (node->Flags == (TreeNodeFlags.PageRef))
                    {
                        if (pages.Add(node->PageNumber) == false)
                        {
                            DebugStuff.RenderAndShowTree(tree, root);
                            throw new InvalidOperationException("The page " + PageNumber + " references same page multiple times");
                        }
                    }
                    prevScope.Dispose();
                    prev      = current;
                    prevScope = currentScope;
                }
            }
            finally
            {
                prevScope.Dispose();
            }
        }
Beispiel #10
0
        public void ShouldNotThrowThatPageIsFullDuringTreeRebalancing()
        {
            using (var tx = Env.NewTransaction(TransactionFlags.ReadWrite))
            {
                var tree = Env.CreateTree(tx, "rebalancing-issue");

                var aKey = new string('a', 1024);
                var bKey = new string('b', 1024);
                var cKey = new string('c', 1024);
                var dKey = new string('d', 1024);
                var eKey = new string('e', 600);
                var fKey = new string('f', 920);

                tree.Add(aKey, new MemoryStream(new byte[1000]));
                tree.Add(bKey, new MemoryStream(new byte[1000]));
                tree.Add(cKey, new MemoryStream(new byte[1000]));
                tree.Add(dKey, new MemoryStream(new byte[1000]));
                tree.Add(eKey, new MemoryStream(new byte[800]));
                tree.Add(fKey, new MemoryStream(new byte[10]));

                DebugStuff.RenderAndShow(tx, 1);

                // to expose the bug we need to delete the last item from the left most page
                // tree rebalance will try to fix the first reference (the implicit ref page node) in the parent page which is almost full
                // and will fail because there is no space to put a new node

                tree.Delete(aKey); // this line throws "The page is full and cannot add an entry, this is probably a bug"

                tx.Commit();

                using (var iterator = tree.Iterate())
                {
                    Assert.True(iterator.Seek(Slice.BeforeAllKeys));

                    Assert.Equal(bKey, iterator.CurrentKey);
                    Assert.True(iterator.MoveNext());

                    Assert.Equal(cKey, iterator.CurrentKey);
                    Assert.True(iterator.MoveNext());

                    Assert.Equal(dKey, iterator.CurrentKey);
                    Assert.True(iterator.MoveNext());

                    Assert.Equal(eKey, iterator.CurrentKey);
                    Assert.True(iterator.MoveNext());

                    Assert.Equal(fKey, iterator.CurrentKey);
                    Assert.False(iterator.MoveNext());
                }
            }
        }
Beispiel #11
0
        public unsafe void MustNotCreateEmptyNonCompressedPageAfterPageSplit()
        {
            using (var tx = Env.WriteTransaction())
            {
                tx.CreateTree("tree", flags: TreeFlags.LeafsCompressed);

                tx.Commit();
            }

            using (var tx = Env.WriteTransaction())
            {
                var tree = tx.ReadTree("tree");

                Assert.True(tree.State.Flags.HasFlag(TreeFlags.LeafsCompressed));

                var bytes = new byte[3070];

                const int numberOfItems = 21;

                for (int i = 0; i < numberOfItems; i++)
                {
                    tree.Add("items/" + i, new MemoryStream(bytes));
                }

                for (int i = 1; i < numberOfItems; i++) // skipping one item here
                {
                    tree.Delete("items/" + i);
                }

                // after the above deletions there is only one entry on the page - "items/0"

                DebugStuff.RenderAndShow(tree);

                // this is an _update_ (very important)
                // the issue was that the updated entry was added to a new (right) page by TreePageSplitter
                // while the previous entry was removed from compressed page - effectively making it empty
                tree.Add("items/0", new MemoryStream(new byte[3700]));

                foreach (var pageNumber in tree.AllPages())
                {
                    var page = new TreePage(tx.LowLevelTransaction.GetPage(pageNumber).Pointer, Constants.Storage.PageSize);

                    if (page.IsCompressed == false)
                    {
                        Assert.NotEqual(0, page.NumberOfEntries);
                    }
                }

                Assert.Equal(1, tree.AllPages().Count);
            }
        }
Beispiel #12
0
        public void HasReducedTreeDepthValueAfterRemovingEntries()
        {
            const int numberOfItems = 1024;

            using (var tx = Env.NewTransaction(TransactionFlags.ReadWrite))
            {
                var tree = Env.CreateTree(tx, "test");

                for (int i = 0; i < numberOfItems; i++)
                {
                    tree.Add("test" + new string('-', 256) + i, new byte[256]);
                }

                DebugStuff.RenderAndShow(tx, tree.State.RootPageNumber);

                Assert.Equal(4, tree.State.Depth);

                tx.Commit();
            }

            using (var tx = Env.NewTransaction(TransactionFlags.ReadWrite))
            {
                var tree = tx.ReadTree("test");

                for (int i = 0; i < numberOfItems * 0.75; i++)
                {
                    tree.Delete("test" + new string('-', 256) + i);
                }

                DebugStuff.RenderAndShow(tx, tree.State.RootPageNumber);

                Assert.Equal(3, tree.State.Depth);

                tx.Commit();
            }

            using (var tx = Env.NewTransaction(TransactionFlags.ReadWrite))
            {
                var tree = tx.ReadTree("test");

                for (int i = 0; i < numberOfItems; i++)
                {
                    tree.Delete("test" + new string('-', 256) + i);
                }

                DebugStuff.RenderAndShow(tx, tree.State.RootPageNumber);

                Assert.Equal(1, tree.State.Depth);
            }
        }
Beispiel #13
0
        public void PageNotSorted_ValidateDebugOption()
        {
            using (var env = new StorageEnvironment(StorageEnvironmentOptions.CreateMemoryOnly()))
            {
                env.DebugJournal = DebugJournal.FromFile("Bugs/Data/mapped", env);
                env.DebugJournal.Replay();

                using (var tx = env.NewTransaction(TransactionFlags.Read))
                {
                    var tree = tx.ReadTree("mapped_results_by_view_and_reduce_key");

                    DebugStuff.RenderAndShow(tx, tree.State.RootPageNumber, 1);
                }
            }
        }
Beispiel #14
0
        public async Task BTreeStructure()
        {
            var treeName = GetStringQueryString("name", required: true);

            using (ContextPool.AllocateOperationContext(out DocumentsOperationContext context))
                using (var tx = context.OpenReadTransaction())
                {
                    var tree = tx.InnerTransaction.ReadTree(treeName)
                               ?? throw new InvalidOperationException("Tree name '" + treeName + "' was not found. Existing trees: " +
                                                                      string.Join(", ", GetTreeNames(tx.InnerTransaction, RootObjectType.VariableSizeTree))
                                                                      );

                    HttpContext.Response.ContentType = "text/html";
                    await DebugStuff.DumpTreeToStreamAsync(tree, ResponseBodyStream());
                }
        }
        public void CouldNotReadPagesThatWereFilteredOutByJournalApplicator_1()
        {
            var bytes = new byte[1000];

            using (var txw = Env.NewTransaction(TransactionFlags.ReadWrite))
            {
                var tree = Env.CreateTree(txw, "foo");

                tree.Add("bars/1", new MemoryStream(bytes));

                txw.Commit();

                DebugStuff.RenderAndShow(tree);
            }

            using (var txw = Env.NewTransaction(TransactionFlags.ReadWrite))
            {
                Env.CreateTree(txw, "bar");

                txw.Commit();
            }

            using (var txw = Env.NewTransaction(TransactionFlags.ReadWrite))
            {
                Env.CreateTree(txw, "baz");

                txw.Commit();
            }

            using (var txr = Env.NewTransaction(TransactionFlags.Read))
            {
                using (var txw = Env.NewTransaction(TransactionFlags.ReadWrite))
                {
                    var tree = Env.CreateTree(txw, "foo");

                    tree.Add("bars/1", new MemoryStream());

                    txw.Commit();

                    DebugStuff.RenderAndShow(txw, 1);
                }

                Env.FlushLogToDataFile();

                Assert.NotNull(Env.CreateTree(txr, "foo").Read("bars/1"));
            }
        }
Beispiel #16
0
        public void HasReducedNumberOfPagesAfterRemovingHalfOfEntries()
        {
            const int numberOfRegularItems  = 256;
            const int numberOfOverflowItems = 3;

            using (var tx = Env.NewTransaction(TransactionFlags.ReadWrite))
            {
                for (int i = 0; i < numberOfRegularItems; i++)
                {
                    tx.Root.Add("test" + new string('-', 128) + i, new byte[256]);
                }

                for (int i = 0; i < numberOfOverflowItems; i++)
                {
                    tx.Root.Add("overflow" + new string('-', 128) + i, new byte[8192]);
                }

                tx.Commit();

                Assert.Equal(50, tx.Root.State.PageCount);
                Assert.Equal(38, tx.Root.State.LeafPages);
                Assert.Equal(3, tx.Root.State.BranchPages);
                Assert.Equal(9, tx.Root.State.OverflowPages);
                Assert.Equal(3, tx.Root.State.Depth);
            }

            using (var tx = Env.NewTransaction(TransactionFlags.ReadWrite))
            {
                for (int i = 0; i < numberOfRegularItems / 2; i++)
                {
                    tx.Root.Delete("test" + new string('-', 128) + i);
                }

                tx.Root.Delete("overflow" + new string('-', 128) + 0);

                tx.Commit();

                DebugStuff.RenderAndShow(tx.Root);

                Assert.Equal(31, tx.Root.AllPages().Count);
                Assert.Equal(31, tx.Root.State.PageCount);
                Assert.Equal(22, tx.Root.State.LeafPages);
                Assert.Equal(3, tx.Root.State.BranchPages);
                Assert.Equal(6, tx.Root.State.OverflowPages);
                Assert.Equal(3, tx.Root.State.Depth);
            }
        }
Beispiel #17
0
        protected void RenderAndShow(Transaction tx, Tree root, int showEntries = 25)
        {
            if (Debugger.IsAttached == false)
            {
                return;
            }
            var path           = Path.Combine(Environment.CurrentDirectory, "test-tree.dot");
            var rootPageNumber = tx.Environment.State.GetTree(tx, root.Name).State.RootPageNumber;

            TreeDumper.Dump(tx, path, tx.GetReadOnlyPage(rootPageNumber), showEntries);

            var output = Path.Combine(Environment.CurrentDirectory, "output.svg");
            var p      = Process.Start(DebugStuff.FindGraphviz() + @"\bin\dot.exe", "-Tsvg  " + path + " -o " + output);

            p.WaitForExit();
            Process.Start(output);
        }
Beispiel #18
0
        public void DebugValidateTree(long rootPageNumber)
        {
            var pages = new HashSet <long>();
            var stack = new Stack <TreePage>();
            var root  = GetReadOnlyTreePage(rootPageNumber);

            stack.Push(root);
            pages.Add(rootPageNumber);
            while (stack.Count > 0)
            {
                var p = stack.Pop();

                using (p.IsCompressed ? (DecompressedLeafPage)(p = DecompressPage(p, skipCache: true)) : null)
                {
                    if (p.NumberOfEntries == 0 && p != root)
                    {
                        DebugStuff.RenderAndShowTree(this, rootPageNumber);
                        throw new InvalidOperationException("The page " + p.PageNumber + " is empty");
                    }
                    p.DebugValidate(this, rootPageNumber);
                    if (p.IsBranch == false)
                    {
                        continue;
                    }

                    if (p.NumberOfEntries < 2)
                    {
                        throw new InvalidOperationException("The branch page " + p.PageNumber + " has " +
                                                            p.NumberOfEntries + " entry");
                    }

                    for (int i = 0; i < p.NumberOfEntries; i++)
                    {
                        var page = p.GetNode(i)->PageNumber;
                        if (pages.Add(page) == false)
                        {
                            DebugStuff.RenderAndShowTree(this, rootPageNumber);
                            throw new InvalidOperationException("The page " + page + " already appeared in the tree!");
                        }
                        stack.Push(GetReadOnlyTreePage(page));
                    }
                }
            }
        }
Beispiel #19
0
        public void CanMergeRight()
        {
            using (var tx = Env.NewTransaction(TransactionFlags.ReadWrite))
            {
                tx.Root.Add("1", new MemoryStream(new byte[1472]));
                tx.Root.Add("2", new MemoryStream(new byte[992]));
                tx.Root.Add("3", new MemoryStream(new byte[1632]));
                tx.Root.Add("4", new MemoryStream(new byte[632]));
                tx.Root.Add("5", new MemoryStream(new byte[824]));
                tx.Root.Delete("3");
                tx.Root.Add("6", new MemoryStream(new byte[1096]));

                DebugStuff.RenderAndShow(tx, 1);
                tx.Root.Delete("6");
                tx.Root.Delete("4");

                DebugStuff.RenderAndShow(tx, 1);

                tx.Commit();
            }
        }
Beispiel #20
0
        public void CanMergeLeft()
        {
            using (var tx = Env.NewTransaction(TransactionFlags.ReadWrite))
            {
                tx.Root.Add("1", new MemoryStream(new byte[1524]));
                tx.Root.Add("2", new MemoryStream(new byte[1524]));
                tx.Root.Add("3", new MemoryStream(new byte[1024]));
                tx.Root.Add("4", new MemoryStream(new byte[64]));

                DebugStuff.RenderAndShow(tx, 1);

                tx.Root.Delete("2");

                DebugStuff.RenderAndShow(tx, 1);

                tx.Root.Delete("3");
                DebugStuff.RenderAndShow(tx, 1);

                tx.Commit();
            }
        }
Beispiel #21
0
        public HttpResponseMessage DumpTree(string name)
        {
            var transactionalStorage = Database.TransactionalStorage as Raven.Storage.Voron.TransactionalStorage;

            if (transactionalStorage == null)
            {
                return(GetMessageWithObject(new
                {
                    Error = "The database storage is not Voron"
                }, HttpStatusCode.BadRequest));
            }
            using (var tx = transactionalStorage.Environment.NewTransaction(TransactionFlags.Read))
            {
                var readTree = tx.ReadTree(name);
                if (readTree == null)
                {
                    return(GetMessageWithObject(new
                    {
                        Error = "The database storage does not contains a tree named: " + name
                    }, HttpStatusCode.NotFound));
                }
            }

            return(new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new PushStreamContent((stream, content, arg3) =>
                {
                    using (stream)
                        using (var tx = transactionalStorage.Environment.NewTransaction(TransactionFlags.Read))
                        {
                            var readTree = tx.ReadTree(name);

                            DebugStuff.DumpTreeToStream(readTree, stream);
                        }
                })
                {
                    Headers = { ContentType = MediaTypeHeaderValue.Parse("text/html") }
                }
            });
        }
Beispiel #22
0
        public void DebugValidate(LowLevelTransaction tx, long root)
        {
            if (NumberOfEntries == 0)
            {
                return;
            }

            if (IsBranch && NumberOfEntries < 2)
            {
                throw new InvalidOperationException("The branch page " + PageNumber + " has " + NumberOfEntries + " entry");
            }

            var prev  = GetNodeKey(tx, 0);
            var pages = new HashSet <long>();

            for (int i = 1; i < NumberOfEntries; i++)
            {
                var node    = GetNode(i);
                var current = GetNodeKey(tx, i);

                if (SliceComparer.CompareInline(prev, current) >= 0)
                {
                    DebugStuff.RenderAndShowTree(tx, root);
                    throw new InvalidOperationException("The page " + PageNumber + " is not sorted");
                }

                if (node->Flags == (TreeNodeFlags.PageRef))
                {
                    if (pages.Add(node->PageNumber) == false)
                    {
                        DebugStuff.RenderAndShowTree(tx, root);
                        throw new InvalidOperationException("The page " + PageNumber + " references same page multiple times");
                    }
                }

                prev = current;
            }
        }
Beispiel #23
0
        public void StressTest()
        {
            using (var tx = Env.NewTransaction(TransactionFlags.ReadWrite))
            {
                for (int i = 0; i < 80; ++i)
                {
                    tx.Root.Add(string.Format("{0}1", i), new MemoryStream(new byte[1472]));
                    tx.Root.Add(string.Format("{0}2", i), new MemoryStream(new byte[992]));
                    tx.Root.Add(string.Format("{0}3", i), new MemoryStream(new byte[1632]));
                    tx.Root.Add(string.Format("{0}4", i), new MemoryStream(new byte[632]));
                    tx.Root.Add(string.Format("{0}5", i), new MemoryStream(new byte[824]));
                    tx.Root.Add(string.Format("{0}6", i), new MemoryStream(new byte[1096]));
                    tx.Root.Add(string.Format("{0}7", i), new MemoryStream(new byte[2048]));
                    tx.Root.Add(string.Format("{0}8", i), new MemoryStream(new byte[1228]));
                    tx.Root.Add(string.Format("{0}9", i), new MemoryStream(new byte[8192]));
                }

                DebugStuff.RenderAndShow(tx, 1);


                for (int i = 79; i >= 0; --i)
                {
                    tx.Root.Delete(string.Format("{0}1", i));
                    tx.Root.Delete(string.Format("{0}2", i));
                    tx.Root.Delete(string.Format("{0}3", i));
                    tx.Root.Delete(string.Format("{0}4", i));
                    tx.Root.Delete(string.Format("{0}5", i));
                    tx.Root.Delete(string.Format("{0}6", i));
                    tx.Root.Delete(string.Format("{0}7", i));
                    tx.Root.Delete(string.Format("{0}8", i));
                    tx.Root.Delete(string.Format("{0}9", i));
                }

                tx.Commit();
            }
        }
Beispiel #24
0
 public void DebugRenderAndShow()
 {
     DebugStuff.RenderAndShow(this);
 }
Beispiel #25
0
    void MainWindowDebugStuff()
    {
        var debugItemBrush = new SolidColorBrush(Colors.Blue);

        PresentationTraceSources.DataBindingSource.Switch.Level = SourceLevels.Critical;

        Button bonusButton = new()
        {
            Content    = "BONUS!",
            Width      = 50,
            Height     = 30,
            Foreground = debugItemBrush
        };

        bonusButton.Click += BonusButton_Click;
        DockPanel.SetDock(bonusButton, Dock.Right);
        SearchBox_DockPanel.Children.Add(bonusButton);

        CreateThumbnailsCommand = new RelayCommand(CreateThumbnails);
        MenuItem createThumbs = new()
        {
            Header     = "Create thumbnails",
            ToolTip    = "Create a thumbnail for every release that doesn't have one.",
            Command    = CreateThumbnailsCommand,
            Foreground = debugItemBrush
        };

        ArtMenuItem.Items.Add(createThumbs);

        SetFactoryDBCommand = new RelayCommand(SetFactoryDB);
        MenuItem setFactoryDB = new()
        {
            Header     = "Set factory database",
            ToolTip    = "Erase all custom settings from database.",
            Command    = SetFactoryDBCommand,
            Foreground = debugItemBrush
        };

        FileMenuItem.Items.Add(setFactoryDB);
    }

    async void BonusButton_Click(object sender, RoutedEventArgs e)
    {
        await DebugStuff.MainWindowBonusAsync();
    }

    public RelayCommand CreateThumbnailsCommand {
        get; set;
    }

    void CreateThumbnails()
    {
        Stopwatch Watch = new();

        Watch.Start();
        int i = 0;

        foreach (Release release in R.Data.Releases.Local)
        {
            Watch.Restart();
            Debug.WriteLine(i++ + " : " + Watch.ElapsedMilliseconds);

            release.CreateThumbnail();
        }
    }

    public RelayCommand SetFactoryDBCommand {
        get; set;
    }

    void SetFactoryDB()
    {
        DebugStuff.SetFactoryDatabase();
    }
#endif
}
        public void ShouldCorrectlyFindSmallValueMergingByTwoSectionsInFreeSpaceHandling()
        {
            var dataSize = 905048;             // never change this

            const int itemsCount = 10;

            for (int i = 0; i < itemsCount; i++)
            {
                using (var tx = Env.NewTransaction(TransactionFlags.ReadWrite))
                {
                    tx.Root.Add("items/" + i, new byte[dataSize]);
                    tx.Commit();
                }

                if (i % (itemsCount / 3) == 0 || i % (itemsCount / 2) == 0)
                {
                    Env.FlushLogToDataFile();
                }
            }

            using (var tx = Env.NewTransaction(TransactionFlags.Read))
            {
                for (int i = 0; i < itemsCount; i++)
                {
                    var readResult = tx.Root.Read("items/" + i);

                    Assert.Equal(dataSize, readResult.Reader.Length);
                }
            }

            for (int i = 0; i < itemsCount; i++)
            {
                using (var tx = Env.NewTransaction(TransactionFlags.ReadWrite))
                {
                    tx.Root.Delete("items/" + i);
                    tx.Commit();
                }

                if (i % (itemsCount / 3) == 0 || i % (itemsCount / 2) == 0)
                {
                    Env.FlushLogToDataFile();
                }
            }

            for (int i = 0; i < itemsCount; i++)
            {
                using (var tx = Env.NewTransaction(TransactionFlags.ReadWrite))
                {
                    tx.Root.Add("items/" + i, new byte[dataSize]);

                    DebugStuff.RenderAndShow(tx, tx.Root.State.RootPageNumber);

                    tx.Commit();
                }

                if (i % (itemsCount / 3) == 0 || i % (itemsCount / 2) == 0)
                {
                    Env.FlushLogToDataFile();
                }
            }

            using (var tx = Env.NewTransaction(TransactionFlags.Read))
            {
                for (int i = 0; i < itemsCount; i++)
                {
                    var readResult = tx.Root.Read("items/" + i);

                    Assert.Equal(dataSize, readResult.Reader.Length);
                }
            }
        }
        public void CanForceToFlushPagesOlderThanOldestActiveTransactionToFreePagesFromScratch()
        {
            using (var txw = Env.NewTransaction(TransactionFlags.ReadWrite))
            {
                var tree = Env.CreateTree(txw, "foo");

                tree.Add("bars/1", new string('a', 1000));

                txw.Commit();

                DebugStuff.RenderAndShow(txw, 1);
            }

            using (var txw = Env.NewTransaction(TransactionFlags.ReadWrite))
            {
                Env.CreateTree(txw, "bar");

                txw.Commit();
            }

            using (var txw = Env.NewTransaction(TransactionFlags.ReadWrite))
            {
                var tree = Env.CreateTree(txw, "foo");

                tree.Add("bars/1", new string('b', 1000));

                txw.Commit();

                DebugStuff.RenderAndShow(txw, 1);
            }

            var txr = Env.NewTransaction(TransactionFlags.Read);
            {
                using (var txw = Env.NewTransaction(TransactionFlags.ReadWrite))
                {
                    var tree = Env.CreateTree(txw, "foo");

                    tree.Add("bars/1", new string('c', 1000));

                    txw.Commit();

                    DebugStuff.RenderAndShow(txw, 1);
                }

                Env.FlushLogToDataFile();

                txr.Dispose();

                using (var txr2 = Env.NewTransaction(TransactionFlags.Read))
                {
                    var allocated1 = Env.ScratchBufferPool.GetNumberOfAllocations(0);

                    Env.FlushLogToDataFile();

                    var allocated2 = Env.ScratchBufferPool.GetNumberOfAllocations(0);

                    Assert.Equal(allocated1, allocated2);

                    Env.FlushLogToDataFile(allowToFlushOverwrittenPages: true);

                    var allocated3 = Env.ScratchBufferPool.GetNumberOfAllocations(0);

                    Assert.True(allocated3 < allocated2);

                    var read = Env.CreateTree(txr2, "foo").Read("bars/1");

                    Assert.NotNull(read);
                    Assert.Equal(new string('c', 1000), read.Reader.AsSlice().ToString());
                }
            }
        }
Beispiel #28
0
        public void MissingScratchPagesInPageTable()
        {
            var bytes = new byte[1000];

            using (var txw = Env.NewTransaction(TransactionFlags.ReadWrite))
            {
                var tree1 = Env.CreateTree(txw, "foo");
                var tree2 = Env.CreateTree(txw, "bar");
                var tree3 = Env.CreateTree(txw, "baz");

                tree1.Add("foos/1", new MemoryStream(bytes));

                txw.Commit();

                DebugStuff.RenderAndShow(txw, 1);
            }

            using (var txw = Env.NewTransaction(TransactionFlags.ReadWrite))
            {
                var tree = Env.CreateTree(txw, "bar");

                tree.Add("bars/1", new MemoryStream(bytes));

                txw.Commit();

                DebugStuff.RenderAndShow(txw, 1);
            }

            var bytesToFillFirstJournalCompletely = new byte[8 * AbstractPager.PageSize];

            new Random().NextBytes(bytesToFillFirstJournalCompletely);

            using (var txw = Env.NewTransaction(TransactionFlags.ReadWrite))
            {
                var tree = Env.CreateTree(txw, "baz");

                // here we have to put a big value to be sure that in next transaction we will put the
                // updated value into a new journal file - this is the key to expose the issue
                tree.Add("bazs/1", new MemoryStream(bytesToFillFirstJournalCompletely));

                txw.Commit();

                DebugStuff.RenderAndShow(txw, 1);
            }

            using (var txr = Env.NewTransaction(TransactionFlags.Read))
            {
                using (var txw = Env.NewTransaction(TransactionFlags.ReadWrite))
                {
                    var tree = Env.CreateTree(txw, "foo");

                    tree.Add("foos/1", new MemoryStream());

                    txw.Commit();

                    DebugStuff.RenderAndShow(txw, 1);
                }

                Env.FlushLogToDataFile();

                Assert.NotNull(Env.CreateTree(txr, "foo").Read("foos/1"));
            }
        }
Beispiel #29
0
 private void Awake()
 {
     current = this;
     text    = GetComponent <TMP_Text>();
 }
Beispiel #30
0
        public void RavenDB_2543_CouldNotEnsureThatWeHaveEnoughSpace_When_MovingLeafNode()
        {
            using (var tx = Env.NewTransaction(TransactionFlags.ReadWrite))
            {
                var tree = Env.CreateTree(tx, "rebalancing-issue");

                var aKey = new string('a', 1000);
                var bKey = new string('b', 1000);
                var cKey = new string('c', 1000);
                var dKey = new string('d', 1020);
                var eKey = new string('e', 1020);
                var fKey = new string('f', 1020);
                var gKey = new string('g', 1000);
                var hKey = new string('h', 1000);
                var iKey = new string('i', 1000);
                var jKey = new string('j', 1000);
                var kKey = new string('k', 1000);
                var lKey = new string('l', 1000);
                var mKey = new string('m', 820);
                var nKey = new string('n', 102);

                tree.Add(aKey, new MemoryStream(new byte[100]));
                tree.Add(bKey, new MemoryStream(new byte[100]));
                tree.Add(cKey, new MemoryStream(new byte[100]));
                tree.Add(dKey, new MemoryStream(new byte[100]));
                tree.Add(eKey, new MemoryStream(new byte[100]));
                tree.Add(fKey, new MemoryStream(new byte[100]));
                tree.Add(gKey, new MemoryStream(new byte[100]));
                tree.Add(hKey, new MemoryStream(new byte[100]));
                tree.Add(iKey, new MemoryStream(new byte[100]));
                tree.Add(jKey, new MemoryStream(new byte[100]));
                tree.Add(kKey, new MemoryStream(new byte[100]));
                tree.Add(lKey, new MemoryStream(new byte[100]));
                tree.Add(mKey, new MemoryStream(new byte[100]));
                tree.Add(nKey, new MemoryStream(new byte[1000]));

                DebugStuff.RenderAndShow(tx, 1);


                tree.Delete(nKey);  // this line throws "The page is full and cannot add an entry, this is probably a bug"

                DebugStuff.RenderAndShow(tx, 1);

                tx.Commit();

                using (var iterator = tree.Iterate())
                {
                    Assert.True(iterator.Seek(Slice.BeforeAllKeys));

                    Assert.Equal(aKey, iterator.CurrentKey);
                    Assert.True(iterator.MoveNext());

                    Assert.Equal(bKey, iterator.CurrentKey);
                    Assert.True(iterator.MoveNext());

                    Assert.Equal(cKey, iterator.CurrentKey);
                    Assert.True(iterator.MoveNext());

                    Assert.Equal(dKey, iterator.CurrentKey);
                    Assert.True(iterator.MoveNext());

                    Assert.Equal(eKey, iterator.CurrentKey);
                    Assert.True(iterator.MoveNext());

                    Assert.Equal(fKey, iterator.CurrentKey);
                    Assert.True(iterator.MoveNext());

                    Assert.Equal(gKey, iterator.CurrentKey);
                    Assert.True(iterator.MoveNext());

                    Assert.Equal(hKey, iterator.CurrentKey);
                    Assert.True(iterator.MoveNext());

                    Assert.Equal(iKey, iterator.CurrentKey);
                    Assert.True(iterator.MoveNext());

                    Assert.Equal(jKey, iterator.CurrentKey);
                    Assert.True(iterator.MoveNext());

                    Assert.Equal(kKey, iterator.CurrentKey);
                    Assert.True(iterator.MoveNext());

                    Assert.Equal(lKey, iterator.CurrentKey);
                    Assert.True(iterator.MoveNext());

                    Assert.Equal(mKey, iterator.CurrentKey);
                    Assert.False(iterator.MoveNext());
                }
            }
        }