这篇文章给大家分享的是有关Mutation相关类有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
MutationImpl类说明:
struct MutationImpl {
metareqid_t reqid;
__u32 attempt;
LogSegment *ls; 提交的log片段
utime_t mds_stamp; mds本地时间戳
utime_t op_stamp; 客户端提供的时间戳
mds_rank_t slave_to_mds; 若slave_to_mds>0则说明此Mutation是slave发起的
set<MDSCacheOjbect *> pins; mds cache pins
set<CInode*> stickydirs;
map<MDSCacheObject*, mds_rank_t> remote_auth_pins; 远端的auth pins
set<MDSCacheObject*> auth_pins; 本地的auth pins
list<CInode*> projected_inodes;
list<CDir*> projected_fnodes;
list<ScatterLock*> updated_locks;
list<CInode*> dirty_cow_inodes;
list<pair<CDentry*, version_t>> dirty_cow_dentries;
};
MutationImpl类方法:
MutationImpl::get_client()
|__若reqid.name.is_client()不为空
|__说明请求是从client发出的,返回client信息,即:client_t(reqid.name.num())
|__返回-1
MutationImpl::apply()
|__遍历并清空projected_inodes数组且每个数组成员执行pop_and_dirty_projected_inode(ls)函数
|__遍历并清空projected_fnodes数组且每个数组成员执行pop_and_dirty_projected_fnode(ls)函数
|__遍历dirty_cow_inodes数组
|__数组中每个成员执行_mark_dirty(ls)
|__遍历dirty_cow_dentries数组
|__数组中每个成员执行_mark_dirty(ls)
|__遍历updated_locks数组
|__数组中每个成员执行mark_dirty()
MutationImpl::cleanup()
|__遍历auth_pins数组
|__数组中每个成员执行auth_unpin()
|__清空auth_pins数组
|__遍历pins数组
|__数组中每个成员执行put()
|__清空pins数组
MDRequestImpl主要记录来自client的请求、slave的请求以及内部的操作internal_op。
struct MDRequestImpl: public MutationImpl, public TrackedOp {
Session *session; 记录session信息
elist<MDRequestImpl*>::item item_session_request; 请求项
MClientRequest *client_request; 客户端请求
vector<CDentry*> dn[2]; 保存两套dentry
CInode *in[2]; 保存两套inode
CDentry *straydn; 记录stray的dentry
snapid_t snapid; 记录snap ID信息
indoeno_t alloc_ino, used_prealloc_ino; 分配的inode号
interval_set<inodeno_t> prealloc_inos; 预分配的inode号
int snap_caps; snap capability
int getattr_caps; 执行getattr的权限
bool did_early_reply;
bool o_trunc; 请求是一个O_TRUNC事件
bool has_completed; 请求已经完成
bufferlist reply_extra_bl; 在回复中包含的额外的内容
map<vinodeno_t, ceph_seq_t> cap_releases;
MMDSSlaveRequest *slave_request; slave的请求
int internal_op; 内部操作
Context *internal_op_finish; 内部操作的回调函数
void *internal_op_private; 内部操作的私有对象
int retry; 记录rety的次数
bool waited_for_osdmap; 是否需要等待更新的osmap
struct More {
int slave_error;
set<mds_rank_t> slaves; 发起slave请求的集合
set<mds_rank_t> waiting_on_slave; 等待slavereq reply的peer
set<mds_rank_t> witnessed;
CInode *rename_inode; 保存freeze的inode信息
bool is_freeze_authpin; 保存是否执行了freeze authpin操作
bool is_remote_frozen_authpin; 保存是否执行了remote frozen authpin操作
bool is_ambiguous_auth; 保存是否执行了ambiguous auth操作
}_more;
};
MDRequestImpl类方法:
MDRequestImpl::~MDRequestImpl()
|__若client_request不为空
|__执行client_request->put()方法,尝试释放client_request
|__若slave_request不为空
|__执行slave_request->put()方法,尝试释放slave_request
|__删除_more类对象
MDRequestImpl::freeze_auth_pin(inode)
|__设置_more中的rename_inode为inode
|__设置_more中的is_freeze_authpin为true
|__调用auth_pin(inode)
|__执行inode的freeze_auth_pin()
MDRequestImpl::unfreeze_auth_pin(clear_inode)
|__从_more中的rename_inode得到freeze的inode
|__若inode当前是is_frozen_auth_pin()
|__执行inode的unfreeze_auth_pin()来解除freeze
|__若inode当前不是is_frozen_auth_pin()
|__执行inode的unfreeze_inode()
|__设置_more中的is_freeze_autpin为false
|__若clear_inode==true
|__设置_more中的rename_inode为null
MDRequestImpl::set_remote_frozen_auth_pin(inode)
|__设置_more中的rename_inode为inode
|__设置_more中的is_remote_frozen_authpin为true
MDRequestImpl::set_ambiguous_auth(inode)
|__执行inode的set_ambiguous_auth()函数
|__设置_more中的rename_inode为inode
|__设置_more中的is_ambiguous_auth为true
MDRequestImpl::clear_ambiguous_auth()
|__从_more中的rename_inode得到ambiguous的inode
|__执行inode的clear_ambiguous_auth()函数
|__设置_more中的is_ambiguous_auth为false
MDRequestImpl::can_auth_pin(object)
|__若object能auth pin或者object在auth_pin或remote auth pin中或者_more中的is_freeze_authpin为true或者_more中的rename_inode==object
|__返回true
|__返回false
MDRequestImpl::drop_local_auth_pins()
|__若_more不为空
|__调用unfreeze_auth_pin(true)来清除freeze的auth pin
|__调用MutationImpl::drop_local_auth_pins() 来清除本地的auth pins
MDRequestImpl::set_filepath(fp)
|__设置_more中的filepath2为fp
MDRequestImpl::set_filepath3(fp)
|__设置_more中的filepath3为fp
MDRequestImpl::get_filepath()
|__若client_request不为空
|__返回client_request->get_filepath()
|__返回_more中的filepath2
MDRequestImpl::get_filepath3()
|__若client_request不为空
|__返回client_request->get_filepath3()
|__返回_more中的filepath3
感谢各位的阅读!关于“Mutation相关类有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/linuxhunter/blog/717550