文档章节

LogSegment类分析

linuxhunter
 linuxhunter
发布于 2016/07/20 17:46
字数 582
阅读 155
收藏 0

LogSegment类说明:

class LogSegment {

     const log_segment_seq_t seq;          记录LogSegment序号

     uint64_t offset, end;                            记录偏移位置和结束位置

     int num_events;                                   记录event的数量

     elist<CDir*> dirty_dirfrags, new_dirfrags;          记录有变化的CDir结构

     elist<CDentry*> dirty_dentries;                         记录有变化的CDentry结构

     elist<CInode*> dirty_inodes;                              记录有变化的CInode

     elist<CInode*> dirty_parent_inodes, dirty_dirfrag_dir, dirty_dirfrag_nest, dirty_dirfrag_dirfragtree

     elist<CInode*> open_files;

     ...

};

LogSegment用来记录实际变化的CDir/CDentry/CInode的信息,LogSegment是整个MDLog最底层的数据结构

 

LogSegment类的方法:

LogSegment::try_to_expire(mds, gather_bld, op_prio)

|__遍历new_dirfrags/dirty_dirfrags数组

     |__将数组中的内容插入到commit数组

|__遍历dirty_dentries数组

     |__将数组中成员的CDentry::get_dir()插入到commit数组

|__遍历dirty_inodes数组

     |__将数组中成员的CInode::get_parent_dn()::get_dir()插入到commit数组

|__遍历commit数组

     |__若commit数组成员can_auth_pin()

          |__CDir::commit()                              提交针对CDir的修改

     |__若commit数组成员!can_auth_pin()

          |__CDir::add_waiter(CDir::WAIT_UNFREEZE)          添加到等待队列中

|__遍历uncommitted_masters数组

     |__mds->mdcache->wait_for_uncommitted_master()          等待客户端回复commit

|__遍历uncommitted_fragments数组

     |__mds->mdcache->wait_for_uncommitted_fragment()          等待未收到commit的fragment

|__遍历dirty_dirfrag_dir数组

     |__mds->locker->scatter_nudge()                                   等待dirlock flush

|__遍历dirty_dirfrag_dirfragtree数组

     |__mds->locker->scatter_nudge()                                   等待dirfragtreelock flush

|__遍历dirty_dirfrag_nest数组

     |__mds->locker->scatter_nudge()                                   等待nest flush

|__遍历open_files数组

     |__数组中的CInode是授权的并且有访问权限的

          |__若LogEvent为空

               |__创建一个新的EOpen类对象

               |__mds->mdlog->start_entry(EOpen)          将新的EOpen类对象写入到mdlog

          |__le->add_clean_inode()                         将inode添加到LogEvent的clean inode数组中

          |__ls->open_files.push_back()                            插入到LogSegment的open_files数组

     |__数组中的CInode是授权的但没有访问权限

          |__in->item_open_file.remove_myself()               从item_open_file数组中删除此CInode

     |__若le不为空

          |__mds->mdlog->submit_entry(le)                    提交LogEvent到MDLog中

|__遍历dirty_parent_inodes数组

     |__若数组中元素can_auth_pin()

          |__CInode::store_backtrace()

     |__若数组中元素不能can_auth_pin()

          |__CInode::add_waiter(CInode::WAIT_UNFREEZE)          等待unfreeze

|__遍历slave_updates数组

     |__更新MDSlaveUpdate::waiter = gather_bld.new_sub()          等待slave update

|__检查inotablev是否大于mds->inotable->get_committed_version()

     |__mds->inotable->save()                                                       保存inotable

|__检查sessionmapv是否大于mds->sessionmap.get_committed()

     |__mds->sessionmap.save()                                                       保存sessionmap

|__mds->sessionmap.save_if_dirty()                                                保存sessionmap

|__遍历pending_commit_tids数组

     |__从数组中得到MDSTableClient类对象

     |__MDSTableClient::wait_for_ack()                                        等待未应答的commit

|__遍历tablev数组

     |__从数组中得到MDSTableServer类对象

     |__若tablev数组中的version值大于MDSTableServer::get_committed_version()

          |__MDSTableServer::save()                                                  保存MDSTableServer

|__遍历truncating_inodes数组

     |__CInode::add_waiter(CInode::WAIT_TRUNC)                         等待TRUNC

|__mds->mdlog->flush()                                                                 刷新mdlog

 

© 著作权归作者所有

上一篇: EMetaBlob类分析
下一篇: LogEvent类分析
linuxhunter
粉丝 72
博文 144
码字总数 93264
作品 0
沈阳
高级程序员
私信 提问
MDLog分析

ReplayThread类:负责log的replay事件处理。 RecoveryThread类:负责log的recovery事件处理。 SubmitThread类:负责log的submit事件处理。 map<uint64_t, LogSegment*> segments; 记录log的序......

linuxhunter
2016/07/12
654
0
LogEvent类分析

LogEvent类说明:(LogEvent类是所有MDS Event类的父类) class LogEvent { EventType _type; 记录LogEvent所属的事件类型 uint64t start_off; 记录LogEvent的起始位置 utime_t stamp; 记录Log...

linuxhunter
2016/07/20
114
0
jafka里的filemessageset类的read方法的问题

@rockybean 你好,想跟你请教个问题: 看了你分析jafka源码的博客,自己在看jafka的源码时,有个问题不理解,filemessageset的read方法在被Log类的read方法调用的时候已经是文件内offset了,...

281165273
2013/10/01
191
0
Kafka代码走读-LogManager

https://github.com/haogrgr/haogrgr-test/blob/master/logs/kafka_source.txt 源码阅读(0.8.2.2): (一)概览 1.调用kafka.Kafka中的main方法启动 2.通过启动参数获取配置文件的路径 3.通过S...

德胜
2016/07/21
309
0
jafka里的filemessageset类的read方法的问题

@imxylz 你好,想跟你请教个问题: 自己在看jafka的源码时,有个问题不理解,filemessageset的read方法在被Log类的read方法 调用的时候已经是文件内offset了,为什么read方法的实现里要加上t...

281165273
2013/10/01
412
1

没有更多内容

加载失败,请刷新页面

加载更多

用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
2
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
12
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
13
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
6
0
Django的ChoiceField和MultipleChoiceField错误提示,选择一个有效的选项

在表单验证时提示错误:选择一个有效的选项 例如有这样一个表单: class ProductForm(Form): category = fields.MultipleChoiceField( widget=widgets.SelectMultiple(), ...

编程老陆
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部