gpt4 book ai didi

c++ - CEPH + Librados++ 没有返回一致的结果

转载 作者:行者123 更新时间:2023-11-28 04:28:02 26 4
gpt4 key购买 nike

嘿,我正在尝试使用 Ceph 来存储一些数据,但有一个问题,我写入 Ceph 的内容和通过 librados++ 从 Ceph 读取的内容是不一样的。

所以我有这个简单的例子:

#include <iostream>
#include <string>
#include <rados/librados.hpp>

int main(int argc, const char **argv)
{

int ret = 0;

/* Declare the cluster handle and required variables. */
librados::Rados cluster;
char cluster_name[] = "ceph";
char user_name[] = "client.admin";
uint64_t flags = 0;

/* Initialize the cluster handle with the "ceph" cluster name and "client.admin" user */
{
ret = cluster.init2(user_name, cluster_name, flags);
if (ret < 0)
{
std::cerr << "Couldn't initialize the cluster handle! error " << ret << std::endl;
return EXIT_FAILURE;
}
else
{
std::cout << "Created a cluster handle." << std::endl;
}
}

/* Read a Ceph configuration file to configure the cluster handle. */
{
ret = cluster.conf_read_file("/etc/ceph/ceph.conf");
if (ret < 0)
{
std::cerr << "Couldn't read the Ceph configuration file! error " << ret << std::endl;
return EXIT_FAILURE;
}
else
{
std::cout << "Read the Ceph configuration file." << std::endl;
}
}

/* Read command line arguments */
{
ret = cluster.conf_parse_argv(argc, argv);
if (ret < 0)
{
std::cerr << "Couldn't parse command line options! error " << ret << std::endl;
return EXIT_FAILURE;
}
else
{
std::cout << "Parsed command line options." << std::endl;
}
}

/* Connect to the cluster */
{
ret = cluster.connect();
if (ret < 0)
{
std::cerr << "Couldn't connect to cluster! error " << ret
<< std::endl;
return EXIT_FAILURE;
}
else
{
std::cout << "Connected to the cluster." << std::endl;
}
}

/* Continued from previous C++ example, where cluster handle and
* connection are established. First declare an I/O Context.
*/

librados::IoCtx io_ctx;
const char *pool_name = "data";

{
ret = cluster.ioctx_create(pool_name, io_ctx);
if (ret < 0)
{
std::cerr << "Couldn't set up ioctx! error " << ret << std::endl;
exit(EXIT_FAILURE);
}
else
{
std::cout << "Created an ioctx for the pool." << std::endl;
}

librados::bufferlist bl;
std::string hw = "hello world!";
bl.append(hw.c_str());

ret = io_ctx.write_full("hw", bl);

librados::bufferlist rl;
int read_len = hw.size();
librados::AioCompletion* rc = librados::Rados::aio_create_completion();
ret = io_ctx.aio_read("hw", rc, &rl, read_len, 0);
rc->wait_for_complete();

ret = rc->get_return_value();

if (!(ret < 0))
{
auto out = std::string(rl.c_str());
std::cout << out << std::endl;
}
else
{
std::cout << "da <expletive deleted>?" << std::endl;
}

}

return 0;
}

当我多次运行该程序时,我如何得到 hello world!每次都出来,但出于某种原因,有时我得到一个 r , m , 或 z附加到我的字符串,我对此一无所知。

我试过 std::vector<uint8_t>到一个字符串并返回,结果相同。这就是我最初发现问题的方式。

我正在为 C++ 使用最新的 librados。

我希望有人能提供帮助。

在示例中我删除了很多 if (ret < 0)这仅适用于 stackoverflow,它们包含在我的完整示例中。

最佳答案

Ceph 缓冲区列表结构实际上并不是以 NULL 结尾的,即使您调用了 c_str() 函数。 (对糟糕的设计感到抱歉!)

因此,当您调用 bufferlist::c_str() 并将其提供给字符串构造函数时,它将具有任意长度,直到它后面的第一个随机 NULL 字节为止。您可以通过获取长度并在构造字符串时显式设置它来解决此问题。

关于c++ - CEPH + Librados++ 没有返回一致的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53769746/

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