gpt4 book ai didi

c++ - 无法以编程方式将数据上传到 Zookeeper

转载 作者:行者123 更新时间:2023-11-30 05:38:53 26 4
gpt4 key购买 nike

我在我的 Ubuntu 机器上安装了 Zookeeper。我在具有三个 z1z2z3 实例的集群模式下运行它。当我使用 bin/zkCli.sh -server 127.0.0.1:2181,127.0.0.1:2182,... 连接到它并执行 ls/ 我看到一个列表一些,比如说,节点或数据(我不确定术语)。现在我想要的是使用标准 C++ client 以编程方式上传一些数据。为了实现这一点,我有一堆函数,包括 init,我猜它会启动一个 session ,create 函数,它在内部调用 zoo_acreate和一个空的(此时为简单起见)回调函数 create_complete

最后提到的两个函数如下所示:

void create(const char * path,
const char * value) {
zoo_acreate(zh,
path,
value,
0,
&ZOO_OPEN_ACL_UNSAFE,
0,
create_completion,
NULL);
}

void create_completion (int rc, const char *value, const void *data) {
// empty at this moment
}

但是,当我尝试使用这些函数将一些数据上传到 zookeeper 时,我没有得到任何结果——实际上,没有错误,但同时没有数据。我使用这些函数的方式是这样的:

int main(){
hostPort = (char *)("127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183");
init(hostPort); // as a result of invoking this function
// I see in the console some logs, including this message:
// Initiating client connection, host=127.0.0.1:2181,....
create("/testworker", "");
return 0;
}

我想,这段代码应该在 Zookeeper 中创建一个 /testworker“文件夹”,然而,它并没有——ls/ 命令显示没有任何变化。我应该指出的一件有趣的事情是,我的程序似乎从未调用过 create_completion 回调(我使用 cout 对其进行了检查)。所以,我的程序可能需要一些特殊的标志和一些特殊的编译字符串。我现在编译的方式是:

$ g++ -o test test.cpp -I /...path_to_include_folder/ -L /..path_to_lib_folder/ -lzookeeper_mt

编辑

我稍微调查了一下这个问题,发现根本没有调用回调函数。例如,启动 session 的 init 函数不会调用 main_watcher 回调。这是为什么?

编辑

我仔细研究了一下。结果是,zookeeper_init(在我的 init 函数中调用)返回 0 作为 errno 的值此外,它将 zh(它是 static zhandle_t * 类型的动物园管理员处理程序)设置为某个值,因此 zh 不是 null 等等,根据 documentation , init 函数应该没问题(即使它不会触发回调例程)。所以我在控制台中没有错误消息并且使用标准 zookeeper 方法没有错误标志,但回调和数据上传仍然不起作用,这真的很奇怪。这有什么问题,我该如何调试它?

编辑

这是我的小例子的完整源代码:

#include <iostream>

#include "proto.h"
#include "zookeeper.h"
#include "zookeeper_log.h"
#include "recordio.h"
#include "zookeeper.jute.h"
#include "zookeeper_version.h"
#include "errno.h"


using namespace std;

static char *hostPort;
static zhandle_t * zh;
static int connected = 0;
static int expired = 0;
static int server_id;
static struct String_vector * workers = NULL;
static struct String_vector * tasks = NULL;

void create(const char *, const char *);
void create_completion(int, const char *, const void *);

void main_watcher(zhandle_t *zkh,
int type,
int state,
const char *path,
void* context)
{
// cout << "HELLO FROM WATCHER " << endl; // Not printed when I remove comment. Why???
if(type == ZOO_SESSION_EVENT){
if(state == ZOO_CONNECTED_STATE){
connected = 1;
}
else if(state == ZOO_AUTH_FAILED_STATE){
connected = 0;
}
else if(state == ZOO_EXPIRED_SESSION_STATE){
expired = 1;
connected = 0;
zookeeper_close(zkh);
}
}
}

int init(char* hostPort){
srand(time(NULL));
server_id = rand();
zoo_set_debug_level(ZOO_LOG_LEVEL_INFO);
zh = zookeeper_init(hostPort, main_watcher, 15000, 0, 0, 0);
return errno;
}

void create_completion(int rc, const char *value, const void * data){
// empty at this moment for simplicity
}

void create(const char * path, const char * value){
zoo_acreate(zh, path, value, 0, &ZOO_OPEN_ACL_UNSAFE, 0,
create_completion, NULL);
}



int main(){
hostPort = (char *)("127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183");
init(hostPort);
create("/testworkers", ""); // Do not see this "folder" /testworkers in Zookeeper. Why???
return 0;
}

编辑

这真的让我发疯。我花了几天时间阅读了一本关于 C++ 连接器到 Zookeeper 的书,但没有得到任何结果,我刚刚使用了第一个 Python 连接器,花了不超过 1.5 分钟就完成了。但这不是我想要的。我想看看如何在 C++ 中完成这个微不足道的事情 - 编译、连接和创建。而已。

编辑

我用 -DTHREADED 选项编译我的程序,但没有用。不过,zoo_acreate 不会创建任何东西。它不产生错误消息,不产生警告,不返回错误标志,也不提供任何结果。真是奇怪的图书馆。

最佳答案

代码中有两个错误。

1.在这个字符串中 static int server_id; 。必须是static clientid_t server_id;

2.你的初始化函数必须是

int init(char* hostPort)
{
//srand(time(NULL));
//server_id = rand();
zoo_set_debug_level(ZOO_LOG_LEVEL_INFO);
zh = zookeeper_init(hostPort, main_watcher, 15000, &server_id, 0, 0);
return errno;
}

请注意 zookeeper_init 和函数 srand(time(NULL));server_id = rand(); 必须是注释掉了。

还有其他的。查看 ma​​in 的新版本。我添加了无限循环。

int main()
{
hostPort = (char *)("127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183");
init(hostPort);
create("/testworkers", ""); // Do not see this "folder" /testworkers in Zookeeper. Why???

while(1)
{
sleep(1);
}

return 0;
}

关于c++ - 无法以编程方式将数据上传到 Zookeeper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32562042/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com