fix: correct RedisQueue disposal ordering to prevent ObjectDisposedException during shutdown#166
Open
niemyjski wants to merge 1 commit into
Open
fix: correct RedisQueue disposal ordering to prevent ObjectDisposedException during shutdown#166niemyjski wants to merge 1 commit into
niemyjski wants to merge 1 commit into
Conversation
…ception during shutdown Reorder RedisQueue.Dispose() to signal cancellation first via SignalDispose(), wait for workers and maintenance task to terminate, then call base.Dispose() which disposes the CTS last. Previously base.Dispose() was called first which destroyed the CTS while background tasks were still running. Fixes #165
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
RedisQueue.Dispose()to callSignalDispose()first, wait for workers and maintenance task, thenbase.Dispose()lastDispose_WithMaintenanceRunning_DoesNotThrowObjectDisposedExceptiontest wiringRoot Cause
RedisQueue.Dispose()calledbase.Dispose()first which destroyed theCancellationTokenSourcebefore the maintenance task was waited on. The still-runningDoMaintenanceWorkLoopAsyncthen accessedDisposedCancellationToken(calling.Tokenon the disposed CTS), throwingObjectDisposedExceptionlogged as a warning during Kubernetes graceful shutdown.Dependencies
Requires FoundatioFx/Foundatio#519 (introduces
SignalDispose()inMaintenanceBase)Test plan
Fixes #165