Skip to content

Commit

Permalink
Catch 'ObjectDisposedException' in session message pump
Browse files Browse the repository at this point in the history
  • Loading branch information
inech authored and jsquire committed Jul 2, 2019
1 parent e0eeb58 commit 9ec4e42
Showing 1 changed file with 18 additions and 15 deletions.
33 changes: 18 additions & 15 deletions sdk/servicebus/Microsoft.Azure.ServiceBus/src/SessionReceivePump.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,17 +54,18 @@ public void StartPump()
}
}

static void CancelAndDisposeCancellationTokenSource(CancellationTokenSource renewLockCancellationTokenSource)
{
renewLockCancellationTokenSource?.Cancel();
renewLockCancellationTokenSource?.Dispose();
}

static void OnUserCallBackTimeout(object state)
static void CancelAutoRenewLock(object state)
{
var renewCancellationTokenSource = (CancellationTokenSource)state;
renewCancellationTokenSource?.Cancel();
renewCancellationTokenSource?.Dispose();

try
{
renewCancellationTokenSource.Cancel();
}
catch (ObjectDisposedException)
{
// Ignore this race.
}
}

bool ShouldRenewSessionLock()
Expand Down Expand Up @@ -179,8 +180,8 @@ async Task MessagePumpTaskAsync(IMessageSession session)
TaskExtensionHelper.Schedule(() => this.RenewSessionLockTaskAsync(session, renewLockCancellationTokenSource.Token));
}

var userCallbackTimer = new Timer(
OnUserCallBackTimeout,
var autoRenewLockCancellationTimer = new Timer(
CancelAutoRenewLock,
renewLockCancellationTokenSource,
Timeout.Infinite,
Timeout.Infinite);
Expand Down Expand Up @@ -223,7 +224,7 @@ async Task MessagePumpTaskAsync(IMessageSession session)
try
{
// Set the timer
userCallbackTimer.Change(this.sessionHandlerOptions.MaxAutoRenewDuration,
autoRenewLockCancellationTimer.Change(this.sessionHandlerOptions.MaxAutoRenewDuration,
TimeSpan.FromMilliseconds(-1));
var callbackExceptionOccurred = false;
try
Expand All @@ -248,7 +249,7 @@ async Task MessagePumpTaskAsync(IMessageSession session)
}
finally
{
userCallbackTimer.Change(Timeout.Infinite, Timeout.Infinite);
autoRenewLockCancellationTimer.Change(Timeout.Infinite, Timeout.Infinite);
}

if (!callbackExceptionOccurred)
Expand All @@ -269,8 +270,10 @@ async Task MessagePumpTaskAsync(IMessageSession session)
}
finally
{
userCallbackTimer.Dispose();
CancelAndDisposeCancellationTokenSource(renewLockCancellationTokenSource);
renewLockCancellationTokenSource.Cancel();
renewLockCancellationTokenSource.Dispose();
autoRenewLockCancellationTimer.Dispose();

await this.CloseSessionIfNeededAsync(session).ConfigureAwait(false);
this.maxConcurrentSessionsSemaphoreSlim.Release();
}
Expand Down

0 comments on commit 9ec4e42

Please sign in to comment.