结论:
不存在问题。
DirectoryScanner周期性地运行,扫描整个DN磁盘上的块与内存里的块做比较。
删除那些内存里没有的但是在磁盘上存在的块, 处理重复块等等。
最近在更细粒度化DN锁。在看到ReplicaMap#replicas方法时,阅读相关代码。
发现DirectoryScanner#scan 与append操作在并发场景下的一致性问题,需要仔细思考一下。
DirectoryScanner#scan没有fs dataset锁。
append操作是volume级别写锁。
考虑下面的情况:
1、DirectoryScanner线程执行scan操作,然后执行完了下面这行代码,获取了所有的FINALIZED状态的副本信息。
final List<ReplicaInfo> bl = dataset.getFinalizedBlocks(bpid)