Garbage Collection

Nameserver和Chunkserver都使用垃圾收集来避免不必要的资源占用。

Nameserver

block副本回收

如果一个block的副本数超过了用户指定的副本数,nameserver需要发现,并通知chunkserver删除这个block的某个副本。
这里有多种选择:
1. 在收到chunkserver的block_report时,检查对应的block,副本数是否超出预期,如果超出,那么通知chunkserver删除。
2. 在用户减少文件副本数时,发起block副本删除。
3. 定期扫描所有block,对于超出预期副本数的block,发起副本删除。

第2种方式的代价应该是最小的,而且还可以优化为,当副本回收时,仅将副本回收指令记录在chunkserver信息里,当收到chunkserver心跳时,返回这些需要回收的副本列表。
同时辅以在block_report时,检查report的副本的合法性,不合法的发起删除。

垃圾block的回收

如果一个文件被删除了,那么它所包含的block都将成为垃圾block,nameserver需要发现,并通知所有包含这个block的chunkserver删除。
这个可以使用与副本回收相同的解决方案。

Chunkserver

  1. 如果磁盘上的某个block不是合法的block(meta中没有或者与meta不一致),chunkserver应该清理这个block
    chunkserver的垃圾收集可以使用单独的后台线程,定期全局扫描数据存储目录的方式实现。