THIS IS A TEST INSTANCE. ALL YOUR CHANGES WILL BE LOST!!!!
Versions Compared
compared with
Key
- This line was added.
- This line was removed.
- Formatting was changed.
...
- 给定一个request(req)/insertPlan,找到其对应的StorageGroupProcessor和TSP;
- 检查SystemInfo是否为reject状态;如果是,则该写入线程循环sleep 100ms 等待flush线程释放内存,system置回正常状态再进行写入;如果等待6000ms后仍为reject状态,抛出写入异常;
- 统计该plan中的各列,预估本次写入完成后增加的chunk_metadata和 unseal_resouce的内存占用,根据memtable中TVList的使用现状统计本次写入需要增加的内存空间占用,统计后将这些增加的内存记录在TspInfo和SgInfo中。
- 如果SGInfo变化超过System 上报的阈值(*),向System进行上报;
- 如果此时 `总写入内存 * 50% <= SystemInfo中统计的总内存 < 总写入内存 * 80%`, 触发flush
- 如果此时 `总写入内存 * 80% <= SystemInfo中统计的总内存`, SystemInfo 置于reject状态,触发flush
- 再次检查SystemInfo是否为reject状态;如果是,则该写入线程循环sleep 100ms 等待flush线程释放内存,system置回正常状态再进行写入;如果等待30s后仍为reject状态,抛出写入异常;
- 若此时捕获到写入异常,本次写入失败,返回客户端
- 若写入正常,开始向working memtable中写入数据,当memtable中Array空间不足时,向Array Pool申请新的Array。array pool判断是否有已向系统报备过的该类型array(即Buffered array)
- 如果有Buffered array,向Array Pool申请Buffered array并写入数据;
- 如果没有,则需要申请OOB(out of buffered)的数组
Flush流程:
flush 分为两种 一种为正常flush,为写入过程中触发,在insertPlan写入完成后正式开始进行异步flush(正常写入流程中flush);另一种为即时flush,即触发后立刻开始flush(flush释放内存后,若System总内存仍处于flush阈值之上时触发)一种为正常flush,为写入过程中触发,在insertPlan写入完成后正式开始进行异步flush(正常写入流程中flush);另一种为异步即时flush,即触发后立刻开始flush(flush释放内存后,若System总内存仍处于flush阈值之上且当前没有flush任务时触发)
正常flush流程:
- 通过上报到system里的sgInfo,找到所有的TSP;
- 使用PriorityQueue pop出当前workMemTable内存占用最大的TSP,将其标记为shouldFlush;如果flush此memtable后系统仍在flush阈值以上,再从PriorityQueue pop出当前workMemTable内存占用最大的Top K个TSP,将其标记为shouldFlush;如果flush此memtable后系统仍在flush阈值以上,再从PriorityQueue pop出一个TSP做标记,直到这些memtable flush后会回到flush阈值一下或者PriorityQueue为空
- 写入完成后在StorageGroupProcessor里检查shouldFlush,如果为true,进行异步flush过程
...
- 通过上报到system里的sgInfo,找到所有的TSP;
- 使用PriorityQueue pop出当前workMemTable内存占用最大的TSP,进行异步flush;如果flush此memtable后系统仍在flush阈值以上,再从PriorityQueue pop出当前workMemTable内存占用最大的Top K个TSP,进行异步flush;如果flush此memtable后系统仍在flush阈值以上,再从PriorityQueue pop出一个TSP进行异步flush,直到这些memtable flush后会回到flush阈值一下或者PriorityQueue为空
...