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

news2024/9/22 13:46:58

版本

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.coloradmin.cn/o/2081853.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在读本科生可以考PMP吗?

PMP认证与学历无关&#xff0c;但在报考条件上需要留意以下几点&#xff1a; 学历要求&#xff1a;年满23周岁/高中毕业5年以上/ 大专毕业3年以上&#xff0c;只需满足其中一个条件即可&#xff1b; 证明要求&#xff1a;必须具备35学时&#xff08;PDU&#xff09;证明&…

值得收藏 猫咪浮毛异味难清理?三种有效的除毛工具来帮你

养猫一时爽&#xff0c;除毛火葬场&#xff01;我接老大布偶回家以来&#xff0c;都没怎么掉毛&#xff0c;还挺开心的。然后觉得可以负担得起第二只小猫&#xff0c;就养多一只老二银渐层。结果没接回来多久&#xff0c;我的”报应“来了...遇上换毛季&#xff0c;两只猫像是觉…

操作系统识别——CSP-J1真题讲解

【题目】 以下哪个不是操作系统?( ) A. Linux B. Windows C. Android D. HTML 【答案】 D 【解析】 操作系统&#xff08;Operating System&#xff0c;缩写&#xff1a;OS&#xff09;相当于电脑的管家&#xff0c;管理着计算机的硬件与软件资源&#xff0c;以供电…

分享一个基于springboot的中小学数字化教学资源管理平台java互动式教学资源学习与交流平台(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

俄罗斯市场应用程序翻译的特点

向俄罗斯市场扩张为应用程序开发人员带来了一系列独特的挑战和机遇。俄罗斯人口众多&#xff0c;精通技术&#xff0c;具有巨大地增长潜力。然而&#xff0c;为了在这个市场上取得成功&#xff0c;开发人员必须确保他们的应用程序得到有效地翻译和本地化&#xff0c;以满足俄罗…

【IoT】将各类遥控器(红外,频射,蓝牙,wifi,Zigbee)等设备接入米家,实现家庭物联网设备控制(以极米Z7X投影仪为例)

【IoT】将各类遥控器&#xff08;红外&#xff0c;频射&#xff0c;蓝牙&#xff0c;wifi&#xff0c;加密&#xff09;等设备接入米家&#xff0c;实现家庭物联网设备控制&#xff08;以极米Z7X投影仪为例&#xff09; 文章目录 1、三种主流遥控方式&#xff08;红外&#xff…

差旅费用报销之合规性管理

除了在差旅报销流程简化和效率提升方面表现抢眼&#xff0c;差旅费用报销平台分贝通在报销方案的合规性管理方面也有自己的“专长”&#xff0c;以确保合作企业的费用报销流程符合预算规则和法规政策&#xff0c;降低差旅管理成本和风险。 费用报销合规性之政策合规 首先&…

信息安全数学基础(1)整除的概念

前言 在信息安全数学基础中&#xff0c;整除是一个基础且重要的概念。它涉及整数之间的特定关系&#xff0c;对于理解数论、密码学等领域至关重要。以下是对整除概念的详细阐述&#xff1a; 一、定义 设a, b是任意两个整数&#xff0c;其中b ≠ 0。如果存在一个整数q&#xff0…

C++ | Leetcode C++题解之第375题猜数字大小II

题目&#xff1a; 题解&#xff1a; class Solution { public:int getMoneyAmount(int n) {vector<vector<int>> f(n1,vector<int>(n1));for (int i n - 1; i > 1; i--) {for (int j i 1; j < n; j) {f[i][j] j f[i][j - 1];for (int k i; k &l…

深度学习速通系列:标准化和归一化

在数据处理中&#xff0c;“标准化”&#xff08;Standardization&#xff09;和"归一化"&#xff08;Normalization&#xff09;是两种常用的数据预处理技术&#xff0c;它们用于调整数据的尺度&#xff0c;使得数据在分析或模型训练中更加公平和有效。 下面是两种…

《系统架构设计师教程(第2版)》第17章-通信系统架构设计理论与实践-01-局域网网络架构

文章目录 1. 局域网络架构概述2. 网络组成3 网络架构3.1 单核心架构3.2 双核心架构3.3 环型架构3.4 层次局域网架构 4. 网络协议的应用 通信系统网络架构 包括&#xff1a;局域网、广域网、移动通信网等 1. 局域网络架构概述 特点&#xff1a; 覆盖地理范围小数据传输速率高…

自定义校验--校验json长度

mysql8中支持json格式的字段&#xff0c;某些情况下使用很方便&#xff0c;但也带来一个问题&#xff0c;就是它的最大长度不能设置&#xff0c;最大支持4GB&#xff0c;如果有恶意程序保存一条4GB的数据进去&#xff0c;估计这张表就要卡死了,所以要加一个自定义校验&#xff…

人体行走步态周期转换为不同相位描述

目录 一、步行周期 二、相关论文描述 三、参考文献 一、步行周期 人体行走时的步态状态通常采用传感器进行判断&#xff0c;比如Dong Jin Hyun等[1]通过嵌入两个力感应电阻的鞋垫来估计的步行状态&#xff0c;其中一个检测脚趾接触&#xff0c;另一个检测脚后跟接触[5]。Con…

制造企业SRM系统中如何进行供应商的管理

一、供应商选择与评估 在SRM系统中&#xff0c;供应商的选择和评估是第一步。企业需要建立一套科学的评估体系&#xff0c;涵盖以下几个关键方面&#xff1a; 1. 质量&#xff1a;评估供应商的产品质量、质量控制体系和质量改进能力。 2. 成本&#xff1a;分析供应商的价格竞…

华为2024 届秋招招聘——硬件技术工程师-电源方向-机试题(四套)(每套四十题)

华为 2024 届秋招——硬件-电源机试题&#xff08;四套&#xff09;&#xff08;每套四十题&#xff09; 岗位——硬件技术工程师 岗位意向——电源 真题题目分享&#xff0c;完整版带答案(有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff0c;仅供参考&am…

【python】一招教会你,python爬虫过程中怎么快速随机生成userAgent

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

rkllm模型量化构建

在发布的 RKLLM 工具链压缩文件中&#xff0c;包含了 RKLLM-Toolkit 的 whl 安装包、RKLLM Runtime 库的相关文件以及参考示例代码&#xff0c;github链接如下&#xff1a;https://github.com/airockchip/rknn-llm 环境准备 RKLLM-Toolkit 由于提供的rkllm_toolkit包为pytho…

Jetpack架构组件_ViewModel组件_2.AndroidViewModel

1.AndroidViewModel简介 “Application context aware ViewModel. Subclasses must have a constructor which accepts Application as the only parameter.” AndroidViewModel是感知应用程序上下文的ViewModel。子类必须有一个接受Application作为唯一参数的构造函数。 2.…

Leetcode Hot 100刷题记录 -Day2(哈希表)

一、字母异位词分组 问题描述&#xff1a; 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 简单理解&#xff1a;字母异位词就是字母个数和种类都相同&#xff0c;但字…

萤石云移动端sdk常见问题

使用萤石云的SDK时常会遇到各种问题 首先&#xff0c;请先查看错误码文档&#xff0c;这能解决其中的绝大多数&#xff01;&#xff01;&#xff01; 如果没有找到&#xff0c;可以看看下方这些常见问题能否解决你碰到的情况。&#xff08;iOS可以在打印日志中搜索opensdk er…