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()); }
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); } }