我最初在尝试更新存储桶时遇到身份验证错误的问题。然后我将服务器更新为更新的 Couchbase 服务器。现在,我不断收到超时错误,特别是在尝试向存储桶进行更新插入时出现 LCB_ERR_TIMEOUT (201)。网络可能存在问题还是我在代码中做错了什么?
代码:
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
#include <iostream>
#include "libcouchbase/couchbase.h"
static void open_callback(lcb_INSTANCE* instance, lcb_STATUS rc)
{
printf("Open bucket: %s\n", lcb_strerror_short(rc));
if (rc != LCB_SUCCESS) {
lcb_destroy(instance);
fprintf(stderr, "Failed to open bucket: %s\n", lcb_strerror_short(rc));
exit(EXIT_FAILURE);
}
}
static void store_callback(lcb_INSTANCE* instance, int cbtype, const lcb_RESPSTORE* resp)
{
const char* key;
size_t nkey;
uint64_t cas;
lcb_respstore_key(resp, &key, &nkey);
lcb_respstore_cas(resp, &cas);
printf("Storage callback\n");
printf("Status: %s, Key: %.*s, CAS: %" PRIx64 "\n",
lcb_strerror_short(lcb_respstore_status(resp)), (int)nkey, key, cas);
}
int main()
{
const char* connection_string = "couchbase://localhost";
const char* username = "username";
const char* password = "password";
const char* bucket = "bucket-name";
//connection credentials
lcb_CREATEOPTS* create_options = NULL;
lcb_createopts_create(&create_options, LCB_TYPE_CLUSTER);
lcb_createopts_connstr(create_options, connection_string, strlen(connection_string));
lcb_createopts_credentials(create_options, username, strlen(username), password, strlen(password));
//create an instance using default values
lcb_INSTANCE* instance;
lcb_STATUS rc = lcb_create(&instance, NULL); //rc is return code that needs to be checked
if (rc != LCB_SUCCESS) {
lcb_destroy(instance);
fprintf(stderr, "Failed to create instance: %s\n", lcb_strerror_short(rc));
exit(EXIT_FAILURE);
}
//initializes with credentials
rc = lcb_create(&instance, create_options);
rc = lcb_createopts_destroy(create_options);
//schedule intial connection to server
rc = lcb_connect(instance);
if (rc != LCB_SUCCESS) {
lcb_destroy(instance);
fprintf(stderr, "Failed to schedule connection object: %s\n", lcb_strerror_short(rc));
exit(EXIT_FAILURE);
}
rc = lcb_wait(instance, LCB_WAIT_DEFAULT);
if (rc != LCB_SUCCESS) {
lcb_destroy(instance);
fprintf(stderr, "Failed to wait for connection: %s\n", lcb_strerror_short(rc));
exit(EXIT_FAILURE);
}
rc = lcb_get_bootstrap_status(instance);
if (rc != LCB_SUCCESS) {
lcb_destroy(instance);
fprintf(stderr, "Failed to bootstrap cluster connection: %s\n", lcb_strerror_short(rc));
exit(EXIT_FAILURE);
}
// associate instance with a bucket
lcb_set_open_callback(instance, open_callback);
rc = lcb_open(instance, bucket, strlen(bucket));
if (rc != LCB_SUCCESS) {
fprintf(stderr, "Failed to schedule open bucket operation: %s\n", lcb_strerror_short(rc));
exit(EXIT_FAILURE);
}
rc = lcb_wait(instance, LCB_WAIT_DEFAULT);
if (rc != LCB_SUCCESS) {
fprintf(stderr, "Failed to wait for open bucket operation: %s\n", lcb_strerror_short(rc));
exit(EXIT_FAILURE);
}
lcb_install_callback(instance, LCB_CALLBACK_STORE, (lcb_RESPCALLBACK)store_callback);
lcb_CMDSTORE* cmd;
const char* key = "test-doc";
const char* value = "{\"Name\": \"name\"}";
rc = lcb_cmdstore_create(&cmd, LCB_STORE_UPSERT); //create upsert command
if (rc != LCB_SUCCESS) {
lcb_destroy(instance);
fprintf(stderr, "Failed to create upsert command: %s\n", lcb_strerror_short(rc));
exit(EXIT_FAILURE);
}
rc = lcb_cmdstore_key(cmd, key, strlen(key)); //assign key for upsert command
if (rc != LCB_SUCCESS) {
lcb_destroy(instance);
fprintf(stderr, "Failed to assign key for upsert: %s\n", lcb_strerror_short(rc));
exit(EXIT_FAILURE);
}
rc = lcb_cmdstore_value(cmd, value, strlen(value)); //assign value for upsert command
if (rc != LCB_SUCCESS) {
lcb_destroy(instance);
fprintf(stderr, "Failed to assign value for upsert: %s\n", lcb_strerror_short(rc));
exit(EXIT_FAILURE);
}
rc = lcb_store(instance, NULL, cmd); //schedule upsert command
if (rc != LCB_SUCCESS) {
lcb_destroy(instance);
fprintf(stderr, "Failed to schedule upsert command: %s\n", lcb_strerror_short(rc));
exit(EXIT_FAILURE);
}
rc = lcb_cmdstore_destroy(cmd); //destroy upsert command
if (rc != LCB_SUCCESS) {
lcb_destroy(instance);
fprintf(stderr, "Failed to wait for upsert to complete: %s\n", lcb_strerror_short(rc));
exit(EXIT_FAILURE);
}
rc = lcb_wait(instance, LCB_WAIT_DEFAULT); //wait for scheduled operations to finish
if (rc != LCB_SUCCESS) {
lcb_destroy(instance);
fprintf(stderr, "Failed to wait for upsert to complete: %s\n", lcb_strerror_short(rc));
exit(EXIT_FAILURE);
}
return 0;
}
输出:
Open bucket: LCB_SUCCESS (0)
Storage callback
Status: LCB_ERR_TIMEOUT (201), Key: Test, CAS: 0
你的代码看起来不错。我自己也遇到过类似的问题,我不确定我通过重新启动电脑来解决问题的原因,这不是永久或可持续的解决方案。可能是 SDK 的错误。