-
-
Notifications
You must be signed in to change notification settings - Fork 307
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Bug]: Overriding CouchbaseBuilder's default configurations resets enabled services #1039
Comments
Well, the bucket does not exist, nor do you create it. Use the default generated bucket:
Or create one: var bucketSettings = new BucketSettings();
bucketSettings.Name = TestBucketName;
bucketSettings.FlushEnabled = false;
bucketSettings.ReplicaIndexes = true;
bucketSettings.RamQuotaMB = 100;
bucketSettings.NumReplicas = 0;
await cluster.Buckets.CreateBucketAsync(bucketSettings)
.ConfigureAwait(false); |
@HofmeisterAn Thanks, however If I create new one as you suggested and want get default collection (to be able to query/add things ) from created bucket with following code: var bucket = await cluster.BucketAsync(TestBucketName);
var collection = await bucket.DefaultCollectionAsync(); I still getting the same error. |
The following lines work fine. You need to wait until the bucket is created. It is not available immediately. I am not a Couchbase expert, but I do not think these issues are related to the module implementation. await cluster.Buckets.CreateBucketAsync(bucketSettings)
.ConfigureAwait(false);
await Task.Delay(TimeSpan.FromSeconds(5))
.ConfigureAwait(false);
var bucket = await cluster.BucketAsync(bucketName)
.ConfigureAwait(false);
var collection = await bucket.DefaultCollectionAsync()
.ConfigureAwait(false); |
Is this really working for you ? This sample is giving me still the same error: using Couchbase;
using Couchbase.Management.Buckets;
using Testcontainers.Couchbase;
string TestBucketName = "Test";
CouchbaseContainer CouchbaseContainer
= new CouchbaseBuilder()
.WithPortBinding(8091, 8091)
.Build();
try
{
await CouchbaseContainer.StartAsync();
var options = new ClusterOptions
{
UserName = CouchbaseBuilder.DefaultUsername,
Password = CouchbaseBuilder.DefaultPassword,
};
var connectionString = CouchbaseContainer.GetConnectionString();
var cluster = await Cluster.ConnectAsync(connectionString, options);
var bucketSettings = new BucketSettings
{
Name = TestBucketName,
FlushEnabled = false,
ReplicaIndexes = true,
RamQuotaMB = 100,
NumReplicas = 0
};
await cluster.Buckets.CreateBucketAsync(bucketSettings)
.ConfigureAwait(false);
await Task.Delay(TimeSpan.FromSeconds(5))
.ConfigureAwait(false);
var bucket = await cluster.BucketAsync(TestBucketName)
.ConfigureAwait(false);
var collection = await bucket.DefaultCollectionAsync()
.ConfigureAwait(false);
}
catch (Exception e)
{
await CouchbaseContainer.DisposeAsync();
Console.WriteLine(e.ToString());
}```
 |
Ah, I see. Remove the
|
Thank you for suggestion but still I having the same behaviour. using Couchbase;
using Couchbase.Management.Buckets;
using Testcontainers.Couchbase;
string TestBucketName = "Test";
CouchbaseContainer CouchbaseContainer
= new CouchbaseBuilder()
.Build();
try
{
await CouchbaseContainer.StartAsync();
var options = new ClusterOptions
{
UserName = CouchbaseBuilder.DefaultUsername,
Password = CouchbaseBuilder.DefaultPassword,
};
var connectionString = CouchbaseContainer.GetConnectionString();
var cluster = await Cluster.ConnectAsync(connectionString, options);
var bucketSettings = new BucketSettings
{
Name = TestBucketName,
FlushEnabled = false,
ReplicaIndexes = true,
RamQuotaMB = 100,
NumReplicas = 0
};
await cluster.Buckets.CreateBucketAsync(bucketSettings)
.ConfigureAwait(false);
await Task.Delay(TimeSpan.FromSeconds(5))
.ConfigureAwait(false);
var bucket = await cluster.BucketAsync(TestBucketName)
.ConfigureAwait(false);
var collection = await bucket.DefaultCollectionAsync()
.ConfigureAwait(false);
}
catch (Exception e)
{
await CouchbaseContainer.DisposeAsync();
Console.WriteLine(e.ToString());
} |
Message:
Stacktrace:
After digging a bit I think this is comming from here: https://github.com/couchbase/couchbase-net-client/blob/master/src/Couchbase/Core/IO/Connections/Channels/ChannelConnectionPool.cs#L197 |
Have you checked the web front-end to see if the bucket exists after some time? It is possible that it is still being created, and it may just require some additional time. Internally, we use the following lines to detect when the default bucket is finally created: testcontainers-dotnet/src/Testcontainers.Couchbase/CouchbaseBuilder.cs Lines 259 to 267 in 871a9cd
|
Actually, it does not. You can obtain the randomly assigned host port from the inspect results, and the log messages contain a link to the web front-end as well.
This confirms my supposition. Just because the bucket exists does not mean it is ready to use. If I create a bucket and immediately check the {
"name": "Test",
"nodes": []
} However, when I wait a couple of seconds, I get: {
"name": "Test",
"nodes": [
{
"status": "healthy",
"services": [
"fts",
"index",
"kv",
"n1ql"
]
}
]
} Despite the issue I mentioned regarding overriding the default configuration, I do not see any other issues. I am sorry. I do not know how I can help you further. |
Thanks @HofmeisterAn. But even when I run this code on default bucket (which is I assume created already, because there is wait strategy) I am getting same error. using Couchbase;
using Couchbase.Management.Buckets;
using Testcontainers.Couchbase;
CouchbaseContainer CouchbaseContainer
= new CouchbaseBuilder()
.Build();
try
{
await CouchbaseContainer.StartAsync();
var options = new ClusterOptions
{
UserName = CouchbaseBuilder.DefaultUsername,
Password = CouchbaseBuilder.DefaultPassword,
};
var connectionString = CouchbaseContainer.GetConnectionString();
var cluster = await Cluster.ConnectAsync(connectionString, options);
var defaultBucket = (await cluster.Buckets.GetAllBucketsAsync()).Single();
var bucket = await cluster.BucketAsync(defaultBucket.Key)
.ConfigureAwait(false);
var collection = await bucket.DefaultCollectionAsync()
.ConfigureAwait(false);
}
catch (Exception e)
{
await CouchbaseContainer.DisposeAsync();
Console.WriteLine(e.ToString());
} |
As mentioned in SO#77396534, this appears to be a bug in the client. I encountered the same error with the latest client version. Downgrading the client to |
I will do that, thanks a lot for your help @HofmeisterAn. |
I will close this issue for now. If there is anything to do or to fix on the side of TC for .NET, do not hesitate to reopen the issue again or create a new one. Unfortunately, Couchbase's upstream repository does not allow creating issues. This is the related ticket, I think: NCBC-3545. |
Testcontainers version
3.5.0
Using the latest Testcontainers version?
Yes
Host OS
Windows
Host arch
x64
.NET version
6.0.14
Docker version
Client: Version: 24.0.2-rd API version: 1.43 Go version: go1.20.4 Git commit: e63f5fa Built: Fri May 26 16:43:15 2023 OS/Arch: windows/amd64 Context: default Server: Docker Desktop 4.24.1 (123237) Engine: Version: 24.0.6 API version: 1.43 (minimum version 1.12) Go version: go1.20.7 Git commit: 1a79695 Built: Mon Sep 4 12:32:16 2023 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.6.22 GitCommit: 8165feabfdfe38c65b599c4993d227328c231fca runc: Version: 1.1.8 GitCommit: v1.1.8-0-g82f18fe docker-init: Version: 0.19.0 GitCommit: de40ad0
Docker info
What happened?
I want to create bucket and use couchbase SDK together with Testcontainers. When writing basic code for setting up the container and create bucket I getting not very detailed exception.
Code to repro:
Csproj:
Program.cs
Relevant log output
No response
Additional information
I tried to create bucket from the UI and it worked.
The text was updated successfully, but these errors were encountered: