BucketProvider doesn't support multiple concurrent calls of GetBucketAsync

Simple example. This buckets shouldn’t be initialized by BucketProvider earlier.

var bucket1Task = _bucketProvider.GetBucketAsync("BucketName1");
var bucket2Task = _bucketProvider.GetBucketAsync("BucketName2");

var bucket1 = await bucket1Task;
var bucket2 = await bucket2Task;

Second await throws:

System.InvalidOperationException: ConfigHandler has already been started.
at Couchbase.Core.Configuration.Server.ConfigHandler.Start(Boolean withPolling)
at Couchbase.Core.ClusterContext.StartConfigListening()
at Couchbase.Cluster…ctor(ClusterOptions clusterOptions)
at Couchbase.Cluster.ConnectAsync(ClusterOptions options)
at Couchbase.Extensions.DependencyInjection.Internal.ClusterProvider.GetClusterAsync()
at Couchbase.Extensions.DependencyInjection.Internal.BucketProvider.b__4_0(String name)
at CouchbaseDI.Controllers.BucketTest.ConnectBoth() in C:\Users\Ivant\source\repos\CouchbaseDI\Controllers\BucketTest.cs:line 42
at lambda_method(Closure , Object )
at Microsoft.Extensions.Internal.ObjectMethodExecutorAwaitable.Awaiter.GetResult()
at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.AwaitableResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object arguments)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Logged|12_1(ControllerActionInvoker invoker)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Logged|17_1(ResourceInvoker invoker)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

This maybe looks like a bug that I created (https://issues.couchbase.com/browse/NCBC-2641), but your reproduction steps are so much simpler than mine :slight_smile:

This has probably already been fixed, just not released to NuGet yet:

It now ensures that it doesn’t try to initialize the cluster multiple times in parallel.

2 Likes

@Ramirag - DI 3.0.5 is up on NuGet with a fix (NCBC-2638)!