溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

StrayManager類怎么用

發(fā)布時間:2021-12-18 16:53:43 來源:億速云 閱讀:170 作者:小新 欄目:云計算

這篇文章主要為大家展示了“StrayManager類怎么用”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“StrayManager類怎么用”這篇文章吧。

StrayManager類說明:

class StrayManager {
   elist<CDentry*> delayed_eval_stray;
   list<QueuedStray> ready_for_purge;
   MDSRank *mds;
   uint64_t ops_in_flight;
   uint64_t files_purging;
   uint64_t max_purge_ops;
   uint64_t num_strays;
   uint64_t num_strays_purging;
   uint64_t num_strays_delayed;
   Filer    filer;
 };

StrayManager類方法:
StrayManager::purge(dn, op_allowance)        實際上就是從集群中刪除指定dentry對應(yīng)的inode信息
|__從dn得到CDentry對應(yīng)的CInode類對象in
|__增加num_strays_purging的值
|__若in是目錄
  |__根據(jù)mds所在的metadata_pool信息,得到in對象所在的pool位置
  |__若in目錄在dirfragtree上不是葉子節(jié)點
    |__得到in目錄在dirfragtree上的所有葉子節(jié)點
    |__遍歷所有葉子節(jié)點
      |__得到葉子節(jié)點的oid信息,即:CInode::get_object_name(in->inode.ino, *p, "");
      |__從pool里刪除該葉子節(jié)點,即:mds->objecter->remove(oid, oloc,...)
  |__直接返回
|__從in中得到所有的SnapRealm信息
|__SnapRealm有效
  |__得到SnapRealm的上下文信息,即:snapc = &realm->get_snap_context()
|__SnapRealm無效
  |__設(shè)置snapc為nullsnapc
|__得到in的projected inode信息
|__得到projected_inode的oid,即:oid = CInode::get_object_name(pi->ino, frag_t(), "")
|__刪除backtrace對象,即:mds->objecter->remove(oid, oloc,...)
|__遍歷old backtrace對象集合,即:pi->old_pools
  |__刪除backtrace對象,即:mds->objecter->remove(oid, oloc,...)

StrayManager::_purge_stray_purged(dn, ops_allowance, only_head)
|__從dn得到CDentry對應(yīng)的CInode類對象in
|__若only_head==true
  |__創(chuàng)建EUpdate類對象
  |__設(shè)置mds的mdlog的start_entry為EUpdate類對象,即:mds->mdlog->start_entry(le)
  |__得到in的project_inode信息
  |__初始化project_inode信息
  |__設(shè)置LogEvent類對象(le)中metablob的dir_context,即:le->metablob.add_dir_context()
  |__向LogEvent類對象(le)中medtablob中添加primary dentry,即:le->metablob.add_primary_dentry()
  |__向MDLog提交entry,即:mds->mdlog->submit_entry()
|__若only_head==false
  |__創(chuàng)建EUpdate類對象
  |__設(shè)置mds的mdlog的start_entry為EUpdate類對象,即:mds->mdlog->start_entry(le)
  |__設(shè)置LogEvent類對象(le)中metablob的dir_context,即:le->metablob.add_dir_context()
  |__在LogEvent的metablob中添加一個dir,即:le->metablob.add_dir()
  |__在LogEvent的metablob中添加一個空的dentry,即:le->metablob.add_null_dentry()
  |__在LogEvent的metablob中添加一個destroyed inode,即:le->metablob.add_destroyed_inode()
  |__向MDLog提交entry,即:mds->mdlog->submit_entry()
|__遞減num_strays_purging
|__從ops_in_flight中減去ops_allowance
|__調(diào)用_advance()

StrayManager::_advance()
|__遍歷ready_for_purge集合(QueuedStray集合)
  |__調(diào)用_consume()
  |__若_consume()返回true
    |__停止遍歷
|__刪除ready_for_purge集合中從開始到_consume()返回true的節(jié)點

StrayManager::_consume(dn, trunc, ops_required)
|__從配置文件中獲取到目前可以purge的文件數(shù)量,即:g_conf->mds_max_purge_files-files_purging;
|__若files_avail<=0
  |__直接返回
|__若ops_in_flight<=max_purge_pos
  |__ops_avail = max_purge_ops - ops_in_flight
|__若ops_in_flight>max_purge_pos
  |__ops_avail = 0
|__若ops_in_flight>0并且ops_avail<ops_required
  |__直接退出并返回false
