diff --git a/Microsoft.Azure.Cosmos/src/Routing/GlobalEndpointManager.cs b/Microsoft.Azure.Cosmos/src/Routing/GlobalEndpointManager.cs
index 15ac52bea0..db1a01cd61 100644
--- a/Microsoft.Azure.Cosmos/src/Routing/GlobalEndpointManager.cs
+++ b/Microsoft.Azure.Cosmos/src/Routing/GlobalEndpointManager.cs
@@ -584,7 +584,12 @@ private async Task RefreshDatabaseAccountInternalAsync(bool forceRefresh)
{
this.LastBackgroundRefreshUtc = DateTime.UtcNow;
this.locationCache.OnDatabaseAccountRead(await this.GetDatabaseAccountAsync(true));
-
+ }
+ catch (Exception ex)
+ {
+ DefaultTrace.TraceWarning("Failed to refresh database account with exception: {0}. Activity Id: '{1}'",
+ ex,
+ System.Diagnostics.Trace.CorrelationManager.ActivityId);
}
finally
{
diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/GlobalEndpointManagerTest.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/GlobalEndpointManagerTest.cs
index 28e24d7e55..30c0d4e457 100644
--- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/GlobalEndpointManagerTest.cs
+++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/GlobalEndpointManagerTest.cs
@@ -407,6 +407,45 @@ public async Task GetDatabaseAccountFromAnyLocationsMockTestAsync()
}
}
+ ///
+ /// Test to validate that when an exception is thrown during a RefreshLocationAsync call
+ /// the exception should not be bubbled up and remain unobserved. The exception should be
+ /// handled gracefully and logged as a warning trace event.
+ ///
+ [TestMethod]
+ public async Task RefreshLocationAsync_WhenGetDatabaseThrowsException_ShouldNotBubbleUpAsUnobservedException()
+ {
+ // Arrange.
+ Mock mockOwner = new Mock();
+ mockOwner.Setup(owner => owner.ServiceEndpoint).Returns(new Uri("https://defaultendpoint.net/"));
+ mockOwner.Setup(owner => owner.GetDatabaseAccountInternalAsync(It.IsAny(), It.IsAny())).ThrowsAsync(new TaskCanceledException());
+
+ //Create connection policy and populate preferred locations
+ ConnectionPolicy connectionPolicy = new ConnectionPolicy();
+ connectionPolicy.PreferredLocations.Add("ReadLocation1");
+ connectionPolicy.PreferredLocations.Add("ReadLocation2");
+
+ bool isExceptionLogged = false;
+ void TraceHandler(string message)
+ {
+ if (message.Contains("Failed to refresh database account with exception:"))
+ {
+ isExceptionLogged = true;
+ }
+ }
+
+ DefaultTrace.TraceSource.Listeners.Add(new TestTraceListener { Callback = TraceHandler });
+ DefaultTrace.InitEventListener();
+
+ using GlobalEndpointManager globalEndpointManager = new (mockOwner.Object, connectionPolicy);
+
+ // Act.
+ await globalEndpointManager.RefreshLocationAsync(forceRefresh: false);
+
+ // Assert.
+ Assert.IsTrue(isExceptionLogged, "The exception was logged as a warning trace event.");
+ }
+
private sealed class GetAccountRequestInjector
{
public Func ShouldFailRequest { get; set; }