【ceph学习】ceph如何进行数据的读写(1)

版本

ceph版本为17.

ceph如何进行读写接口的实现

Ceph的客户端通过librados的接口进行集群的访问,这里的访问包括:
1)对集群的整体访问
2)对象的访问
两类接口,这套接口(API)包括C、C++和Python的实现,接口通过网络实现对Ceph集群的访问。在客户端层面,可以在自己的程序中调用该接口,从而集成Ceph集群的存储功能,或者在监控程序中实现对Ceph集群状态的监控。

初始化一个ObjectWriteOperation对象,并进行初始化,设置参数,然后进行写操作。

例子:在RGW中,客户端会初始化一个OBjectWriteOperation的对象,然后调用librados中的接口进行操作。

    ObjectWriteOperation op;op.create(false);op.setxattr(RGW_ATTR_ID_TAG, bl);op.mtime2(&mtime_ts);op.write_full(*meta.data);op.rmxattr(name.c_str());rgw_rados_operate(dpp, ref.pool.ioctx(), ref.obj.oid, &op, null_yield);ioctx.operate(oid, op, flags);

下面针对每个函数调用进行详细的描述

  1. Create:初始化op对象
    void librados::ObjectWriteOperation::create(bool exclusive),实际调用的是ObjectOperation::create

    //librados_cxx.cc
    void librados::ObjectWriteOperation::create(bool exclusive){ceph_assert(impl);::ObjectOperation *o = &impl->o;o->create(exclusive);
    }
    //osdc/Object.h
    void create(bool excl) {OSDOp& o = add_op(CEPH_OSD_OP_CREATE);o.op.flags = (excl ? CEPH_OSD_OP_FLAG_EXCL : 0);
    }
    //ops是ObjectOperation中的一个属性,类型为small_vector<OSDOp, osdc_opvec_len>;
    OSDOp& add_op(int op) {ops.emplace_back();ops.back().op.op = op;out_bl.push_back(nullptr);ceph_assert(ops.size() == out_bl.size());out_handler.emplace_back();ceph_assert(ops.size() == out_handler.size());out_rval.push_back(nullptr);ceph_assert(ops.size() == out_rval.size());out_ec.push_back(nullptr);ceph_assert(ops.size() == out_ec.size());return ops.back();
    }
    
  2. setxattr和rmxattr
    二者类似,设置op对象的一些必要操作。

    //librados_cxx.cc
    void librados::ObjectWriteOperation::setxattr(const char *name, const bufferlist& v)
    {
    ceph_assert(impl);
    ::ObjectOperation *o = &impl->o;
    o->setxattr(name, v);
    }
    //osdc/Object.h
    void setxattr(const char *name, const ceph::buffer::list& bl) {add_xattr(CEPH_OSD_OP_SETXATTR, name, bl);
    }
    //ops是ObjectOperation中的一个属性,类型为small_vector<OSDOp, osdc_opvec_len>;
    void add_xattr(int op, const char *name, const ceph::buffer::list& data) {OSDOp& osd_op = add_op(op);osd_op.op.xattr.name_len = (name ? strlen(name) : 0);osd_op.op.xattr.value_len = data.length();if (name)osd_op.indata.append(name, osd_op.op.xattr.name_len);osd_op.indata.append(data);
    }
    
  3. write_full
    关键函数,进行对象的写操作。

    //librados_cxx.cc
    void librados::ObjectWriteOperation::write_full(const bufferlist& bl){ceph_assert(impl);::ObjectOperation *o = &impl->o;bufferlist c = bl;o->write_full(c);
    }
    //osdc/Object.h
    void write_full(ceph::buffer::list& bl) {add_data(CEPH_OSD_OP_WRITEFULL, 0, bl.length(), bl);
    }
    void add_data(int op, uint64_t off, uint64_t len, ceph::buffer::list& bl) {OSDOp& osd_op = add_op(op);osd_op.op.extent.offset = off;osd_op.op.extent.length = len;osd_op.indata.claim_append(bl);
    }
    
  4. rgw_rados_operate
    当op初步处理完成后,即可进行operate操作。交由存储池的ioctx进行处理

    int rgw_rados_operate(const DoutPrefixProvider *dpp, librados::IoCtx& ioctx, const std::string& oid,librados::ObjectWriteOperation *op, optional_yield y, int flags){if (y) {auto& context = y.get_io_context();auto& yield = y.get_yield_context();boost::system::error_code ec;librados::async_operate(context, ioctx, oid, op, flags, yield[ec]);return -ec.value();}if (is_asio_thread) {ldpp_dout(dpp, 20) << "WARNING: blocking librados call" << dendl;}return ioctx.operate(oid, op, flags);
    }
    int librados::IoCtx::operate(const std::string& oid, librados::ObjectWriteOperation *o, int flags) {object_t obj(oid);if (unlikely(!o->impl))return -EINVAL;return io_ctx_impl->operate(obj, &o->impl->o, (ceph::real_time *)o->impl->prt, translate_flags(flags));
    }
    //librados/IoctxImpl.cc
    //其中核心部分是objecter_op和objecter的op_submit函数.objecter是osdc的Object类的对象,后面的操作就涉及到osdc中的操作了。
    int librados::IoCtxImpl::operate(const object_t& oid, ::ObjectOperation *o,ceph::real_time *pmtime, int flags)
    {
    ceph::real_time ut = (pmtime ? *pmtime :ceph::real_clock::now());/* can't write to a snapshot */
    if (snap_seq != CEPH_NOSNAP)return -EROFS;if (!o->size())return 0;ceph::mutex mylock = ceph::make_mutex("IoCtxImpl::operate::mylock");
    ceph::condition_variable cond;
    bool done;
    int r;
    version_t ver;Context *oncommit = new C_SafeCond(mylock, cond, &done, &r);int op = o->ops[0].op.op;
    ldout(client->cct, 10) << ceph_osd_op_name(op) << " oid=" << oid<< " nspace=" << oloc.nspace << dendl;
    Objecter::Op *objecter_op = objecter->prepare_mutate_op(oid, oloc,*o, snapc, ut,flags | extra_op_flags,oncommit, &ver);
    objecter->op_submit(objecter_op);{std::unique_lock l{mylock};cond.wait(l, [&done] { return done;});
    }
    ldout(client->cct, 10) << "Objecter returned from "<< ceph_osd_op_name(op) << " r=" << r << dendl;set_sync_op_version(ver);return r;
    }
    

总结

一个op经过初始化create,设置参数,setxattr,后面交给ioctx进行operate,submit给osdc。
下一篇,介绍osdc部分的处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/411740.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

XXE-labs靶场通关攻略

环境地址自行查找 1.寻找靶机地址 使用工具goby进行扫描 因为我的靶场是搭在ubuntu上 直接查找系统是Ubuntu的就可以找到 靶机IP 172.16.1.183 2.访问靶场 3.使用目录扫描工具进行扫描 使用kali自带的dirsearch进行扫描 可以看到一个robots.txt文件 4.访问robots.txt文件 …

发顶会首选:具身智能!新成果直接霸榜CVPR

最近无论是斯坦福机器人炒虾&#xff0c;还是特斯拉官宣机器人进厂&#xff0c;都赚足了眼球&#xff0c;实力证明了具身智能的火爆。 先不说具身智能是实现AGI的关键环节&#xff0c;也是未来研究的重要方向&#xff0c;我们就从发论文的角度来看&#xff0c;今年的各大顶会&…

【已解决】JS Uncaught DOMException: Failed to construct ‘Worker’ 所有场景

【已解决】JS Uncaught DOMException: Failed to construct ‘Worker’ 所有场景 概述 在JavaScript中&#xff0c;Web Workers允许我们运行后台脚本&#xff0c;这些脚本不会影响到页面的性能。然而&#xff0c;当我们尝试创建一个新的Worker时&#xff0c;有时会遇到“Uncau…

【C++】初识C++模板与STL

C语法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C内存管理 本章将简单分享C模板与STL相关知识&#xff0c;与之相关更多知识将留到下次更详细地来分享给大家 &#x1f3…

【微信小程序】全局数据共享 - MobX

1. 什么是全局数据共享 2. 小程序中的全局数据共享方案 3.Mobx的使用 1.npm init -y(根据实际情况选择) 在小程序项目中&#xff0c;可以通过 npm 的方式引入 MobX 。 如果你还没有在小程序中使用过 npm &#xff0c;那先在小程序目录中执行命令&#xff1a; npm init -y2. …

坐牢第三十一天(c++)

一.作业&#xff1a; 使用C手动封装一个顺序表&#xff0c;包含成员数组一个&#xff0c;成员变量N个 #include <iostream> #include <cstring> // 引入cstring以使用memcpy using namespace std; // 类型重命名 using datatype int; // typedef int datatype; s…

Pytorch封装简单RNN模型,进行中文训练及文本预测

简述 使用pytorch封装简单RNN模型&#xff0c;使用单层nn.RNN、nn.Linear等实现&#xff0c;然后做简单的文本预测。 数据集 代码参考李沐&#xff1a;https://zh-v2.d2l.ai/chapter_recurrent-neural-networks/rnn-concise.html&#xff0c;但他使用的是一篇英文小说&#…

通配符证书的简介和申请方法

通配符证书是一种SSL证书&#xff0c;它利用域名字段中的通配符&#xff08;*&#xff09;来指示&#xff0c;允许用户在一个证书中关联多个顶级域名及其子域&#xff0c;从而简化证书管理流程&#xff0c;节省成本和时间。以下是通配符证书的简介和申请方法的详细说明&#xf…

Springsecurity中的Eureka报错:Cannot execute request on any known server

完整报错信息&#xff1a; com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server 报错体现&#xff1a; 访问eureka控制面板&#xff1a; 访问测试地址&#xff1a; 控制台报错&#xff1a; 可能的报错原因&#xff…

ZW3D二次开发_UI_ZsCc::OptionRadios控件回调

1.ZW3D中的OptionRadios控件如何实现点击触发回调并且获取点击后的值&#xff1f;如下图 2.教程如下&#xff1a; 1&#xff09;添加OptionRadios控件到表单中 2&#xff09;增加radio按钮 3&#xff09;添加回调 4&#xff09;编写回调函数 int radioCallbackDemo(char* for…

【信息安全】基于CBC的3DES加解密-实验报告

实验运行效果截图 3DES进行加密 3DES进行解密 然后可以选择你想要的操作,继续加密解密或者退出。 基于CBC模式的3DES加解密 一、实验内容 基于3DES加解密算法,编程实现对任意文件实现加解密的软件。 编程实现DES加密和解密算法,并使用DES加解密算法实现3DES加解密算法。选…

Android活动(activity)与服务(service)进行通信

文章目录 Android活动&#xff08;activity&#xff09;与服务&#xff08;service&#xff09;进行通信活动与服务进行通信服务的生命周期 Android活动&#xff08;activity&#xff09;与服务&#xff08;service&#xff09;进行通信 活动与服务进行通信 上一小节中我们学…

基于FPGA的SD卡的数据读写实现(SD NAND FLASH)

文章目录 目录 1、存储芯片分类 2、NOR Flash 与 NAND Flash的区别 3、什么是SD卡&#xff1f; 4、什么是SD NAND&#xff1f; 5、SD NAND的控制时序 6、FPGA实现SD NAND读写 1、存储芯片分类 目前市面上的存储芯片&#xff0c;大致可以将其分为3大类&#xff1a; ① …

【回眸】QAC软件指南——错误分析篇(完整版)

前言 近期需要再次测一下代码&#xff0c;相比以前测试更有经验&#xff0c;也做了比较多的记录&#xff0c;正好将经验通过博客保留下来&#xff0c;为以后可能的QAC测试做准备。 安装导入分析代码 这部分在上一篇中已经详细介绍&#xff0c;具体请见&#xff0c;如有疑问可…

百元蓝牙耳机什么牌子的好?四大宝藏机型真实推荐,快速收藏!

作为一位蓝牙耳机爱好者&#xff0c;无论是上班、娱乐、学习我都离不开蓝牙耳机。通勤时候能听听音乐&#xff0c;是最好的享受&#xff0c;可以让我更加放松&#xff0c;尽情享受音乐带来的乐趣。但市面上的大多数蓝牙耳机都是货不对板的&#xff0c;不是音质一般、就是续航时…

谷歌发布 3 款 Gemini 新模型;字节开源 FLUX Dev Hyper SD Lora,8 步生图丨 RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

Seata执行原理分析-AT、XA、TCC、SAGA比较

分布式事务简介 1.1 本地事务 大多数场景下&#xff0c;我们的应用都只需要操作单一的数据库&#xff0c;这种情况下的事务称之为本地事务(Local Transaction)。本地事务的ACID特性是数据库直接提供支持。本地事务应用架构如下所示&#xff1a; 在JDBC编程中&#xff0c;我们…

priority_queue模拟

一、什么是priority_queue? priority_queue是C标准库中的一个容器适配器&#xff0c;用于实现优先队列&#xff08;priority queue&#xff09;的数据结构。优先队列是一种特殊的队列&#xff0c;其中的元素按照一定的优先级进行排序&#xff0c;每次取出的元素都是优先级最高…

从零开始掌握Vue实例

从零开始掌握Vue实例&#xff1a;深入理解数据绑定与生命周期的核心秘诀 引言 简要介绍主题&#xff1a; 在学习Vue.js的过程中&#xff0c;Vue实例是最基础也是最关键的部分。Vue实例是Vue应用的核心&#xff0c;它是数据、DOM元素和Vue组件之间的桥梁。掌握Vue实例的使用对于…

文件上传面板中限制需要的文件格式,并且隐藏“所有文件”选项

直接说需求&#xff1a;需要实现在文件上传面板中限制需要的文件格式&#xff0c;并且不想展示“所有文件”这个选项&#xff0c;应该怎么做嘞&#xff1f;效果如下图&#xff1a; 这里用到了 window.showOpenFilePicker 方法实现&#xff0c;首先定义接受的格式及限制&#xf…