]步驟101:CA接收用于處理監(jiān)聽器的第一消息,第一消息中攜帶監(jiān)聽的目錄/文件以及監(jiān)聽掩碼;其中,監(jiān)聽掩碼用于表示監(jiān)聽的事件類型;
[0101]步驟102:CA獲取所述監(jiān)聽的目錄/文件的標識;
[0102]步驟103:CA根據(jù)所述監(jiān)聽的目錄/文件的標識在多個NS中確定出本次處理的NS ;
[0103]步驟104:CA向確定出的所述本次處理的NS發(fā)送用于處理監(jiān)聽器的第二消息,第二消息中攜帶所述CA的標識、所述監(jiān)聽的目錄/文件的標識以及監(jiān)聽掩碼。
[0104]其中,在步驟101中,CA例如通過協(xié)議接口接收用于處理監(jiān)聽器的第一消息。如果“處理”是注冊監(jiān)聽器的話,第一消息例如為Add Notify Watch消息。如果“處理”是修改監(jiān)聽器的話,第一消息就是修改消息。
[0105]接下來執(zhí)行步驟102,即獲取監(jiān)聽的目錄/文件的標識。具體來說,CA根據(jù)緩存中的信息獲取到監(jiān)聽的目錄/文件的標識(FID)。通常,在CA的緩存中會保存目錄和文件的dentry信息和vnode信息。dentry信息主要保存其文件名等信息。vnode主要保存FID、時間等文件屬性信息,以及該文件所在的主MDS的標識信息。因此,CA通過查詢vnode信息,即可獲得FID。
[0106]接下來執(zhí)行步驟103,CA根據(jù)監(jiān)聽的目錄/文件的標識在多個NS中確定出本次處理的NS。具體來說,可以將所述標識(FID)作為關鍵詞(key),采用分布式哈希表(英文:Distributed Hash Table,簡稱:DHT)算法計算本次處理的NS的標識(ID)。或者,也可以是先將所述標識(FID)轉換為另一個唯一標識監(jiān)聽的目錄/文件的值,在本實施例中稱為通知標識(NotifyID)。然后再將NotifyID作為key,采用DHT算法計算本次處理的NS的標識。
[0107]當然,在實際運用中,也可以采用其他算法計算本次處理的NS,本申請不作限定。較佳的,所選擇的算法盡量使得每個NS所保存的監(jiān)聽器的數(shù)量均勻分布。
[0108]當確定了本次處理的NS之后,接下來執(zhí)行步驟104,即CA向確定出的本次處理的NS發(fā)送用于處理監(jiān)聽器的第二消息。其中,第二消息中需要攜帶請求處理監(jiān)聽器的CA的標識,例如CA1。第二消息還攜帶所述監(jiān)聽的目錄/文件的標識以及監(jiān)聽掩碼(mask)。其中,監(jiān)聽掩碼用于表示監(jiān)聽的事件類型。舉例來說,例如需要監(jiān)聽所述監(jiān)聽的目錄/文件的刪除事件、創(chuàng)建事件、修改事件。只有與監(jiān)聽掩碼匹配的事件發(fā)生,才會通知用戶態(tài)。而所述監(jiān)聽的目錄/文件的其它事件不需要監(jiān)聽,即不需要在發(fā)生其它事件變化時通知用戶態(tài)。
[0109]請繼續(xù)參考圖4所示,當在步驟104中,CA發(fā)送第二消息給本次處理的NS之后,本次處理的NS側的對應的處理方法包括:
[0110]步驟201:NS接收CA發(fā)送的用于處理監(jiān)聽器的所述第二消息;
[0111]步驟202:NS根據(jù)所述第二消息處理監(jiān)聽器,所述監(jiān)聽器的屬性信息包括所述CA的標識、所述監(jiān)聽的目錄/文件的標識以及所述監(jiān)聽掩碼。
[0112]對于第二消息是注冊監(jiān)聽器的情況而言,具體來說,步驟202的一種可能的實現(xiàn)方式為:NS創(chuàng)建一個新的監(jiān)聽器。在本實施例中,NS不用考慮之前是否已經注冊過所述監(jiān)聽的目錄/文件、并且與監(jiān)聽掩碼匹配的監(jiān)聽器。
[0113]步驟202的另一種可能的實現(xiàn)方式為:NS查詢是否已注冊過所述監(jiān)聽的目錄/文件、并且與監(jiān)聽掩碼匹配的監(jiān)聽器;如果否,則注冊一個新的監(jiān)聽器;如果是,則將所述CA的標識添加在已注冊的監(jiān)聽器的屬性信息中。
[0114]對于第二消息是修改監(jiān)聽器的情況而言,NS先查找到所述監(jiān)聽的目錄/文件的監(jiān)聽器,然后根據(jù)實際需要修改該監(jiān)聽器的屬性信息即可。
[0115]對于第二消息是注銷監(jiān)聽器的情況而言,NS先查找到所述監(jiān)聽的目錄/文件的監(jiān)聽器,如果該監(jiān)聽器的注冊CA有多個,那么將該監(jiān)聽器的屬性信息中的所述CA的標識刪除掉即可。如果該監(jiān)聽器的注冊CA只有所述CA,那么就將整個監(jiān)聽器刪除即可。
[0116]對于注冊監(jiān)聽器的情況而言,舉例來說,請同時參考圖3所示,假設CAl和CA2均已經在NS3上注冊了用于監(jiān)聽標識為FID3的目錄/文件的與監(jiān)聽掩碼為mask3匹配的事件類型的監(jiān)聽器3。而此時CA3也需要監(jiān)聽標識為FID3的目錄/文件的與監(jiān)聽掩碼為mask3的事件類型,所以就向NS3發(fā)送用于注冊監(jiān)聽器的第二消息,第二消息中包括CA的標識CA3、監(jiān)聽的目錄/文件的標識FID3、監(jiān)聽掩碼mask3。NS3在接收到第二消息后,根據(jù)FID3和mask3查詢是否已經注冊有監(jiān)聽器,在本實施例中,因為已經注冊用于監(jiān)聽標識為FID3的目錄/文件的與監(jiān)聽掩碼為mask3匹配的事件類型的監(jiān)聽器3,所以只要在監(jiān)聽器3的屬性信息中增加CA3即可。增加完之后,該監(jiān)聽器3的屬性信息為(FID3,mask3,CAl,CA2,CA3) ο
[0117]按照前述圖4的處理方法,假設CAl在NSl上注冊了用于監(jiān)聽標識為FIDl的目錄/文件的與監(jiān)聽掩碼maskl匹配的事件類型的監(jiān)聽器I。假設CAl在NS2上注冊了用于監(jiān)聽標識為FID2的目錄/文件的與監(jiān)聽掩碼mask2匹配的事件類型的監(jiān)聽器2。CA1、CA2和CA3均在NS3上注冊了用于監(jiān)聽標識為FID3的目錄/文件的與監(jiān)聽掩碼mask3匹配的事件類型的監(jiān)聽器3。請參考圖3所示。
[0118]需要說明的是,在實際運用中,每個NS上均可以保存多個監(jiān)聽器。
[0119]進一步,在步驟202中處理監(jiān)聽器成功之后,NS還可以向對應的CA發(fā)送處理成功的響應消息。那么對應的,CA會接收到本次處理的NS發(fā)送的所述監(jiān)聽器處理成功的響應消息。
[0120]在進一步的實施例中,CA能夠感知到NS是否故障,如果故障的話,CA需要重新向新的NS處理監(jiān)聽器。
[0121]在進一步的實施例中,請參考圖5所示,CA可以將監(jiān)聽的目錄/文件的標識和監(jiān)聽掩碼發(fā)送給MDS,具體來說,是發(fā)送給監(jiān)聽的目錄/文件的主MDS。如前所述,監(jiān)聽的目錄/文件的vnode信息中保存有該目錄/文件的主MDS的標識信息,所以CA通過查詢vnode信息,即可獲知需要將監(jiān)聽的目錄/文件的標識和監(jiān)聽掩碼發(fā)送給哪個MDS。當主MDS發(fā)生變化時,CA可以通過重定向進行全系統(tǒng)搜索,獲取到目錄/文件的主MDS。該部分為本領域技術人員所熟知的內容,所以在此不再贅述。較佳的,CA在接收到處理成功的響應消息之后,才向MDS發(fā)送監(jiān)聽的目錄/文件的標識和監(jiān)聽掩碼。
[0122]主MDS可以將目錄/文件的標識和監(jiān)聽掩碼下盤,即目錄/文件的標識和監(jiān)聽掩碼永久被保存在存儲器中。其中,永久的時間是指在該監(jiān)聽器存在期間。如圖3所示,左邊的MDS 中保存了 (FID1:maskl)和(FID2:mask2)的信息。右邊的MDS保存了 (FID3:mask3)的信息。如此一來,當主MDS因故障或者其它原因需要被其它MDS替代時,即可直接從存儲器中獲取到監(jiān)聽器的信息,而無需CA再次發(fā)送一次。另外,保存在MDS上的監(jiān)聽的目錄/文件的標識和監(jiān)聽掩碼,在事件通知時,也可能會被用到,這部分內容將在后面進行詳細描述。
[0123]在進一步的實施例中,在監(jiān)聽器處理成功之后,CA還修改監(jiān)聽的目錄/文件的vnode中的監(jiān)聽器的計數(shù)值,例如,在注冊所述監(jiān)聽器之前,所述監(jiān)聽的目錄/文件的vnode中的監(jiān)聽器的計數(shù)值為0,則表示該CA之前還未注冊過所述監(jiān)聽的目錄/文件的監(jiān)聽器,那么就將監(jiān)聽器的計數(shù)值修改為I。假設之前該CA或者其他CA已經注冊過所述監(jiān)聽的目錄/文件的監(jiān)聽器,那么監(jiān)聽器的計數(shù)值可能不為零,例如為2,那么此時只要將計數(shù)值修改為3即可。
[0124]因此,當在后續(xù)事件通知時,只要查詢某個目錄/文件的vnode中的監(jiān)聽器的計數(shù)值,即可得知該目錄/文件是否被注冊監(jiān)聽器。
[0125]進一步,在步驟104之后,較佳的,在CA接收到本次處理的NS發(fā)送的處理成功的響應消息之后,CA向鎖服務器請求獲取所述監(jiān)聽的目錄/文件的元數(shù)據(jù)的鎖,以使鎖服務器根據(jù)所述請求通知其它CA所述元數(shù)據(jù)將要發(fā)生變化,所述其它CA中所述監(jiān)聽的目錄/文件的vnode無效。CA接收鎖服務器返回的拿鎖成功的消息。
[0126]具體來說,請再參考圖5所示,所述CA向鎖服務器發(fā)送獲取所述監(jiān)聽的目錄/文件的元數(shù)據(jù)的鎖的請求。鎖服務器在接收到該請求之后,向所有其它CA發(fā)送廣播消息,以通知所述監(jiān)聽的目錄/文件的元數(shù)據(jù)將要發(fā)生變化。而其它CA在接收到廣播消息之后,檢查所述監(jiān)聽的目錄/文件的vnode是否存在,如果存在的話,就設置該vnode無效。如果不存在,或者是在設置該vnode無效之后,還向鎖服務器返回響應消息。
[0127]當鎖服務器接收到所有其它CA的響應消息之后,則向所述CA返回拿鎖成成的消息。
[0128]進一步,所述CA在接收到拿鎖成功的消息之后,向MDS發(fā)送監(jiān)聽的目錄/文件的標識和監(jiān)聽掩碼。然后待收到MDS保存完成的情況下,向鎖服務器請求釋放鎖,以便于下一個CA能夠對所述監(jiān)聽的目錄/文件的元數(shù)據(jù)進行操作。然后接收鎖服務器返回的釋放成功消息。
[0129]可選的,所述CA向鎖服務器請求鎖的步驟和向MDS發(fā)送需要監(jiān)聽的目錄/文件的標識和監(jiān)聽掩碼的步驟可以同時進行,也可以先后進行。在先后進行時,不特別限定先后順序。
[0130]然后所述CA可以調用協(xié)議接口,向用戶態(tài)返回監(jiān)聽器處理成功的響應消息。
[0131]接下來描述當發(fā)生事件變化時,如何進行事件通知。請參考圖6所示,為本申請實施例提供的一種事件通知方法的流程圖。該方法包括:
[0132]步驟301:當CA進行使得目錄/文件發(fā)生變化的操作時,確定所述目錄/文件的全路徑上的各級目錄的vnode是有效的;
[0133]步驟302:CA完成所述操作后,確定所述各級目錄的vnode中監(jiān)聽器計數(shù)不為零的vnode所對應的第一目錄;
[0134]步驟303:CA根據(jù)第一目錄的標識在多個NS中確定出第一目錄的監(jiān)聽器所注冊的NS ;
[0135]步驟304: CA向所述所注冊的NS發(fā)送事件通知,其中,所述事件通知中攜帶第一目錄的標識、監(jiān)聽掩碼以及與所述操作對應的事件內容。事件內容例如:創(chuàng)建新文件/Dirl/Dir2/Dir4/Dir6/ 文件 8。
[0136]其中,在步驟301中,CA確定所述目錄/文件的全路徑上的各級目錄的vnode是有效的,包括:當所述各級目錄中的目錄存在vnode時,查看所述vnode的標記信息;當所述標記信息表示所述vnode有效時,確定所述vnode是有效的;當所述標記信息表示所述vnode無效時,所述CA向元數(shù)據(jù)服務器MDS獲取所述無效的vnode所對應的目錄的監(jiān)聽器