public async Task FasterLogTest5([Values] LogChecksumType logChecksum) { log = new FasterLog(new FasterLogSettings { LogDevice = device, PageSizeBits = 16, MemorySizeBits = 16, LogChecksum = logChecksum }); int headerSize = logChecksum == LogChecksumType.None ? 4 : 12; bool _disposed = false; var commit = new Thread(() => { while (!_disposed) { log.Commit(true); Thread.Sleep(1); } }); commit.Start(); // 65536=page size|headerSize|64=log header await log.EnqueueAndWaitForCommitAsync(new byte[65536 - headerSize - 64]); // 65536=page size|headerSize await log.EnqueueAndWaitForCommitAsync(new byte[65536 - headerSize]); // 65536=page size|headerSize await log.EnqueueAndWaitForCommitAsync(new byte[65536 - headerSize]); // 65536=page size|headerSize await log.EnqueueAndWaitForCommitAsync(new byte[65536 - headerSize]); // 65536=page size|headerSize await log.EnqueueAndWaitForCommitAsync(new byte[65536 - headerSize]); _disposed = true; commit.Join(); log.Dispose(); }
/// <summary> /// Async version of enqueue /// </summary> static async Task AsyncLogWriter(int id) { bool batched = false; await Task.Yield(); if (!batched) { // Single commit version - append each item and wait for commit // Needs high parallelism (NumParallelTasks) for perf // Needs separate commit thread to perform regular commit // Otherwise we commit only at page boundaries while (true) { try { await log.EnqueueAndWaitForCommitAsync(staticEntry); } catch (Exception ex) { Console.WriteLine($"{nameof(AsyncLogWriter)}({id}): {ex}"); } } } else { // Batched version - we enqueue many entries to memory, // then wait for commit periodically int count = 0; while (true) { await log.EnqueueAsync(staticEntry); if (count++ % 100 == 0) { await log.WaitForCommitAsync(); } } } }