|__增加ops_in_flight數(shù)值,即:ops_in_flight += ops_required
|__若trunc==true
  |__truncate(dn, ops_required)
|__若trunc==false
  |__purge(dn, ops_required)
|__返回true

StrayManager::_purge_stray_logged(dn, pdv, ls)
|__從dn得到CDentry對應(yīng)的CInode類對象in
|__從dn所在的dir目錄下刪除該dn,即:dn->dir->unlink_inode(dn)
|__從dn所在的dir目錄下刪除projected fnode,即:dn->dir->pop_and_dirty_projected_fnode(ls)
|__從MDCache中刪除in,即:in->mdcache->remove_inode(in)
|__若dn是new
  |__從dn所在的dir目錄下刪除該dn,即:dn->dir->remove_dentry(dn)
|__若dn不是new
  |__在MDCache中將dn設(shè)置到dentry的bottom,即:in->mdcache->touch_dentry_bottom(dn)

  
StrayManager::_calculate_ops_required(in, trunc)
|__若in是目錄
  |__ops_reqired數(shù)量=1+in在dirfragtree下的葉子節(jié)點個數(shù)
|__若in不是目錄
  |__ops_reqired數(shù)量=1+g_conf->filer_max_purge_ops

StrayManager::enqueue(dn, trunc)
|__從dn得到CDentry對應(yīng)的CInode類對象in
|__設(shè)置dn的狀態(tài)為STATE_PURGING
|__設(shè)置in的狀態(tài)為STATE_PURGING
|__根據(jù)in和trunc計算一下所需的ops數(shù),即:_calculate_ops_required(in, trunc)
|__若ready_for_purge數(shù)組不為空
  |__調(diào)用_consume(dn, trunc, ops_required)
|__若_consume()返回false
  |__將dn重新插入到ready_for_purge數(shù)組,即:ready_for_purge.push_back()

StrayManager::advance_delayed()
|__遍歷delayed_eval_stray數(shù)組
  |__從dn的item_stray數(shù)組中刪除自己,即:dn->item_stray.remove_myself()
  |__遞減num_strays_delayed

StrayManager::_eval_stray(dn, delay)    檢查dn及其對應(yīng)的CInode是否滿足stray的條件,若滿足則返回true,否則返回false
|__從dn得到CDentry對應(yīng)的CInode類對象in
|__若dn不是auth的
  |__在MDCache中將dn設(shè)置到dentry的bottom,之后會立即被trim掉。即:in->mdcache->touch_dentry_bottom(dn)
  |__返回false
|__若dn在item_stray數(shù)組中
  |__從item_stray數(shù)組中刪除自己,即:dn->item_stray.remove_myself()
  |__遞減num_strays_delayed
|__若in的inode link為0
  |__若in中包含有snaprealm
    |__若in的snaprealm沒有past_parents_open并且沒有open parents
      |__返回false
    |__從in的snaprealm中刪除past parents,即:in->snaprealm->prune_past_parents()
    |__從in中刪除stale snap data,即:in->purge_stale_snap_data()
  |__若in是目錄
    |__若in中包含有snaprealm且in的snamrealm中包含past parents
      |__返回false
    |__若in中包含dirfrags
      |__得到該in下所有的dirfrags
      |__遍歷所有的dirfrags
    |__刪除所有的dirfrags,即:(*p)->try_remove_dentries_for_stray()
    |__若in的remote parents不為空,說明in仍然有遠(yuǎn)程鏈接
      |__遍歷in的remote parents數(shù)組
    |__刪除遠(yuǎn)程鏈接,即:remote_dn->unlink_remote(remote_dn->get_linkage())
  |__若dn是replicted,即:dn的replica_map不為空
    |__返回false
  |__若dn仍然有any leases或仍然有any caps
    |__返回false
  |__若dn的當(dāng)前狀態(tài)是STATE_NEEDSRECOVER或STATE_RECOVERING
    |__返回false
  |__若in的引用計數(shù)>in的dirty數(shù)量+1
    |__返回false
  |__若delay==true
    |__若dn不在item_stray數(shù)組中
      |__將dn->item_stray數(shù)組插入到delayed_eval_stray數(shù)組中,即:delayed_eval_stray.push_back(dn->item_stray)
  |__若delay==false并且in擁有snaprealm并且in的snaprealm包含past parents并且in的old_inodes不為空
    |__若in是文件并且in的projected inode的大小大于0
      |__enqueue(dn, true)
  |__其他條件 
    |__若in是目錄
      |__關(guān)閉in的所有dirfrags,即:in->close_dirfrags()
    |__enqueue(dn, false)
  |__返回true
|__若in的inode link不為0
  |__調(diào)用eval_remote_stray(dn, NULL)
  |__返回false

StrayManager::eval_stray(dn, delay)
|____eval_stray(dn, delay)
-
StrayManager::eval_remote_stray(stray_dn, remote_dn)    當(dāng)待評估的dn的nlink大于0,則需要評估遠(yuǎn)程的dn是否是stray
|__從dn得到CDentry對應(yīng)的CInode類對象in
|__若remote_dn為空
  |__若stray_in的remote_parents不為空
    |__遍歷stray_in的remote_parents數(shù)組
      |__若數(shù)組中成員的last==CEPH_NOSNAP
    |__將數(shù)組中成員賦值給remote_dn
      |__若remote_dn為空,即:沒有在stray_in的remote parents數(shù)組中找到last==CEPH_NOSNAP的
    |__直接返回 
|__若remote_dn不是projected
  |__若remote_dn是auth的并且remote_dn對應(yīng)的CDir能auth pin 
    |__reintegrate_stray(stray_dn, remote_dn)
  |__否則,若remote_dn不是auth并且stray_dn是auth的
    |__migrate_stray(stray_dn, remote_dn->authority().first)

StrayManager::reintegrate_stray(straydn, rdn)
|__得到straydn的完整路徑,即:straydn->make_path(src)
|__得到remotedn的完整路徑,即:rdn->make_path(dst)
|__創(chuàng)建MClientRequest類消息且消息類型是CEPH_MDS_OP_RENAME
|__設(shè)置源和目的filepath
|__設(shè)置tid
|__將消息發(fā)送給rdn授權(quán)的第一個MDS進程,即:mds->send_message_mds(req, rdn->authority().first)

StrayManager::migrate_stray(dn, to)
|__從dn得到CDentry對應(yīng)的CInode類對象in
|__得到dn對應(yīng)的dir的CInode類對象diri
|__得到dn的完整路徑,即:dn->make_path(src)
|__得到in的stray dentry名字,即:in->name_stray_dentry(dname)
|__創(chuàng)建MClientRequest類消息且消息類型是CEPH_MDS_OP_RENAME
|__設(shè)置源和目的filepath
|__設(shè)置tid
|__將消息發(fā)送給to這個MDS進程,即:mds->send_message_mds(req, to)

StrayManager::abort_queue()
|__遍歷ready_for_purge集合
  |__從集合成員QueuedStray中得到CDentry
  |__從Cdentry得到CInode
  |__清除dn的STATE_PURGING狀態(tài),即:dn->state_clear(STATE_PURGING)
  |__清除in的STATE_PURGING狀態(tài),即:in->state_clear(STATE_PURGING)
|__清空ready_for_purge集合

StrayManager::truncate(dn, op_allowance)
|__從dn得到CDentry對應(yīng)的CInode類對象in
|__從in中得到snaprealm信息
|__從snaprealm中得到SnapContext信息
|__得到in->inode.size和in->inode.get_max_size()以及in->inode.max_size_ever的最大值
|__若該最大值大于0
  |__從Striper得到該inode的條帶個數(shù),即:Striper::get_num_objects(in->inode.layout, to)
  |__若條帶個數(shù)大于1
    |__通過filer purge指定數(shù)量的條帶,即:filer.purge_range()
  |__通過filer清空指定inode,即:filer.zero()
  
StrayManager::_truncate_stray_logged(dn, ls)
|__從dn得到CDentry對應(yīng)的CInode類對象in
|__清除dn的STATE_PURGING狀態(tài),即:dn->state_clear(STATE_PURGING)
|__從in中dirty projected inode,即:in->pop_and_dirty_projected_inode(ls)
|__eval_stray(dn)

StrayManager::update_op_limit()
|__從mds的objecter里得到當(dāng)前的osdmap
|__從mdspmap中得到所有的data pool
|__遍歷data pool
  |__累加所有data pool的pg數(shù)量
|__從mdsmap中得到當(dāng)前可用的最大mds數(shù)量
|__計算可用于purge的操作個數(shù),即:n_pgs/n_mdss*g_conf->mds_max_purge_ops_per_pg
|__若配置文件中包含mds_max_purge_ops
  |__將max_purge_ops和配置文件中的mds_max_purge_ops的最小值賦值給max_purge_ops
 

以上是“StrayManager類怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI