Ceph OSD处理客户端写操作处理流程
2019独角兽企业重金招聘Python工程师标准>>>
1、OSD从client端收到请求的处理流程
OSD::ms_fast_dispatch()
|__OSD::dispatch_session_waiting()
|__OSD::dispatch_op_fast()
|__OSD::handle_op()
|__OSD::get_pg_or_queue_for_pg()
|__OSD::enqueue_op()
|__PG::queue_op()
|__OSD::op_wq.queue() 将client的请求写入到队列
主OSD处理从client端请求的处理流程
OSD::ShardOpWQ::_process()
|__OSD::dequeue_op()
|__ReplicatedPG::do_request()
|__ReplicatedPG::do_op()
|__ReplicatedPG::execute_ctx()
|__ReplicatedPG::preapare_transcation()
|__ReplicatedPG::do_osd_ops()
|__ReplicatedPG::issue_repop()
|__ReplicateBackend::submit_transaction()
|__ReplicateBackend::issue_op() 主OSD将写请求发送到从OSDs
|__ReplicatedPG::queue_transcations() 写主OSD FileJournal
|__ObjectStore::queue_transactions()
|__FileStore::queue_transactions()
|__JournalingObjectStore::_op_journal_transactions()
|__FileJournal::submit_entry() 将日志写入到FileJournal的writeq队列
|__ReplicatedPG::eval_repop()
主OSD的FileJournal写线程
FileJournal::write_thread_entry() 负责从writeq队列中获取待写入的日志
|__FileJournal::prepare_multi_write() 构成日志
|__FileJournal::do_write() 实际写日志
|__FIleJournal::queue_completions_thru()
|__completion_peek_front() 获取C_JournalAhead类实例
|__finisher->queue()
|__finisher_cond.Signal() 启动FileJournal的finisher线程处理C_JournalAhead类实例
主OSD的C_JournalAhead类处理
C_JournalAhead::finish()
|__FileStore::_journaled_ahead()
|__FileStore::queue_op()
|__FileStore::op_wq.queue() 将数据写入到FileStore写线程队列中
|__ondisk_finisher.queue(ondisk) 调用ReplicatedBackend->op_commit()回调函数
主OSD的FileStore写数据线程类处理
FileStore::op_wq
|__FileStore::op_wq._process()
|__FileStore::_do_op()
|__FileStore::_do_transactions()
|__FileStore::_do_transaction()
|__FileStore::_write() 落盘到FileStore中(写入指定的文件中)
|__FileStore::op_wq._process_finish()
|__FileStore::_finish_op()
|__op_finisher.queue() 调用ReplicatedPG::op_applied()回调函数
2、从OSD处理主OSD端发送过来的请求
OSD::ms_fast_dispatch()
|__OSD::dispatch_session_waiting()
|__OSD::dispatch_op_fast()
|__OSD::handle_replica_op()
|__OSD::get_pg_or_queue_for_pg()
|__OSD::enqueue_op()
|__PG::queue_op()
|__OSD::op_wq.queue() 将主OSD的请求写入到从OSD处理队列中
从OSD处理workqueue
OSD::ShardOpWQ::_process()
|__OSD::dequeue_op()
|__ReplicatedPG::do_request()
|__ReplicatedBackend::handle_message()
|__ReplicatedBackend::sub_op_modify()
|__ReplicatedBackend::sub_op_modify_impl()
|__注册commit回调函数类C_OSD_RepModifyCommit()
|__注册Apply回调函数类C_OSD_RepModifyApply()
|__ReplicatedPG::queue_transcations() 从OSD写FileJournal
|__ObjectStore::queue_transactions()
|__FileStore::queue_transactions()
|__JournalingObjectStore::_op_journal_transactions()
|__FileJournal::submit_entry() 将日志写入到FileJournal的writeq队列
|__ReplicatedPG::eval_repop()
从OSD的FileJournal写线程
FileJournal::write_thread_entry() 负责从writeq队列中获取待写入的日志
|__FileJournal::prepare_multi_write() 构成日志
|__FileJournal::do_write() 实际写日志
|__FIleJournal::queue_completions_thru()
|__completion_peek_front() 获取C_JournalAhead类实例
|__finisher->queue()
|__finisher_cond.Signal() 启动FileJournal的finisher线程处理C_JournalAhead类实例
从OSD的C_JournalAhead类处理
C_JournalAhead::finish()
|__FileStore::_journaled_ahead()
|__FileStore::queue_op()
|__FileStore::op_wq.queue() 将数据写入到FileStore写线程队列中
|__ondisk_finisher.queue(ondisk) 调用ReplicatedBackend->op_commit()回调函数
从OSD的日志写完成后的处理
C_OSD_RepModifyCommit()
|__finish()
|__ReplicatedBackend::sub_op_modify_commit()
|__生成MOSDRepOpReply消息 CEPH_OSD_FLAG_ONDISK
|__ReplicatedPG::send_message_osd_cluster() 将从OSD回复信息发给主OSD
|__OSD::send_message_osd_cluster()
从OSD的FileStore写数据线程类处理
FileStore::op_wq
|__FileStore::op_wq._process()
|__FileStore::_do_op()
|__FileStore::_do_transactions()
|__FileStore::_do_transaction()
|__FileStore::_write() 落盘到FileStore中(写入指定的文件中)
|__FileStore::op_wq._process_finish()
|__FileStore::_finish_op()
|__op_finisher.queue() 调用ReplicatedPG::op_applied()回调函数
从OSD的落盘完成后的处理
C_OSD_RepModifyApply()
|__finish()
|__ReplicatedBackend::sub_op_modify_applied()
|__生成MOSDRepOpReply消息 CEPH_OSD_FLAG_ACK
|__ReplicatedPG::send_message_osd_cluster() 将从OSD回复信息发给主OSD
|__OSD::send_message_osd_cluster()
3、主OSD处理从OSD发送Reply处理流程
从OSD处理主OSD端发送过来的请求
OSD::ms_fast_dispatch()
|__OSD::dispatch_session_waiting()
|__OSD::dispatch_op_fast()
|__OSD::handle_replica_op()
|__OSD::get_pg_or_queue_for_pg()
|__OSD::enqueue_op()
|__PG::queue_op()
|__OSD::op_wq.queue() 将从OSD的reply写入到主OSD处理队列中
主OSD处理从OSD端发送过来的reply
OSD::ShardOpWQ::_process()
|__OSD::dequeue_op()
|__ReplicatedPG::do_request()
|__ReplicatedBackend::handle_message()
|__ReplicatedBackend::sub_op_modify_reply()
|__ip_op.waiting_for_commit.erase()
|__ip_op.waiting_for_applied.erase()
|__对于ip_op.waiting_for_commit为空,则调用ip_op.on_commit->complete(0),即:调用on_all_commit回调函数处理。on_all_commit回调函数在ReplicatedPG.cc::execute_ctx()函数中注册,用来对所有副本在写FileJournal完成后的处理。on_all_commit()函数设置all_committed=true,之后调用eval_repop()函数;
|__对于ip_op.waiting_for_applied为空,则调用ip_op.on_applied->complete(0),即:调用on_all_applied回调函数处理。on_all_applied回调函数在ReplicatedPG.cc::execute_ctx()函数中注册,用来对所有副本都落盘完成后的处理。on_all_applied()函数设置all_applied=true,之后调用eval_repop()函数。在eval_repop()函数中若all_applied=true,则创建一个MOSDOpReply消息并且设置消息的flags=CEPH_OSD_FLAG_ACK且将该消息发送给客户端;
转载于:https://my.oschina.net/linuxhunter/blog/647319
Ceph OSD处理客户端写操作处理流程相关推荐
- Ceph MDS 处理客户端删除目录操作源码分析
存储系统:ceph-14.2.22 Server::handle_client_unlink [ 文件路径 ] ceph/src/mds/Server.cc 当客户端发送删除文件请求到mds服务端时, ...
- 解决ceph osd写满导致osd无法启动的问题
背景 最近一个无人看管的ceph集群出现了osd被写满的情况,osd磁盘使用量99.99%,然后osd自己down了,重启也启动不起来. 可能是因为之前有人调过full的限制值,所以才完全写满了,由于 ...
- 【ceph】ceph osd blacklist cep黑名单|MDS问题分析
目录 blacklist 是什么 blacklist相关操作 Ceph MDS问题分析 CephFS client evict子命令使用 概述 命令格式 1. 查看所有client/session 2 ...
- Ceph BlueStore 和双写问题
论开源分布式存储,Ceph大名鼎鼎.用同一个存储池融合提供块存储.对象存储.集群文件系统.在国内有近年使用量迅速攀升,Ceph Day峰会也搬到北京来开了. 大型公司内部研发云虚拟化平台,常使用开源方 ...
- ceph osd 由于“No space left on device” 异常down,通过扩容文件系统或者显式运行osd进程解决
文章目录 ceph版本: 环境配置: 异常问题: 问题解决: 总结 ceph版本: ceph 12.2.1 环境配置: tier_pool 16个分区大小800G 的osd容量 3副本 data_po ...
- 二, 大数据基础架构Hadoop-HDFS入门和基本操作(基本组成, Shell操作, API操作, 读写流程) hf
一, HDFS概述 1.1 HDFS的产生背景和定义 随着数据量越来越大,我们需要把文件分布存储到多台计算机上,分布式文件管理系统作为一种管理多台机器上文件的系统应运而生, HDFS是其中的一种. H ...
- Spring Cloud 微服务项目操作实战流程(完结)
Spring Cloud入门项目操作实战流程 Day01~02 〇.Service - 业务服务结构 商品服务 item service,端口 8001 用户服务 user service,端口 81 ...
- linux操作系统启动流程与kickstart文件制作
文章目录 一.Linux操作系统启动流程 1.1.简单回顾linux系统组成以及内核作用 1.2.简单了解一下磁盘构成以及相关基础知识 二.CentOS 启动流程(只适用于MBR类型的PC架构主机) ...
- 【ceph】ceph OSD状态及常用命令
OSD进程的启动停止:https://blog.csdn.net/bandaoyu/article/details/119894927 1. OSD概念 OSD:Object Storage Devi ...
- ceph常用命令及其使用、ceph集群定位常用命令说明【如ceph osd set norebalance】、ceph官方文档查询地址
文章目录 ceph集群的监控 查看OSD版本 检查集群的健康情况 监控集群的时间 查看集群的空间利用率 查看集群的状态 查看集群的实时状态 获取秘钥列表 查看ceph特征 查看osd存储引擎 获得所有 ...
最新文章
- c语言一行黑白相间的瓷砖,C语言编程练习15:贴瓷砖
- NuGet学习笔记(1)——初识NuGet及快速安装使用
- mysql explain理解
- CentOS 6.2编译安装Nginx1.2.0+MySQL5.5.25+PHP5.3.13+博客系统WordPress3.3.2
- Python内存管理以及垃圾回收机制
- 【华为大咖分享】6.华为专家揭秘研发效能提升之道(后附PPT下载地址)
- 代码有温度 科技需向善
- java单例模式使用及注意事项
- FZU 2128 最长子串
- hdu Collect More Jewels
- 逻辑教育大厂必备IOS面试突击班
- 简述具有五层协议的网络体系结构各层的主要功能。
- 读书笔记,《刻意练习》,第三章,心理表征
- 2.8 mm / 4 mm / 6 mm / 8 mm 焦距的镜头分别能监控多大范围?
- 重庆师范大学计算机技术排名,2017年重庆师范大学专业排名
- php怎么格式化json,phpJSON数据格式化(美化)的方法
- LayaAir IDE 项目发布3.0 详解(含命令行发布)
- 【题解】慈溪中学-8.12-T3
- 股市中的内盘、外盘、跌幅、震幅、现手、总手、换手是什么意思?
- .NET Reactor简单使用教程
热门文章
- dataframe scala 修改值_如何填补Pandas中的缺失值(机器学习入门篇)
- 来面试,偷懒不答题,直接忽略
- LINUX编译Android FFmpeg:fatal error: errno.h: No such file or directory
- 原来编译通过,现在编译不通过,怎么回事?
- 使用Freetype发现的问题记录
- 纽微特成立起因:申某账务有鬼,张某不干活怎么不说
- jpeglib画质的代码分析
- 管理感悟:能表格不文字
- linux内存测试工具memtest,linux内存测试工具memtester使用
- java数组函数_Java数组