Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  1. 给定一个request(req)/insertPlan,找到其对应的StorageGroupProcessorTSP;
  2. 检查SystemInfo是否为reject状态;如果是,则该写入线程循环sleep 100ms 等待flush线程释放内存,system置回正常状态再进行写入;如果等待6000ms后仍为reject状态,抛出写入异常;
  3. 统计该plan中的各列,预估本次写入完成后增加的chunk_metadata和 unseal_resouce的内存占用,统计Text类型数据内存空间占用(若有),如果SGInfo变化超过System resouce的内存占用,根据memtable中TVList的使用现状统计本次写入需要增加的内存空间占用,统计后将这些增加的内存记录在TspInfo和SgInfo中。
  4. 如果SGInfo变化超过System 上报的阈值(*),做需要上报的标记,在本次写入完成后向System进行上报;
  5. 向working memtable中写入数据,当memtable中Array不足时,向Array Pool申请新的Array。array pool判断是否有已向系统报备过的该类型array(即Buffered array)
  6. ),向System进行上报;
    1. 如果此时
    2. 如果Buffered arrayArray Pool申请Buffered array并写入数据;
    3. 如果没有,则需要申请OOB(out of buffered)的数组,此时要立刻向System通知
    4. 若此时`SystemInfo中统计的总内存 < 总写入内存 * 50%`,即申请OOB成功,可以向申请到的OOB写入数据;
    5. 若此时
    6. `总写入内存 * 50% <= SystemInfo中统计的总内存 < 总写入内存 * 80%`,
    7. 也表示申请OOB成功,可以向申请到的OOB写入数据, 但此时需要同时触发延迟flush;若此时`总写入内存
    8. 触发flush
    9. 如果此时 `总写入内存 * 80% <= SystemInfo中统计的总内存`, SystemInfo
    10. 置于reject状态,也申请OOB也能成功,可以向申请到的OOB写入数据, 但此时需要同时触发延迟flush (如果在此异步强制flush,并且需要强制flush此写入未完成的memtable,会造成空指针错误);
  7. 写入完成后,如果有需要上报SGInfo的标记,此时上报给System;
    1. 如果此时 `总写入内存 * 50% <= SystemInfo中统计的总内存 < 总写入内存 * 80%`, 触发延迟flush
    2. 如果此时 `总写入内存 * 80% <= SystemInfo中统计的总内存`, SystemInfo 置于reject状态,触发延迟flush

...

    1. 置于reject状态,触发flush
    2. 再次检查SystemInfo是否为reject状态;如果是,则该写入线程循环sleep 100ms 等待flush线程释放内存,system置回正常状态再进行写入;如果等待30s后仍为reject状态,抛出写入异常;
  1. 若此时捕获到写入异常,本次写入失败,返回客户端
  2. 若写入正常,开始向working memtable中写入数据,当memtable中Array空间不足时,向Array Pool申请新的Array。array pool判断是否有已向系统报备过的该类型array(即Buffered array)
    1. 如果Buffered arrayArray Pool申请Buffered array并写入数据;
    2. 如果没有,则需要申请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流程:

  1. 通过上报到system里的sgInfo,找到所有的TSP;
  2. 使用PriorityQueue pop出当前workMemTable内存占用最大的TSP,将其标记为shouldFlush;如果flush此memtable后系统仍在flush阈值以上,再从PriorityQueue pop出一个TSP做标记,直到这些memtable flush后会回到flush阈值一下或者PriorityQueue为空
  3. 写入完成后在StorageGroupProcessor里检查shouldFlush,如果为true,进行异步flush过程

...

  1. 通过上报到system里的sgInfo,找到所有的TSP;
  2. 使用PriorityQueue pop出当前workMemTable内存占用最大的TSP,进行异步flush;如果flush此memtable后系统仍在flush阈值以上,再从PriorityQueue pop出一个TSP进行异步flush,直到这些memtable flush后会回到flush阈值一下或者PriorityQueue为空


关闭TsFile文件逻辑:

文件封口触发逻辑与现有master版本相同,都为一次insertPlan写入完成后,检查该TSP是否需要flush,如果需要,再检查是否TsFile大小超过阈值,如果超过,flush 文件封口触发逻辑与现有master版本相同,都为一个insertPlan写入完成后,检查该TSP是否需要flush,如果需要,再检查是否TsFile大小超过阈值,如果超过,flush memtable后将文件封口。

TsFile关闭完成后,清空该TSPInfo,向对应SGInfo重置状态并向SystemInfo报告重置后SGInfo

  1. 如果此时SystemInfo 为reject状态 且 `SystemInfo中统计的总内存 < 总写入内存 * 80%`,将SystemInfo 置于正常状态
  2. 如果`SystemInfo中统计的总内存 >= 总写入内存 * 50%`,触发即时flush

ArrayManager(Array Pool)管理机制:

array manager 里有两个计数器 BufferedArraysSize与OutOfBufferedArraysSize。

  1. 当memtable 申请新的array进行写入时,如果BufferedArraysSize没有达到ArrayManager阈值,即40%的总写入内存,BufferedArraysSize增加新申请的ArraySize。当BufferedArraysSize达到ArrayManager阈值后,OutOfBufferedArraysSize 增加新申请的ArraySize。
  2. 当memtable flush完,进行内存释放的时,如果OutOfBufferedArraysSize > 0,OutOfBufferedArraysSize减去需要释放的ArraySize,直至OutOfBufferedArraysSize到0。如果此时仍有Array需要释放,BufferedArraysSize减去需要释放的ArraySize。
  3. OOB减掉的size会上报给System
  4. 如果减掉后System内存降到reject阈值以下,将System 取消reject状态;
  5. 如果减掉后System内存仍在flush阈值以上,触发即时flush


 

MTree内存控制:

注册时间序列时,如果总时间序列个数*300 > 总内存*0.1,此时拒绝注册,抛出异常。

...