# [Critical Bug] TiDB Operator v1.3.0-beta.1:v1.3.0，TiFlash 从低版本升级到 v5.4.0 后，元数据丢失，无法响应查询请求

[ONCALL-4515](https://internal.pingcap.net/jira/browse/ONCALL-4515)

[TiFlash 参数配置](https://pingcap.feishu.cn/sheets/shtcnaMkj4g1USPo1TLEv3nRVLh?sheet=wY5RNf)

## Issue

TiDB Operator v1.3.0-beta.1/v1.3.0，TiFlash 从低版本升级到 v5.4.0 后，TiFlash 查询数据报错，日志中出现 “region not found in engine-store…” 的错误日志，TiFlash 元数据丢失，无法响应查询请求。

## Root Cause

TiDB Operator 对于 TiFlash < v5.4.0 使用配置 raft.kvstore_path = "/data0/kvstore" 配置项作为 kvstore 的路径存储元数据。 升级至 v5.4.0 后，TiDB Operator (v1.3.0-beta.1 和 v1.3.0) 根据 TiDB Operator 和 TiFlash team 使用新的配置项 storage.raft.dir = "/data0/kvstore"，格式为 string，但 TiFlash 侧将该项作为 array 使用。当该配置项是 string 而不是 array 时， TiFlash 识别为空 array，并使用默认值 /data0/db/kvstore。最终导致 TiFlash 丢失全部历史元数据。

### 影响范围

1.这两个配置项都不是必选项，在官方对外文档也没有暴露，所以影响范围只限于使用 5.4.0 版本的 operator 用户。

2.raft.kvstore_path 和 storage.raft.dir 这两个配置项一直都是升级兼容的，如果保持配置不变，升级后不会出现任何问题。

3.storage.raft.dir 是Tiflash 4.0.9 之后新增的配置项，用于代替 raft.kvstore_path(新版本仍然支持)，目的是为了支持多盘部署。

4.Operator 从 5.4.0 开始使用 storage.raft.dir 配置项，但是由于 TiFlash 团队提供给 operator 的配置文档不正确（应该是 array 格式，写成了string)，导致生成了错误配置，从低版本升级上来后出现问题。

Diagnostic Steps
确认用户使用 TiDB Operator 部署集群，且 TiDB Operator 版本为 v1.3.0-beta1 或 v1.3.0

确认用户部署的 TiDB 集群版本 >= 5.4.0，且集群中部署了 TiFlash

TiFlash 启动时，tiflash.log(serverlog container 日志输出） 日志中出现 "Raft data candidate path: /data0/db/kvstore/"(正常应该是 /data0/kvstore/);tiflash_tikv.log (tiflash container 日志输出）日志中，在升级到 5.4.0 或以上版本后，第一次启动时出现 "region not found in engine-store" 的错误

## Resolution

1. TiDB Operator 修改配置格式为 array，修复版本 v1.3.1

2. TiFlash 修改代码加上配置参数格式校验，修复版本 v5.4.1

## Workaround

如果使用 TiDB Operator v1.3.0-beta.1 或 v1.3.0，暂时先不要升级 TiFlash 到 v5.4.0，请先升级 TiDB Operator 到 v1.3.1 再升级 TiFlash。

如果已经升级并遇到问题，请参考下面步骤修复：

1. 参考文档 [移除 TiFlash](https://docs.pingcap.com/zh/tidb-in-kubernetes/dev/deploy-tiflash##%E7%A7%BB%E9%99%A4-tiflash)

2. 重新配置并启用 TiFlash

```yaml
spec:

  tiflash:

    …

    config:

      config: |

        tmp_path = "/data0/tmp"

        [storage]

          [storage.main]

            dir = ["/data0/db"]

          [storage.raft]

            dir = [ "/data0/kvstore" ]
```