...
名称 | time_index_memory_proportion |
---|---|
描述 | 指定TimeIndex在Read Memory中的所占的比例(占比越高查询效率越高) |
类型 | double |
默认值 | 0.2 |
更改后的生效方式 | 重启服务器后生效 |
二、接口设计
...
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以下,则抛出异常 |
...
方法 | 描述 |
---|---|
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
...
三、详细设计
降级优先级的判定规则
DeviceTimeIndex的优先级高于FileTimeIndex。
- startTime早的TimeIndex优先级高于startTime晚的TimeIndex。
降级的触发流程
- 在TsFileResource的serialize方法的末尾调用TimeIndexManager的registerSealedTimeIndex方法。在TsFileResource的serialize方法的末尾调用TsFileResourceManager的registerSealedTsFileResource方法。
- 将TsFIleResource添加到sealedTsFileResources中,并对totalTsFileResourceMemCost进行判定:将TimeIndex添加到sealedTimeIndex中,并对totalTimeIndexMemCost进行判定:
- 当totalTimeIndexMemCost < TIME_INDEX_MEMORY_THRESHOLD时,直接返回。
- 当totalTimeIndexMemCost ≥ TIME_INDEX_MEMORY_THRESHOLD时,触发索引降级,调用chooseTimeIndexsToFlush方法进行以下操作。THRESHOLD时,触发索引降级,调用chooseTimeIndexsToDegrade方法进行以下操作。
提交降级任务到degradeThreadPool中,异步调用TsFileResource的degradeTimeIndexTo方法。
循环4和5直至4中的条件不被满足,若不存在可降级的TimeIndex则抛出异常。
...