Versions Compared

Key

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

...

  • Schema和历史resource单独分配大小;下文仅考虑其余写数据部分大小。
  • 每个SG统计自身的chunk_metadata和unseal_resource大小;
  • 全局ArrayPool统计buffered和out of buffer的array大小
  • 系统统计总的大小

写入流程:


写入线程

  1. 给定一个写入计划,找到其对应的StorageGroupProcessorTSP;
  2. 检查SystemInfo是否为reject状态;如果是,则该写入线程循环sleep 100ms 等待flush线程释放内存,system置回正常状态再进行写入;如果等待6000ms后仍为reject状态,抛出写入异常;
  3. 获取 StorageGroupProsessor 的 进入对应的StorageGroupProcessor,获取 writeLock
  4. 进入对应分区的 TsFileProcessor:(1)获取已有的可写入的顺序或乱序 TsFileProcessor(2)如果没有可写入的TsFileProcessor,创建新的 TsFileProcessor
    1. 统计当前写入计划新增的内存占用,增加至TspInfo和SgInfo中:(1)新测点增加 chunk_metadata(2)新设备增加 unclosed resource(3)TEXT 类型数据(4)TVList 中增加的 PrimitiveArray(5)flush内存
    2. 如果SGInfo变化超过System 上报的阈值(storage_group_size_report_threshold=16M)
      1. 向SystemInfo进行上报;synchronized(SystemInfo) {
        1. 先更新 更新 SystemInfo 内存占用 内存占用。
        2. 如果 SystemInfo 内存占用 < 总写入内存 * flush_proportion,返回 true。
        3. 如果 总写入内存 * flush_proportion <= SystemInfo 内存占用 < 总写入内存 * reject_proportion, 触发flush触发flush,返回 true。
        4. 如果 总写入内存 * 80% <= SystemInfo 内存占用, SystemInfo 置为 reject 状态,触发flush状态,触发flush,返回 false。返回是否允许此次写入
          }
      2. 如果返回禁止写入;如果是,则该写入线程循环sleep 100ms 等待flush线程释放内存,system置回正常状态再进行写入;如果等待30s后仍为reject状态,抛出写入异常;
  5. 若此时捕获到写入异常,本次写入失败,返回客户端
  6. 若写入正常,开始向working memtable中写入数据,当memtable中Array空间不足时,向Array Pool申请新的Array。array pool判断是否有已向系统报备过的该类型array(即Buffered array)
    1. 如果Buffered arrayArray Pool申请Buffered array并写入数据;
    2. 如果没有,则需要申请OOB(out of buffered)的数组
      1. 如果返回 false,则该写入线程循环sleep 50ms 检查 SystemInfo 的 reject 状态如果不 reject,执行正常写入。如果等待 max_waiting_time_when_insert_blocked 后仍为reject状态,抛出写入异常


Flush流程:

flush 分为两种 一种为正常flush,为写入过程中触发,在insertPlan写入完成后正式开始进行异步flush(正常写入流程中flush);另一种为异步即时flush,即触发后立刻开始flush(flush释放内存后,若System总内存仍处于flush阈值之上且当前没有flush任务时触发)

...

系统级别维护SystemInfo:S

    • S=A+sum(G
  1. 若写入正常,开始向working memtable中写入数据,当memtable中Array空间不足时,向Array Pool申请新的Array。array pool判断是否有已向系统报备过的该类型array(即Buffered array)
    1. 如果Buffered arrayArray Pool申请Buffered array并写入数据;
    2. 如果没有,则需要申请OOB(out of buffered)的数组

SG个数:M

系统为delay上报预留的内存大小:R

...