● BlockInfoManager:管理block的元数据,同时也提供了block加锁的功能。
BlockInfo
记录block信息的类。
level:记录block的存储方式
tellMaster:是否向master汇报
size:block大小
readerCount:记录当前有多少个同时读block的任务,一个block可以有多个任务同时读取。
writerTask:记录当前写入block的任务id,一个block同时只能有一个任务写入。
BlockInfoManager
变量
lockForReading
加读锁。block只能是零个写锁零个读锁、一个写锁零个读锁、零个写锁多个读锁。
- 从infos中获取blockInfo
- 没有获取到,就是block不存在,返回None
- 获取到blockInfo后判断是否有写锁
- 没有写锁,更新写锁相关信息,返回blockInfo
- 有写锁,判断是否阻塞,不阻塞直接返回None,阻塞的话就等待写锁释放唤醒重新申请读锁
lockForWriting
跟加读锁过程类似。
unlock
释放block上的锁。
获取taskId,再获取blockInfo,根据block加锁状态,移除对应的锁。最后唤醒阻塞线程,通知可以来申请锁了。
downgradeLock
将写锁降级为读锁
获取blockInfo,再移除block上的锁,最后给block加读锁。
releaseAllLocksForTask
移除task上对应的所有的锁。
lockNewBlockForWriting
lockForReading先获取读锁,因为是阻塞的,所以返回None的时候,就是block不存在。添加block的信息,并更新写锁。
removeBlock
只有写锁的task才能移除block。