seaweedfs代碼詳解


     在seaweedfs分布式文件系統中,刪除文件時,deleteNeedle會做三件事情,如下圖

   

      第一個刪除kv數據庫中的索引信息,第二件是,在索引文件的尾部添加刪除的信息,對索引文件中原來存儲的信息,並不刪除。第三件是刪除datafile文件中的數據 ,但是並沒有真正的刪除數據,在datafile文件尾部,寫了一個包含needle head的數據,但是並不包含needel中的數據,needlehead包括分配的needleid,以及needle的cookie和校驗數據。seaweedfs在向文件尾部寫數據時,寫的數據大小保持八字節對其,如果不夠,會補齊。我理解是為了提高cpu的讀取效率。總而言之,在刪除文件時,會在索引文件尾部添加如下needle信息,needle的size修改為uint32的最大值,offset為當前datafile中的到文件尾的偏移。datafile文件會寫一個needle的頭部。在寫文件的時候,仍然會如此。

   seaweedfls中會每15分鍾向master發送/admin/vacuum/check請求,代碼如下:

  

  如果超過垃圾門限值,則leader會向master發送/admin/vacuum/compact消息,master收到消息后,開始壓縮volume

 

  在volume的Compact函數中,執行壓縮流程,壓縮時從datafile中讀取needlehead,如果讀取的needlehead不在volume的needlemap中,則認為文件已經刪除,不會向新的文件中添加:

 

   在compact壓縮有,leader向master發送/admin/vacuum/commit,master收到后,把compact過程中生成的datafile和idx的壓縮文件更改為datafile和idx文件名。最后完成壓縮。在更改名字之前,會檢查當前數據文件是否有更新,如果有,則把更新的needle刷新到壓縮文件中。代碼如下:

    

 

 

 

 

   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM