From e3c18df5d20bdca524b3ce9d2add9c6ee88281c1 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Thu, 22 Feb 2024 10:16:19 +1000 Subject: [PATCH 1/6] Dev version bump [skip ci] --- .../Serilog.Sinks.PeriodicBatching.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Serilog.Sinks.PeriodicBatching/Serilog.Sinks.PeriodicBatching.csproj b/src/Serilog.Sinks.PeriodicBatching/Serilog.Sinks.PeriodicBatching.csproj index b2b628d..7409b69 100644 --- a/src/Serilog.Sinks.PeriodicBatching/Serilog.Sinks.PeriodicBatching.csproj +++ b/src/Serilog.Sinks.PeriodicBatching/Serilog.Sinks.PeriodicBatching.csproj @@ -2,7 +2,7 @@ Buffer batches of log events to be flushed asynchronously. - 4.0.0 + 4.0.1 Serilog Contributors net462 $(TargetFrameworks);netstandard2.0;net6.0 From 607191c8d93e18d73e6e4fb37d9a861f8d403706 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Thu, 14 Mar 2024 11:39:55 +1000 Subject: [PATCH 2/6] Fix observance of options.EagerlyEmitFirstEvent; fixes #70 --- .../PeriodicBatching/PeriodicBatchingSink.cs | 2 +- .../PeriodicBatchingSinkTests.cs | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/Serilog.Sinks.PeriodicBatching/Sinks/PeriodicBatching/PeriodicBatchingSink.cs b/src/Serilog.Sinks.PeriodicBatching/Sinks/PeriodicBatching/PeriodicBatchingSink.cs index 78eae64..a14c0e6 100644 --- a/src/Serilog.Sinks.PeriodicBatching/Sinks/PeriodicBatching/PeriodicBatchingSink.cs +++ b/src/Serilog.Sinks.PeriodicBatching/Sinks/PeriodicBatching/PeriodicBatchingSink.cs @@ -121,7 +121,7 @@ async Task LoopAsync() { _currentBatch.Enqueue(next); } - } while ((_currentBatch.Count < _batchSizeLimit || _currentBatch.Count > 0 && isEagerBatch) && + } while ((_currentBatch.Count < _batchSizeLimit && !isEagerBatch || _currentBatch.Count == 0) && !_shutdownSignal.IsCancellationRequested && await TryWaitToReadAsync(_queue.Reader, fillBatch, _shutdownSignal.Token).ConfigureAwait(false)); diff --git a/test/Serilog.Sinks.PeriodicBatching.Tests/PeriodicBatchingSinkTests.cs b/test/Serilog.Sinks.PeriodicBatching.Tests/PeriodicBatchingSinkTests.cs index 22a7fac..08ba0a2 100644 --- a/test/Serilog.Sinks.PeriodicBatching.Tests/PeriodicBatchingSinkTests.cs +++ b/test/Serilog.Sinks.PeriodicBatching.Tests/PeriodicBatchingSinkTests.cs @@ -109,4 +109,30 @@ public void ExecutionContextDoesNotFlowToBatchedSink() Assert.Equal(default(int), observed); } + + [Fact] + public async Task EagerlyEmitFirstEventShouldWriteBatchImmediately() + { + var eventEmitted = false; + var bs = new CallbackBatchedSink(_ => + { + eventEmitted = true; + return Task.CompletedTask; + }); + + var options = new PeriodicBatchingSinkOptions + { + Period = TimeSpan.FromSeconds(2), + EagerlyEmitFirstEvent = true, + BatchSizeLimit = 10, + QueueLimit = 1000 + }; + + await using var pbs = new PeriodicBatchingSink(bs, options); + var evt = Some.InformationEvent(); + pbs.Emit(evt); + + await Task.Delay(1900); + Assert.True(eventEmitted); + } } \ No newline at end of file From 2a55240f1d6dba6904eea8948289a76305e0e62b Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Thu, 14 Mar 2024 11:44:06 +1000 Subject: [PATCH 3/6] Conditional use of IAsyncDisposable in test --- .../PeriodicBatchingSinkTests.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/Serilog.Sinks.PeriodicBatching.Tests/PeriodicBatchingSinkTests.cs b/test/Serilog.Sinks.PeriodicBatching.Tests/PeriodicBatchingSinkTests.cs index 08ba0a2..4469895 100644 --- a/test/Serilog.Sinks.PeriodicBatching.Tests/PeriodicBatchingSinkTests.cs +++ b/test/Serilog.Sinks.PeriodicBatching.Tests/PeriodicBatchingSinkTests.cs @@ -128,7 +128,11 @@ public async Task EagerlyEmitFirstEventShouldWriteBatchImmediately() QueueLimit = 1000 }; - await using var pbs = new PeriodicBatchingSink(bs, options); +#if FEATURE_ASYNCDISPOSABLE + await +#endif + using var pbs = new PeriodicBatchingSink(bs, options); + var evt = Some.InformationEvent(); pbs.Emit(evt); From dc3492f7680a8db9a63f9118ef281a92069737f1 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Thu, 14 Mar 2024 17:08:46 +1000 Subject: [PATCH 4/6] Test both eager emission scenarios --- .../PeriodicBatchingSinkTests.cs | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/test/Serilog.Sinks.PeriodicBatching.Tests/PeriodicBatchingSinkTests.cs b/test/Serilog.Sinks.PeriodicBatching.Tests/PeriodicBatchingSinkTests.cs index 4469895..671f890 100644 --- a/test/Serilog.Sinks.PeriodicBatching.Tests/PeriodicBatchingSinkTests.cs +++ b/test/Serilog.Sinks.PeriodicBatching.Tests/PeriodicBatchingSinkTests.cs @@ -107,36 +107,44 @@ public void ExecutionContextDoesNotFlowToBatchedSink() pbs.Emit(evt); pbs.Dispose(); - Assert.Equal(default(int), observed); + Assert.Equal(default, observed); } - [Fact] - public async Task EagerlyEmitFirstEventShouldWriteBatchImmediately() + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task EagerlyEmitFirstEventShouldWriteBatchImmediately(bool eagerlyEmit) { - var eventEmitted = false; + ulong batchesEmitted = 0; var bs = new CallbackBatchedSink(_ => { - eventEmitted = true; + // ReSharper disable once AccessToModifiedClosure + Interlocked.Increment(ref batchesEmitted); return Task.CompletedTask; }); var options = new PeriodicBatchingSinkOptions { Period = TimeSpan.FromSeconds(2), - EagerlyEmitFirstEvent = true, + EagerlyEmitFirstEvent = eagerlyEmit, BatchSizeLimit = 10, QueueLimit = 1000 }; -#if FEATURE_ASYNCDISPOSABLE - await -#endif - using var pbs = new PeriodicBatchingSink(bs, options); + var pbs = new PeriodicBatchingSink(bs, options); var evt = Some.InformationEvent(); pbs.Emit(evt); await Task.Delay(1900); - Assert.True(eventEmitted); + Assert.Equal(eagerlyEmit ? 1ul : 0, Interlocked.Read(ref batchesEmitted)); + +#if FEATURE_ASYNCDISPOSABLE + await pbs.DisposeAsync(); +#else + pbs.Dispose(); +#endif + + Assert.Equal(1ul, Interlocked.Read(ref batchesEmitted)); } } \ No newline at end of file From f29fd5aa5910c28134dd2bb0a8b4b881cf3c127e Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Thu, 14 Mar 2024 17:11:18 +1000 Subject: [PATCH 5/6] Test name --- .../PeriodicBatchingSinkTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Serilog.Sinks.PeriodicBatching.Tests/PeriodicBatchingSinkTests.cs b/test/Serilog.Sinks.PeriodicBatching.Tests/PeriodicBatchingSinkTests.cs index 671f890..4140172 100644 --- a/test/Serilog.Sinks.PeriodicBatching.Tests/PeriodicBatchingSinkTests.cs +++ b/test/Serilog.Sinks.PeriodicBatching.Tests/PeriodicBatchingSinkTests.cs @@ -113,7 +113,7 @@ public void ExecutionContextDoesNotFlowToBatchedSink() [Theory] [InlineData(true)] [InlineData(false)] - public async Task EagerlyEmitFirstEventShouldWriteBatchImmediately(bool eagerlyEmit) + public async Task EagerlyEmitFirstEventCausesQuickInitialBatch(bool eagerlyEmit) { ulong batchesEmitted = 0; var bs = new CallbackBatchedSink(_ => From 89f12512f25cb1600e57eacb3a65807f96559c6c Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Thu, 14 Mar 2024 17:22:52 +1000 Subject: [PATCH 6/6] No interlocked operations for ulong on .NET 4.7.2 --- .../PeriodicBatchingSinkTests.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/Serilog.Sinks.PeriodicBatching.Tests/PeriodicBatchingSinkTests.cs b/test/Serilog.Sinks.PeriodicBatching.Tests/PeriodicBatchingSinkTests.cs index 4140172..b3cbbf5 100644 --- a/test/Serilog.Sinks.PeriodicBatching.Tests/PeriodicBatchingSinkTests.cs +++ b/test/Serilog.Sinks.PeriodicBatching.Tests/PeriodicBatchingSinkTests.cs @@ -115,7 +115,7 @@ public void ExecutionContextDoesNotFlowToBatchedSink() [InlineData(false)] public async Task EagerlyEmitFirstEventCausesQuickInitialBatch(bool eagerlyEmit) { - ulong batchesEmitted = 0; + long batchesEmitted = 0; var bs = new CallbackBatchedSink(_ => { // ReSharper disable once AccessToModifiedClosure @@ -137,7 +137,7 @@ public async Task EagerlyEmitFirstEventCausesQuickInitialBatch(bool eagerlyEmit) pbs.Emit(evt); await Task.Delay(1900); - Assert.Equal(eagerlyEmit ? 1ul : 0, Interlocked.Read(ref batchesEmitted)); + Assert.Equal(eagerlyEmit ? 1L : 0, Interlocked.Read(ref batchesEmitted)); #if FEATURE_ASYNCDISPOSABLE await pbs.DisposeAsync(); @@ -145,6 +145,6 @@ public async Task EagerlyEmitFirstEventCausesQuickInitialBatch(bool eagerlyEmit) pbs.Dispose(); #endif - Assert.Equal(1ul, Interlocked.Read(ref batchesEmitted)); + Assert.Equal(1L, Interlocked.Read(ref batchesEmitted)); } } \ No newline at end of file