Esempio n. 1
0
        private static void BlockStreamWriterOnceTest(IBlockTransformer transformer, IBlockCache cache)
        {
            using var ms = new KeepOpenMemoryStream();
            const int COUNT = 100_000;

            long expectedLength;

            using (var writer = new BlockWriteOnceStream(ms, transformer)) {
                using var binaryWriter = new BinaryWriter(writer, Encoding.ASCII, true);
                for (var i = 0; i < COUNT; ++i)
                {
                    binaryWriter.Write(i);
                }

                writer.Write(new byte[1 << 22]);
                expectedLength = writer.Length;
            }

            using (var writer = new BlockReadOnlyStream(ms, transformer, cache: cache)) {
                Assert.AreEqual(expectedLength, writer.Length);
                using var binaryReader       = new BinaryReader(writer, Encoding.ASCII, true);
                using var binaryCursorReader = new BinaryReader(writer.CreateCursor(), Encoding.ASCII, true);
                for (var i = 0; i < COUNT; ++i)
                {
                    Assert.AreEqual(i, binaryReader.ReadInt32());
                    Assert.AreEqual(i, binaryCursorReader.ReadInt32());
                }

                var buf = new byte[1 << 22];
                Assert.AreEqual(buf.Length, writer.Read(buf));
                Assert.IsTrue(buf.All(i => i == 0));
            }
        }
        internal DiskManager(EngineSettings settings, Factories factories, IPieceWriter?writer = null)
        {
            ReadLimiter = new RateLimiter();
            ReadQueue   = new Queue <BufferedIO> ();

            WriteLimiter = new RateLimiter();
            WriteQueue   = new Queue <BufferedIO> ();

            UpdateTimer = ValueStopwatch.StartNew();

            Factories = factories ?? throw new ArgumentNullException(nameof(factories));
            Settings  = settings ?? throw new ArgumentNullException(nameof(settings));

            writer ??= factories.CreatePieceWriter(settings.MaximumOpenFiles);
            Cache = factories.CreateBlockCache(writer, settings.DiskCacheBytes, BufferPool);
            Cache.ReadThroughCache    += (o, e) => WriterReadMonitor.AddDelta(e.RequestLength);
            Cache.WrittenThroughCache += (o, e) => WriterWriteMonitor.AddDelta(e.RequestLength);
            IncrementalHashCache       = new Cache <IncrementalHashData> (() => new IncrementalHashData());
        }
Esempio n. 3
0
        private static void BlockStreamWriterSizeTestRunner(IBlockTransformer transformer, [CanBeNull] IBlockCache cache)
        {
            BlockStreamWriterOnceTest(transformer, cache);

            using var ms = new KeepOpenMemoryStream();
            var items = 10_000;

            using (var writer = new BlockRandomAccessStream(ms, transformer, cache: cache)) {
                using (var binaryWriter = new BinaryWriter(writer, Encoding.ASCII, true)) {
                    for (var i = 0; i < items; ++i)
                    {
                        binaryWriter.Write(i);
                    }
                }

                Assert.AreEqual(writer.Position, writer.Length);
                writer.Seek(0, SeekOrigin.Begin);
                Assert.AreEqual(writer.Position, 0);
                Assert.AreEqual(writer.Length, sizeof(int) * items);

                using var binaryReader = new BinaryReader(writer, Encoding.ASCII, true);
                for (var i = 0; i < items; ++i)
                {
                    Assert.AreEqual(i, binaryReader.ReadInt32());
                }
            }

            using (var writer = new BlockRandomAccessStream(ms, transformer, cache: cache)) {
                Assert.AreEqual(writer.Position, 0);
                Assert.AreEqual(writer.Length, sizeof(int) * items);
                using (var binaryReader = new BinaryReader(writer, Encoding.ASCII, true)) {
                    for (var i = 0; i < items; ++i)
                    {
                        Assert.AreEqual(i, binaryReader.ReadInt32());
                    }
                }

                Assert.AreEqual(writer.Position, writer.Length);
                Assert.AreEqual(writer.Length, sizeof(int) * items);

                if (transformer.MayChangeSize)
                {
                    Assert.ThrowsException <IOException>(() => {
                        writer.Seek(sizeof(int), SeekOrigin.Begin);
                        using var binaryWriter = new BinaryWriter(writer, Encoding.ASCII, true);
                        for (var i = 0; i < items; ++i)
                        {
                            binaryWriter.Write(i);
                        }
                    });
                    Assert.AreEqual(sizeof(int), writer.Position);
                }

                writer.Seek(0, SeekOrigin.Begin);
                Assert.AreEqual(writer.Position, 0);
                Assert.AreEqual(writer.Length, sizeof(int) * items);

                using (var binaryReader = new BinaryReader(writer, Encoding.ASCII, true)) {
                    for (var i = 0; i < items; ++i)
                    {
                        Assert.AreEqual(i, binaryReader.ReadInt32());
                    }
                }

                Assert.AreEqual(writer.Position, writer.Length);
                writer.Seek(-4, SeekOrigin.End);
                Assert.AreEqual(writer.Position + 4, writer.Length);
                Assert.AreEqual(4, writer.Read(new byte[5]));
                Assert.AreEqual(writer.Position, writer.Length);
                Assert.AreEqual(0, writer.Read(new byte[5]));

                writer.SetLength(0);
                Assert.AreEqual(writer.Length, 0);
                Assert.AreEqual(writer.Position, 0);

                writer.Flush(true);
            }
        }