Versions Compared

Key

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

...

名称time_index_memory_proportion
描述指定TimeIndex在Read Memory中的所占的比例(占比越高查询效率越高)
类型double
默认值0.2
更改后的生效方式重启服务器后生效

二、接口设计

org.apache.iotdb.db.rescon.

...

TsFileResourceManager

  • double TIME_INDEX_MEMORY_THRESHOLD:TimeIndex可使用的内存总量,值为allocateMemoryForRead * time_index_memory_proportion。

  • ExecutorService degradeThreadPool:用于执行TimeIndex降级任务的线程池。

  • PriorityQueue<TsFileResource> sealedTimeIndex:维护所有已封口的TsFileResoruce,按照TimeIndex降级的优先级从高到低排序。sealedTsFileResources:维护所有已封口的TsFileResoruce,按照TimeIndex降级的优先级从高到低排序。

  • long totalTimeIndexMemCost:所有已封口的TimeIndex占用的内存总量(非精确值,只计入封口文件的TimeIndex大小),当该值超过TIME_INDEX_MEMORY_THRESHOLD时触发索引降级。

方法描述
registerSealedTimeIndexregisterSealedTsFileResource

语法:public synchronized ITimeIndex registerSealedTimeIndexvoid registerSealedTsFileResource(TsFileResource resourcetsfileResource)

功能:将已封口的TsFileResoruce添加到sealedTimeIndex中,并在totalTimeIndexMemCost中添加内存占用,当totalTimeIndexMemCost sealedTsFileResources中,并在totalTimeIndexMemCost中添加内存占用,当totalTimeIndexMemCost ≥ TIME_INDEX_MEMORY_THRESHOLD时触发索引降级

releaseTimeIndexMemCost

语法:public synchronized void releaseTimeIndexMemCost(long memCost)

功能:在totalTimeIndexMemCost上减去memCost

chooseTimeIndexsToFlushchooseTimeIndexsToDegrade

语法:private void chooseTimeIndexsToFlushchooseTimeIndexsToDegrade()

功能:挑选sealedTimeIndex中的TimeIndex进行降级,直至totalTimeIndexMemCost降至TIME功能:挑选sealedTsFileResources中的TsFileResource进行降级,直至totalTimeIndexMemCost降至TIME_INDEX_MEMORY_THRESHOLD以下,若无法降至TIME_INDEX_MEMORY_THRESHOLD以下,则抛出异常

removeTsFileReource

语法:public synchronized void removeTsFileResource(TsFileResource tsFileResource)

功能:从 sealedTsFileResources 中删除 TsFileResource,并在totalTimeIndexMemCost中减去内存占用

org.apache.iotdb.db.engine.storagegroup.TsFileResource

...

方法描述
degradeTimeIndexTo

语法:public void degradeTimeIndexTo(TimeIndexLevel targetLevel)

功能:将该TsFileResource的TimeIndex降级到目标等级,降级后调用TimeIndexManager的releaseTimeIndexMemCost方法释放内存占用

compareIndexDegradePriority

语法:public int compareIndexDegradePriority(ITimeIndex otherTsFileResource other)

功能:比较TimeIndex间的降级优先级

org.apache.iotdb.db.engine.storagegroup.timeindex.ITimeIndex

...

三、详细设计

降级优先级的判定规则

  • 只有封口后序列化形成.resource文件的ITimeIndex才能降级,未封口和序列化的不能降级。resource文件的TimeIndex才能降级,未封口和序列化的不能降级。

  • DeviceTimeIndex的优先级高于FileTimeIndex。

  • startTime早的TimeIndex优先级高于startTime晚的TimeIndex。

降级的触发流程

  1. 在TsFileResource的serialize方法的末尾调用TimeIndexManager的registerSealedTimeIndex方法。在TsFileResource的serialize方法的末尾调用TsFileResourceManager的registerSealedTsFileResource方法。
  2. 将TsFIleResource添加到sealedTsFileResources中,并对totalTsFileResourceMemCost进行判定:将TimeIndex添加到sealedTimeIndex中,并对totalTimeIndexMemCost进行判定:
    • 当totalTimeIndexMemCost < TIME_INDEX_MEMORY_THRESHOLD时,直接返回。
    • 当totalTimeIndexMemCost ≥ TIME_INDEX_MEMORY_THRESHOLD时,触发索引降级,调用chooseTimeIndexsToFlush方法进行以下操作。THRESHOLD时,触发索引降级,调用chooseTimeIndexsToDegrade方法进行以下操作。
  3. 当totalTimeIndexMemCost ≥ TIME_INDEX_MEMORY_THRESHOLD时,从sealedTimeIndex中取出降级优先级最高的TsFileResource。THRESHOLD时,从sealedTsFileResources中取出降级优先级最高的TsFileResource。

  4. 提交降级任务到degradeThreadPool中,异步调用TsFileResource的degradeTimeIndexTo方法。

  5. 循环4和5直至4中的条件不被满足,若不存在可降级的TimeIndex则抛出异常。

注册TimeIndex的时机

  • 正常写入:在StorageGroupProcessor的closeUnsealedTsFileProcessorCallBack方法中注册,在TsFileProcessor关闭之后注册

  • 重启:在StorageGroupProcessor的recoverTsFiles方法中注册

    • 不在zero level的TsFile

      • 若writer已crashed,表示该文件是合并的目标文件且文件未写完,按合并流程注册

      • 若writer未crashed,表示该文件完整,直接注册

    • 在zero level的TsFile

      • 若该文件不是最新的tsfile或文件已封口,则直接注册

      • 反之,构造对应的TsFileProcessor,按正常写入流程注册

  • 合并:在CompactionUtils的merge方法中注册target,取消注册sources

  • 降级:降级完成后需要重新注册

取消注册TimeIndex的时机

  • TsFileManagement的remove方法
  • TsFileManagement的removeAll方法