Versions Compared

Key

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

...

  • 在线升级,即后台升级 TsFile 版本到 v3
  • 0.12 可同时查询 TsFile v3 和 TsFile v2

升级流程

移动文件

升级第一次启动新版本需要移动文件

  1. 检查system.properties,如果iotdb_version=0.11.x,则需要升级进行文件移动
  2. 检查是否存在未关闭的v2

...

  1. tsfile(即是否存在wal,tsfile文件数是否等于resource文件数
  2. 扫描各个存储组顺序与乱序的数据目录(仅针对在0.11的数据上第一次启动0.12),将所有文件移动到存储组的 upgrade 目录下(当做一个特殊分区号)
  3. 升级system.properties

    1. 使用iotdb_version的默认值设置到properties,与从旧文件中获得的信息一起写入到一个system.properties.tmp文件中
    2. 如果写入成功,删除旧的system.properties后将system.properties.tmp重命名为system.properties;
    3. 如果写入失败,会留下写入失败的system.properties.tmp和旧system.properties,此时我们需要重启iotdb重新进行升级

加载resource

  • StorageGroupProcessor 加载各个分区 resource,并且检查是否存在 upgrade 分区,将 upgrade 目录中的 TsFile 单独存到待升级的 upgradeSeqResourceList 和upgradeUnSeqResourceList中。

升级 TsFile

  1. 在加载完resource后 upgrade service会对每个sg中,每个需要 upgrade 的文件提交异步升级任务
  2. 拿到resource读锁
  3. upgrade.txt 记录 (v2文件路径,1)
  4. 升级工具从前向后check v2 TsFile文件,将文件解到page级别
    1. 对于boolean、text、和Int32类型,将page解码到数据点级别,用v3版writer写成新的page data(原因:boolean需要生成sum的statistic,text和Int32中的int变成了varInt)
  5. 使用v3版ioWriter序列化新的chunk、pageheader结构,pagedata
  6. 关闭所有新生成的每一个新文件,并生成对应的新resource
  7. upgrade.txt 记录 (v2文件路径,2)
  8. 释放resource读锁
  9. 拿到resource写锁

...

更新updateNewlyFlushedPartitionLatestFlushedTimeForEachDevice

...

  1. 更新updateNewlyFlushedPartitionLatestFlushedTimeForEachDevice

  2. StorageGroupProcessor 中的 upgradeFileCount--
  3. 如果此时StorageGroupProcessor中所有tsfile升级完成,即upgradeFileCount == 0,删除旧tsfile和resource,将新生成的TsFile、resource和升级后的mods文件(若有)移动到对应常规分区目录中;并将所有升级后的resource加载到tsFileManagement中
  4. 并且更新partitionLatestFlushedTimeForEachDevice
  5. upgrade.txt 记录 (v2文件路径,3)
  6. 释放resource写锁

升级恢复

当升级未完成时,重启IoTDB时,需要根据upgrade.txt记录恢复升级

  • 如果一个v2文件日志记录只有1:删除新生成的对应v3文件,之后该文件会重新升级

  • 如果一个v2文件日志记录只有1,2:将新生成的TsFile、resource和原本的mods文件(若有)移动到对应正常目录中

...

  • 如果一个v2文件日志记录只有1:删除新生成的对应v3文件,之后文件会重新升级

  • 如果一个v2文件日志记录只有1,2:升级线程在进行升级该文件时跳过写新文件文件,直接从9继续进行