1掐场、本文討論的鎖不是flock翻斟。flock是posix標(biāo)準(zhǔn)中對(duì)文件某部分偏移加的鎖匿垄。而這里的鎖指的是MDS集中管理多客戶端對(duì)于文件并發(fā)訪問時(shí)嚣州,Dentry和Inode等數(shù)據(jù)結(jié)構(gòu)控制的鎖。每個(gè)鎖內(nèi)有parent變量記錄的就是該鎖相關(guān)的Dentry或者Inode硝拧。Cephfs采用和GPFS類似的并發(fā)更新元文件的方式。同一份元數(shù)據(jù)分散多個(gè)MDS節(jié)點(diǎn)葛假,但是有一個(gè)Auth節(jié)點(diǎn)障陶,該節(jié)點(diǎn)負(fù)責(zé)
- 串行更新(serializing updates)
- 將元數(shù)據(jù)持久化到磁盤上(committing changes to disks)
- 保證緩存一致性(consistency)
- 維護(hù)節(jié)點(diǎn)之間的一致性(cache coherence)
多路并發(fā)的MDS節(jié)點(diǎn)會(huì)更新每個(gè)副本,但是會(huì)周期性地向AUTH發(fā)送當(dāng)前節(jié)點(diǎn)最新的數(shù)據(jù)聊训。
2抱究、鎖的類型分為L(zhǎng)ocalLock、SimpleLock带斑、ScatterLock鼓寺、FileLock
無論何種類型的鎖,都有一個(gè)state變量記錄當(dāng)前鎖的狀態(tài)勋磕。每個(gè)鎖都有相關(guān)的狀態(tài)機(jī)控制狀態(tài)轉(zhuǎn)移妈候。根據(jù)狀態(tài)機(jī)可以確定:
- 下一步鎖的狀態(tài)(next_state)
- 其他副本(Object比如Inode在多mds的其他mds也有副本叫replica)的狀態(tài)
- 允許誰(shuí)可讀(can_read)、誰(shuí)可加讀鎖(can_rdlock)挂滓、誰(shuí)可加寫(can_wrlock)苦银、誰(shuí)可以加排他鎖(can_xlock)等。這里的誰(shuí)被抽象成為ANY赶站、AUTH幔虏、XCL等。ANY指的任何擁有Object副本的MDS贝椿,AUTH(authority)指的是被授權(quán)Object的MDS想括,XCL指的是被授權(quán)Object的MDS或者排他執(zhí)行的客戶端。
- 對(duì)應(yīng)的caps是什么烙博,包括擁有Object副本的MDS的此時(shí)應(yīng)該使用的caps(針對(duì)不同的角色也分為4種)
復(fù)雜程度而言瑟蜈,可以根據(jù)sm_state_t結(jié)構(gòu)體里面定義的條數(shù)判斷,LocalLock最簡(jiǎn)單习勤,SimpleLock/ScatterLock相對(duì)復(fù)雜踪栋,F(xiàn)ileLock最為復(fù)雜。
3图毕、鎖的狀態(tài)有很多夷都,都是以LOCK_開頭的(除了LOCK_AC_*之外,它代表鎖的某種行為)。一般而言囤官,LOCK_<狀態(tài)>都是穩(wěn)定狀態(tài)(標(biāo)準(zhǔn)是在狀態(tài)機(jī)其next_state為0冬阳,也有例外),比如LOCK_SYNC/LOCK_LOCK/LOCK_MIX等党饮。LOCK_<狀態(tài)1>_< 狀態(tài)2>是中間狀態(tài)肝陪,比如LOCK_SYNC_LOCK就是從LOCK_SYNC狀態(tài)向LOCK_LOCK狀態(tài)轉(zhuǎn)移的中間狀態(tài),日志中可以看到“sync->lock”就是這種狀態(tài)dump出來信息刑顺。
4氯窍、每個(gè)Inode里面有多個(gè)Lock,每個(gè)Lock對(duì)應(yīng)2中介紹的4種類型的鎖蹲堂。每種鎖關(guān)聯(lián)的是不同的文件系統(tǒng)資源狼讨。
LocalLock? -??versionlock
SimpleLock用在nlink、atime柒竞、mtime等屬性的處理上政供。其特點(diǎn)是"共享讀、互斥寫"朽基。
SimpleLock? -?authlock??linklock??xattrlock(擴(kuò)展屬性相關(guān))??snaplock(快照相關(guān))????flocklockpolicylock(layout相關(guān))??
ScatterLock用在需要處理迭代的數(shù)據(jù)結(jié)構(gòu)布隔,比如目錄樹或者目錄下面的統(tǒng)計(jì)信息,其特點(diǎn)是“共享讀稼虎、共享寫”
ScatterLock -??dirfragtreelock?nestlock?
FileLock既用在處理atime衅檀、ctime等需要互斥操作的屬性上,也有需要共享寫的統(tǒng)計(jì)信息上渡蜻。
FileLock - filelock
5术吝、Cap當(dāng)中的s代表share,意味著客戶端擁有讀相關(guān)信息的能力茸苇,比如刪除inodes時(shí)mds會(huì)設(shè)置CEPH_CAP_LINK_SHARED排苍,即Cap為L(zhǎng)s,客戶端讀到該標(biāo)志位学密,會(huì)判斷inode的nlink信息是否為0淘衙,0則代表刪除客戶端執(zhí)行針對(duì)刪除的操作。x代表允許客戶端更新相關(guān)信息的能力(獨(dú)占執(zhí)行的能力)腻暮。
6彤守、Cap和鎖的關(guān)系
客戶端是根據(jù)MDS賦予的cap確定相關(guān)行為。MDS則根據(jù)客戶端發(fā)來的請(qǐng)求和當(dāng)前鎖的狀態(tài)哭靖,確定授予(grant)或者剝奪(revoke)客戶端的caps具垫。
7、打算對(duì)一個(gè)inode或者dentry加鎖试幽,需要先確定給其中的哪些鎖加什么類型的操作筝蚕。一般有rdlock、wrlock、remote_wrlock起宽、xlock等洲胖。
rdlock? 讀鎖操作,當(dāng)一個(gè)資源加了讀鎖之后坯沪,不能再加獨(dú)占鎖對(duì)其修改绿映。
wrlock? 寫鎖操作
remote_wrlock? 遠(yuǎn)端寫鎖操作
xlock? 獨(dú)占鎖操作,比如修改某項(xiàng)資源腐晾,一定要讓鎖執(zhí)行該操作叉弦。
使用場(chǎng)景比如,
在創(chuàng)建快照的時(shí)候需要給執(zhí)行目錄的inode的snap鎖加上獨(dú)占操作藻糖。
xlocks.insert(&diri->snaplock));
ls的時(shí)候會(huì)對(duì)父目錄至根目錄的dentry都加rdlock防止被修改卸奉。
rdlock.insert(&dn->lock)
日志里面“isnap sync r=<NUM>”之類的輸出代表當(dāng)前snap鎖處在sync狀態(tài),鎖上有NUM個(gè)讀鎖操作(見SimpleLock.h SimpleLock::_print())颖御。
8、Locker中*_start 表示對(duì)某個(gè)鎖執(zhí)行某種類型的鎖操作凝颇。*_finish表示結(jié)束對(duì)某個(gè)鎖加某種類型的鎖操作潘拱。*_try代表嘗試去執(zhí)行某種類型的鎖操作是否能夠成功。這里的*代表rdlock拧略、wrlock芦岂、remote_wrlock蔓榄、xlock等忘朝。
9、Locker中有操作狀態(tài)的轉(zhuǎn)變函數(shù)毛嫉,將任何中間狀態(tài)變?yōu)?_sync同步狀態(tài)袱饭,*_excl 獨(dú)占執(zhí)行狀態(tài)川无、*_lock鎖狀態(tài)、*_xlock獨(dú)占鎖狀態(tài)虑乖。*可以是simple/scatter/file代表不同的鎖類型懦趋。比如Locker::file_xsyn函數(shù)會(huì)讓filelock進(jìn)入xsyn狀態(tài),XSYN狀態(tài)出現(xiàn)在如下場(chǎng)景中:
如果一個(gè)客戶端在執(zhí)行l(wèi)s –al的時(shí)候想要rdlock疹味。此時(shí)如果一個(gè)EXCL的客戶端正在緩存寫仅叫,那么MDS會(huì)讓鎖進(jìn)入XSYN狀態(tài),進(jìn)入這個(gè)狀態(tài)寫會(huì)被停止糙捺,但是緩存不會(huì)刷到磁盤(提升效率)诫咱。??
10、MDS和其他MDS處理鎖相互發(fā)的是MLock請(qǐng)求洪灯。執(zhí)行發(fā)送的函數(shù)是Locker::send_lock_message坎缭。內(nèi)容是鎖和相關(guān)的轉(zhuǎn)換操作(LOCK_AC_*定義的行為)。
由auth的MDS發(fā)給replica的MDS有如下所示。replica的MDS收到之后會(huì)將其本地保留的鎖狀態(tài)幻锁,盡可能轉(zhuǎn)換為消息中定義的鎖狀態(tài)凯亮。
LOCK_AC_SYNC? ? ? //向SYNC狀態(tài)轉(zhuǎn)換
LOCK_AC_MIX? ? ? ? ? //向MIX狀態(tài)轉(zhuǎn)換
LOCK_AC_LOCK? ? ??//向LOCK狀態(tài)轉(zhuǎn)換
LOCK_AC_LOCKFLUSHED? ? ??//向LOCKFLUSHED狀態(tài)轉(zhuǎn)換