sách gpt4 ai đã đi

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

In lại 作者:行者123 更新时间:2023-11-28 04:28:02 26 4
mua khóa gpt4 Nike

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

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

#include 
#include
#include

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;
}
khác
{
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;
}
khác
{
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;
}
khác
{
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;
}
khác
{
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;
thoát(THOÁT_THẤT_CẦN);
}
khác
{
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;
}
khác
{
std::cout << "da ?" << std::endl;
}

}

trả về 0;
}

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

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

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

我希望有人能提供帮助。

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

1 Câu trả lời

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

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

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

26 4 0
Bài viết được đề xuất: html - div 中的图标定位 - 忽略文本空格
Bài viết được đề xuất: javascript - 联系表 7 带自动填充字段的条件字段
Bài viết được đề xuất: javascript - MDL-菜单右下角离屏
Bài viết được đề xuất: html - 如何将按钮与 html 和 css 对齐?
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com