diff --git a/rest/api_test.go b/rest/api_test.go index abf0784a19..a6dd921969 100644 --- a/rest/api_test.go +++ b/rest/api_test.go @@ -3532,3 +3532,122 @@ func TestDisableAllowStarChannel(t *testing.T) { assert.Error(t, err, errResp) base.DebugfCtx(t.Context(), base.KeySGTest, "additional logs") } + +func TestUnsupportedServerConfigOptions(t *testing.T) { + tests := []struct { + name string + expectedConnStr string + kvBuffer int + dcpBuffer int + serverless bool + params string + }{ + { + name: "serverless-no_query_param-no_unsupported_options", + serverless: true, + expectedConnStr: "?dcp_buffer_size=1048576&idle_http_connection_timeout=90000&kv_buffer_size=1048576&kv_pool_size=1&max_idle_http_connections=64000&max_perhost_idle_http_connections=256", + }, + { + name: "non_serverless-no_query_param_and_no_unsupported_options", + serverless: false, + expectedConnStr: "?idle_http_connection_timeout=90000&kv_pool_size=2&max_idle_http_connections=64000&max_perhost_idle_http_connections=256", + }, + { + name: "serverless-no_query_param-unsupported_options", + serverless: true, + expectedConnStr: "?dcp_buffer_size=3000&idle_http_connection_timeout=90000&kv_buffer_size=2000&kv_pool_size=1&max_idle_http_connections=64000&max_perhost_idle_http_connections=256", + kvBuffer: 2000, + dcpBuffer: 3000, + }, + { + name: "non_serverless-no_query_param-unsupported_options", + serverless: false, + expectedConnStr: "?dcp_buffer_size=3000&idle_http_connection_timeout=90000&kv_buffer_size=2000&kv_pool_size=2&max_idle_http_connections=64000&max_perhost_idle_http_connections=256", + kvBuffer: 2000, + dcpBuffer: 3000, + }, + { + name: "serverless-dcp_buffer_query_param-kv_buffer_unsupported_option", + serverless: true, + params: "?dcp_buffer_size=20", + expectedConnStr: "?dcp_buffer_size=20&idle_http_connection_timeout=90000&kv_buffer_size=2000&kv_pool_size=1&max_idle_http_connections=64000&max_perhost_idle_http_connections=256", + kvBuffer: 2000, + }, + { + name: "non_serverless-dcp_buffer_query_param-kv_buffer_unsupported_option", + serverless: false, + params: "?dcp_buffer_size=20", + expectedConnStr: "?dcp_buffer_size=20&idle_http_connection_timeout=90000&kv_buffer_size=2000&kv_pool_size=2&max_idle_http_connections=64000&max_perhost_idle_http_connections=256", + kvBuffer: 2000, + }, + { + name: "serverless-dcp_buffer_query_param-dcp_buffer_unsupported_option", + serverless: true, + params: "?dcp_buffer_size=20", + expectedConnStr: "?dcp_buffer_size=20&idle_http_connection_timeout=90000&kv_buffer_size=1048576&kv_pool_size=1&max_idle_http_connections=64000&max_perhost_idle_http_connections=256", + dcpBuffer: 3000, + }, + { + name: "non_serverless-dcp_buffer_query_param-dcp_buffer_unsupported_option", + serverless: false, + params: "?dcp_buffer_size=20", + expectedConnStr: "?dcp_buffer_size=20&idle_http_connection_timeout=90000&kv_pool_size=2&max_idle_http_connections=64000&max_perhost_idle_http_connections=256", + dcpBuffer: 3000, + }, + { + name: "serverless-kv_buffer_query_param-kv_buffer_unsupported_option", + serverless: true, + params: "?kv_buffer_size=20", + expectedConnStr: "?dcp_buffer_size=1048576&idle_http_connection_timeout=90000&kv_buffer_size=20&kv_pool_size=1&max_idle_http_connections=64000&max_perhost_idle_http_connections=256", + kvBuffer: 2000, + }, + { + name: "non_serverless-kv_buffer_query_param-kv_buffer_unsupported_option", + serverless: false, + params: "?kv_buffer_size=20", + expectedConnStr: "?idle_http_connection_timeout=90000&kv_buffer_size=20&kv_pool_size=2&max_idle_http_connections=64000&max_perhost_idle_http_connections=256", + kvBuffer: 2000, + }, + { + name: "serverless-kv_buffer_query_param-dcp_buffer_unsupported_option", + serverless: true, + params: "?kv_buffer_size=20", + expectedConnStr: "?dcp_buffer_size=3000&idle_http_connection_timeout=90000&kv_buffer_size=20&kv_pool_size=1&max_idle_http_connections=64000&max_perhost_idle_http_connections=256", + dcpBuffer: 3000, + }, + { + name: "non_serverless-kv_buffer_query_param-dcp_buffer_unsupported_option", + serverless: false, + params: "?kv_buffer_size=20", + expectedConnStr: "?dcp_buffer_size=3000&idle_http_connection_timeout=90000&kv_buffer_size=20&kv_pool_size=2&max_idle_http_connections=64000&max_perhost_idle_http_connections=256", + dcpBuffer: 3000, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + ctx := base.TestCtx(t) + serverBase := "couchbases://example.com" + sc := &StartupConfig{ + Bootstrap: BootstrapConfig{ + Server: serverBase + test.params, + }, + Unsupported: UnsupportedConfig{ + Serverless: ServerlessConfig{ + Enabled: base.Ptr(test.serverless), + }, + }, + } + dbConfig := &DatabaseConfig{ + DbConfig: DbConfig{ + Unsupported: &db.UnsupportedOptions{ + KVBufferSize: test.kvBuffer, + DCPReadBuffer: test.dcpBuffer, + }, + }, + } + spec, err := GetBucketSpec(ctx, dbConfig, sc) + require.NoError(t, err) + require.Equal(t, serverBase+test.expectedConnStr, spec.Server) + }) + } +} diff --git a/rest/server_context.go b/rest/server_context.go index 7901543a7f..6507740530 100644 --- a/rest/server_context.go +++ b/rest/server_context.go @@ -595,13 +595,19 @@ func (sc *ServerContext) getOrAddDatabaseFromConfig(ctx context.Context, config func GetBucketSpec(ctx context.Context, config *DatabaseConfig, serverConfig *StartupConfig) (base.BucketSpec, error) { var server string - if config.Server != nil { + if config.Server != nil && *config.Server != "" { server = *config.Server } else { server = serverConfig.Bootstrap.Server } - if serverConfig.IsServerless() { - params := base.DefaultServerlessGoCBConnStringParams() + + if !base.ServerIsWalrus(server) { + var params *base.GoCBConnStringParams + if serverConfig.IsServerless() { + params = base.DefaultServerlessGoCBConnStringParams() + } else { + params = base.DefaultGoCBConnStringParams() + } if config.Unsupported != nil { if config.Unsupported.DCPReadBuffer != 0 { params.DcpBufferSize = config.Unsupported.DCPReadBuffer @@ -713,10 +719,6 @@ func (sc *ServerContext) _getOrAddDatabaseFromConfig(ctx context.Context, config // set this early so we have dbName available in db-init related logging, before we have an actual database ctx = base.DatabaseLogCtx(ctx, dbName, contextOptions.LoggingConfig) - if spec.Server == "" { - spec.Server = sc.Config.Bootstrap.Server - } - // Connect to bucket base.InfofCtx(ctx, base.KeyAll, "Opening db /%s as bucket %q, pool %q, server <%s>", base.MD(dbName), base.MD(spec.BucketName), base.SD(base.DefaultPool), base.SD(spec.Server))