在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刷新到压缩文件中。代码如下: