MDS中MDCache中對resolve的理解

MDCache中handle_resolve()函數處理MMDSResolve類消息。對於MMDSResolve類消息中slave_requests數組不爲空則優先處理該數組,將該數組中的保存的數據寫入到uncommitted_masters數組、rejoin_slave_exports數組以及rejoin_imported_caps數組。最後建立MMDSResolveAck類消息且設置對應slave request的commit,最後將MMDSResolveAck類消息發送回給對應的MDS進程。對於MDS處於clientreplay/active/stopping狀態則經過遍歷my_ambiguous_imports數組獲得當前處於ambiguous狀態的import的目錄,以後在MMDSResolve類消息中的subtrees目錄下尋找處於ambiguous狀態的import的目錄,若找到了則執行migrator->import_finish()函數表示import目錄完畢。遍歷MMDSResolve類消息中的subtrees數組且調用try_subtree_merge()函數來嘗試merge該subtree到MDS。最後遍歷MMDSResolve類消息的ambiguous_imports數組來更新other_ambiguous_imports數組,以後調用mybe_resolve_finish()函數來確認resolve是否完畢。數組

 

MDCache中handle_resolve_ack()函數處理MMDSResolveAck類消息。首先遍歷MMDSResolveAck類消息中的commit數組,對於數組中的元素位於ambiguous_slave_updates數組中則從ambiguous_slave_updates數組中刪除對應的項。若MDS處於Resolve狀態則獲得MDSlaveUpdate類對象,以後將MDSlaveUpdate類對象寫入到mdlog中,最後刪除uncommitted_slave_update數組中對應的項。若MDS未處於Resolve狀態則獲得MDRequest類對象,最後調用request_finish()函數完成request請求。以後遍歷MMDSResolveAck類消息中的abort數組,若MDS處於Resolve狀態則執行適當的rollback操做,不然調用request_finish()函數完成request請求。函數

相關文章
相關標籤/搜索