当前位置: 首页 > news >正文

【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部分的处理。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数据同步大冒险:PostgreSQL到MySQL的奇妙之旅
  • Java面试宝典-java基础08
  • 构建Spring Boot应用的微服务服务网格Istio集成
  • Java后端服务端渲染与客户端渲染:SSR与CSR的权衡
  • 使用Axure打造智慧场景下的数据可视化大屏原型
  • Android 动态性能框架 (ADPF)
  • STM32F1+HAL库+FreeTOTS学习8——第一个任务,启动!
  • linux-基础知识2
  • 白盒测试及其测试方法
  • Linux高级编程-进程间通信(IPC)
  • 构建大师:深入理解Linux下的Make和Makefile
  • UE5学习笔记20-给游戏添加声音
  • 安装VC++Redist报错0x80070003的解决办法
  • 大连网站建设手机网页页面设计
  • STM32入门教程:SPI通信
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 【Amaple教程】5. 插件
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • 2017年终总结、随想
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • Docker 笔记(2):Dockerfile
  • ES6系列(二)变量的解构赋值
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • JavaScript学习总结——原型
  • Linux gpio口使用方法
  • Lucene解析 - 基本概念
  • Next.js之基础概念(二)
  • Promise初体验
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Theano - 导数
  • Twitter赢在开放,三年创造奇迹
  • 分享一份非常强势的Android面试题
  • 基于Android乐音识别(2)
  • 基于游标的分页接口实现
  • 今年的LC3大会没了?
  • 浏览器缓存机制分析
  • 前端面试之CSS3新特性
  • 浅谈web中前端模板引擎的使用
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 小而合理的前端理论:rscss和rsjs
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​水经微图Web1.5.0版即将上线
  • ## 基础知识
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • ###STL(标准模板库)
  • $.ajax()
  • (~_~)
  • (04)odoo视图操作
  • (11)MATLAB PCA+SVM 人脸识别
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)ssm考生评分系统 毕业设计 071114