Glusterfs下讀寫請求的處理流程
Glusterfs基於核心的fuse模組,fuse模組除了建立fuse檔案系統外,還提供了一個字元裝置(/dev/fuse),通過這個字元裝置,Glusterfs可以讀取請求,併發送響應,並且可以傳送notify訊息。
下面是在Glusterfs下的一個讀/寫請求的完整流程:
藍實線表示一個請求通過系統呼叫到VFS,然後經由Fuse封裝為一個req併發送到等待佇列,然後喚醒在該等待佇列上阻塞的Glusterfs讀程序,讀取請求
綠虛線表示Glusterfsd程序讀取請求後,處理請求的過程
紅虛線表示Glusterfs處理完請求後,封裝響應訊息並將訊息傳送到/dev/fuse下,並喚醒相應的請求程序(請求程序在將請求傳送後,一直阻塞,直到該請求收到響應並處理完成)。
請求程序被喚醒後,將Glusterfs封裝的響應資訊返回給使用者。
為方便說明問題,下圖是一個讀請求走到Fuse的完整流程:
下面是上面這些步驟的說明:
①read系統呼叫,陷入到核心 ②vfs通過fd及當前程序維護的開啟的檔案表找到fd對應的file,然後呼叫該file被賦值的read函式進行讀操作 ③因為該file是基於fuse檔案系統建立的,因此呼叫fuse的read函式do_sync_read ④-1.最終呼叫do_generic_file_read基於讀操作的偏移量及該檔案的快取樹查詢該對應的快取頁,該快取頁存在且是最新的,直接從該快取中讀資料給使用者 ④-2.如果該快取頁不存在,則申請一個頁作為快取。並呼叫readpage去讀資料。fuse的readpage會封裝一個請求到字元裝置的等待佇列中。收到glusterfs的響應後會將響應寫到快取中並返回