THIS IS A TEST INSTANCE. ALL YOUR CHANGES WILL BE LOST!!!!
...
- 在各种查询 Executor 的初始化方法中
- 调用StorageEngine.mergeLock
- 根据每个查询涉及的序列,获得这些序列所属的所有StorageGroupProcessor,按照StorageGroupProcessor的name的字母序排序
- 对于每个查询涉及的 StorageGroupProcessor
- 对 insertLock 加读锁,对 compactionMergeLock 加读锁
- 对每个涉及的序列所在的 StorageGroupProsessor
- 对 insertLock 加读锁,对 compactionMergeLock 加读锁
- 筛选待查的 TsFileResource 列表,对于待查的每个 TsFileResource
- 对 TsFileLock 加读锁
- 释放 insertLock 和 compactionMergeLock 的读锁
- 调用StorageEngine.mergeUnlock,对每个涉及的序列所在的 StorageGroupProsessor
- 释放 insertLock 和 compactionMergeLock 的读锁
- 直到查询结束,释放所有 TsFileLock 的读锁
- 查询正常结束,则会在 fetchResult() 没有下一组数据时,调用 releaseQueryResourceNoExceptions() 方法释放读锁
- 查询正常进行,但未取到最后一组数据时,dataSet 被关闭,也会调用 releaseQueryResourceNoExceptions() 方法释放读锁
- 查询正常进行,此时 session 连接调用 close()方法,会对此连接执行的每个未被释放查询,调用 releaseQueryResourceNoExceptions() 方法释放读锁
- 查询遇到异常,则会在异常捕获内调用 releaseQueryResourceNoExceptions() 释放读锁
写入获取和释放锁的流程
写入获取锁的流程较为简单,在StorageGroupProcessor中,每一个insert接口都会直接获取该SGP的insert lock的写锁,直至写入完成,返回StorageEngine后再释放写锁,具体写入接口如下:
...