public void Write_then_reload_object()
        {
            var data = new byte[] { 1, 2, 3 };

            // add two new blocks
            using (var storage = new ReliableStorage(new NullProcessor()))
            {
                storage.LoadPersistentData();

                storage.StoreBlock(data, "a1", 150);

                Assert.AreEqual(1, storage.BlockCount);
            }

            var processor = new NullProcessor();

            using (var storage = new ReliableStorage(processor))
            {
                storage.LoadPersistentData();

                Assert.AreEqual(1, storage.BlockCount);
            }

            Assert.AreEqual(1, processor.ProcessedBlocks.Count);
            CollectionAssert.AreEqual(data, processor.ProcessedBlocks[0]);
        }
        public void Write_reload_test_with_one_million_objects()
        {
            var data = new byte[1000];

            for (var i = 0; i < 1000; i++)
            {
                data[i] = (byte)(i % 255);
            }


            using (var storage = new ReliableStorage(new NullProcessor()))
            {
                storage.LoadPersistentData();

                const int count = 1000000;
                var       sw    = new Stopwatch();
                sw.Start();
                for (var i = 0; i < count; i++)
                {
                    storage.StoreBlock(data, i.ToString(), 155);
                }

                sw.Stop();

                Console.WriteLine(
                    $"Writing {count} blocks to persistent storage took {sw.ElapsedMilliseconds} milliseconds");
            }


            {
                var w         = new Stopwatch();
                var processor = new NullProcessor();

                w.Start();
                using (var storage = new ReliableStorage(processor))
                {
                    storage.LoadPersistentData();
                }

                w.Stop();

                Console.WriteLine(
                    $"Loading {processor.ProcessedBlocks.Count} blocks from persistent storage took {w.ElapsedMilliseconds} milliseconds");
            }
        }
Ejemplo n.º 3
0
        public static SampleFile Parse(Stream stream)
        {
            using var streamReader = new StreamReader(stream);

            Processor processor = new NullProcessor();
            string    line;

            // TODO: PERF: Maybe use Read into an array instead of strings.
            while ((line = streamReader.ReadLine()) != null)
            {
                // If the line has no leading whitespace, it's a header
                if (line.Length == 0)
                {
                    continue;
                }

                if (line[0] != ' ')
                {
                    switch (line)
                    {
                    case Headers.CallGraph:
                        processor = new CallGraphProcessor();
                        break;

                    case Headers.TotalNumbersInStack:
                        // TODO: Implement this
                        processor = new NullProcessor();
                        break;
                    }

                    continue;
                }

                // We have a line starting with 4 whitespace chars, it's part of the processor's job to parse it.
                processor.ProcessLine(line.AsSpan(4));
            }

            return(new SampleFile());
        }
        public void Create_then_delete_object()
        {
            var data = new byte[] { 1, 2, 3 };

            // add two new blocks
            using (var storage = new ReliableStorage(new NullProcessor()))
            {
                storage.LoadPersistentData();

                storage.StoreBlock(data, "a1", 150);
                storage.StoreBlock(data, "a2", 150);

                Assert.AreEqual(2, storage.BlockCount);
            }

            var processor = new NullProcessor();

            using (var storage = new ReliableStorage(processor))
            {
                storage.LoadPersistentData();

                storage.LoadPersistentData();
                Assert.AreEqual(2, storage.BlockCount);

                storage.DeleteBlock("a1", 44);
            }

            processor = new NullProcessor();
            using (var storage = new ReliableStorage(processor))
            {
                storage.LoadPersistentData();
                Assert.AreEqual(2, storage.BlockCount); // deleted blocks are counted too
            }

            Assert.AreEqual(1, processor.ProcessedBlocks.Count);
            CollectionAssert.AreEqual(data, processor.ProcessedBlocks[0]);
        }
        public void Test_with_backup_storage()
        {
            var data = new byte[1000];

            for (var i = 0; i < 1000; i++)
            {
                data[i] = (byte)(i % 255);
            }

            var data1 = new byte[2000];

            for (var i = 0; i < 2000; i++)
            {
                data1[i] = (byte)(i % 255);
            }

            using (var storage = new ReliableStorage(new NullProcessor(), null, "backup"))
            {
                storage.LoadPersistentData();
                const int count = 10000;
                var       sw    = new Stopwatch();
                sw.Start();
                for (var i = 0; i < count; i++)
                {
                    storage.StoreBlock(data, i.ToString(), 155);
                }

                sw.Stop();

                Console.WriteLine(
                    $"Writing {count} blocks to persistent storage took {sw.ElapsedMilliseconds} milliseconds");
            }


            {
                var w         = new Stopwatch();
                var processor = new NullProcessor();

                w.Start();
                using (var storage = new ReliableStorage(processor, "backup"))
                {
                    storage.LoadPersistentData();
                }

                w.Stop();

                Console.WriteLine(
                    $"Loading {processor.ProcessedBlocks.Count} blocks from persistent storage took {w.ElapsedMilliseconds} milliseconds");
            }

            using (var storage = new ReliableStorage(new NullProcessor(), "backup"))
            {
                storage.LoadPersistentData();

                const int count = 10000;
                var       sw    = new Stopwatch();
                sw.Start();
                for (var i = 0; i < count; i++)
                {
                    storage.StoreBlock(data, i.ToString(), 155);
                }

                sw.Stop();

                Console.WriteLine(
                    $"In-place updating {count} blocks to persistent storage took {sw.ElapsedMilliseconds} milliseconds");
            }

            using (var storage = new ReliableStorage(new NullProcessor(), null, "backup"))
            {
                storage.LoadPersistentData();

                const int count = 10000;
                var       sw    = new Stopwatch();
                sw.Start();
                for (var i = 0; i < count; i++)
                {
                    storage.StoreBlock(data1, i.ToString(), 155);
                }

                sw.Stop();

                Console.WriteLine(
                    $"out of place updating {count} blocks to persistent storage took {sw.ElapsedMilliseconds} milliseconds");
            }

            var info1 = new FileInfo(Path.Combine(Constants.DataPath, ReliableStorage.StorageFileName));
            var info2 = new FileInfo(Path.Combine("backup", ReliableStorage.StorageFileName));

            Assert.AreEqual(info1.Length, info2.Length);
        }
        public void Performance_test()
        {
            var data = new byte[1000];

            for (var i = 0; i < 1000; i++)
            {
                data[i] = (byte)(i % 255);
            }

            var data1 = new byte[2000];

            for (var i = 0; i < 2000; i++)
            {
                data1[i] = (byte)(i % 255);
            }

            using (var storage = new ReliableStorage(new NullProcessor()))
            {
                storage.LoadPersistentData();

                const int count = 10000;
                var       sw    = new Stopwatch();
                sw.Start();
                for (var i = 0; i < count; i++)
                {
                    storage.StoreBlock(data, i.ToString(), 155);
                }

                sw.Stop();

                Console.WriteLine(
                    $"Writing {count} blocks to persistent storage took {sw.ElapsedMilliseconds} milliseconds");
            }


            {
                var w         = new Stopwatch();
                var processor = new NullProcessor();

                w.Start();
                using (var storage = new ReliableStorage(processor))
                {
                    storage.LoadPersistentData();
                }

                w.Stop();

                Console.WriteLine(
                    $"Loading {processor.ProcessedBlocks.Count} blocks from persistent storage took {w.ElapsedMilliseconds} milliseconds");
            }

            using (var storage = new ReliableStorage(new NullProcessor()))
            {
                storage.LoadPersistentData();

                const int count = 10000;
                var       sw    = new Stopwatch();
                sw.Start();
                for (var i = 0; i < count; i++)
                {
                    storage.StoreBlock(data, i.ToString(), 155);
                }

                sw.Stop();

                Console.WriteLine(
                    $"In-place updating {count} blocks to persistent storage took {sw.ElapsedMilliseconds} milliseconds");
            }

            using (var storage = new ReliableStorage(new NullProcessor()))
            {
                storage.LoadPersistentData();

                const int count = 10000;
                var       sw    = new Stopwatch();
                sw.Start();
                for (var i = 0; i < count; i++)
                {
                    storage.StoreBlock(data1, i.ToString(), 155);
                }

                sw.Stop();

                Console.WriteLine(
                    $"out of place updating {count} blocks to persistent storage took {sw.ElapsedMilliseconds} milliseconds");
            }

            {
                var w         = new Stopwatch();
                var processor = new NullProcessor();

                w.Start();
                using (var storage = new ReliableStorage(processor))
                {
                    storage.LoadPersistentData();
                    w.Stop();

                    Assert.AreEqual(10000, storage.InactiveBlockCount);
                }


                Console.WriteLine(
                    $"Loading {processor.ProcessedBlocks.Count} blocks from persistent storage  with dirty blocks took {w.ElapsedMilliseconds} milliseconds");
            }


            var info = new FileInfo(Path.Combine(Constants.DataPath, ReliableStorage.StorageFileName));

            Console.WriteLine($"Before cleaning the file size was {info.Length}");

            // clean the storage (remove all dirty blocks)
            {
                var w         = new Stopwatch();
                var processor = new NullProcessor();


                using (var storage = new ReliableStorage(processor))
                {
                    storage.LoadPersistentData();
                    w.Start();
                    storage.CleanStorage();
                    w.Stop();

                    Assert.AreEqual(0, storage.InactiveBlockCount);

                    Console.WriteLine(
                        $"Storage cleaning took {w.ElapsedMilliseconds} milliseconds");
                }
            }

            info = new FileInfo(Path.Combine(Constants.DataPath, ReliableStorage.StorageFileName));

            Console.WriteLine($"After cleaning the file size was {info.Length}");

            {
                var w         = new Stopwatch();
                var processor = new NullProcessor();

                w.Start();
                using (var storage = new ReliableStorage(processor))
                {
                    storage.LoadPersistentData();
                    w.Stop();

                    Assert.AreEqual(0, storage.InactiveBlockCount);
                }


                Console.WriteLine(
                    $"Loading {processor.ProcessedBlocks.Count} blocks from persistent storage after cleaning took {w.ElapsedMilliseconds} milliseconds");
            }
        }