- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
嘿,我正在尝试使用 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/
嘿,我正在尝试使用 Ceph 来存储一些数据,但有一个问题,我写入 Ceph 的内容和通过 librados++ 从 Ceph 读取的内容是不一样的。 所以我有这个简单的例子: #include #
早上好! 我在尝试从 librato 获取单个数字以在 html 页面中使用时遇到麻烦。 我只想获取指标AWS.Billing.EstimatedCharges.total的最后一个值,即花费该值的客
我想使用 ceph 开发一个对象存储应用程序。官方客户端库包括java/c++/php/python但不包括golang。我们的团队使用 golang 作为主要开发语言,使用 mac osx 作为默认
我是一名优秀的程序员,十分优秀!