# [KB]-TiFlash-query-error-region-xxx-is-unavailable

## Key Words

tiflash, region unavailable, learner read, 1105

## Description

Region xxx is unavailable 从报错看应该是 TiFlash 追 raft 最新进度，没追上（默认 300ms）,查看监控后，发现确实有些尖峰，但依据 performance map 上的 append/apply log duration 阈值来看也不算问题点。

![image2022-10-25_19-14-16.png](/images/TiFlash/know-issue-tiflash-query-region-unavailable.png)

在问题发生阶段：

1. TiFlash-Summary 的 "Storage" -> "I/O Limiter Pending Tasks" 中 bgwrite 持续不为 0，后台线程写入受到限制。

2. TiFlash-Proxy-Details 的 "Thread CPU" -> "Async apply CPU" 掉为 0，raft apply 线程被阻塞。

在问题发生阶段，报错 region 有如下日志信息：

![know-issue-tiflash-query-region-unavailable1](/images/TiFlash/know-issue-tiflash-query-region-unavailable1.png)

## Root Cause

1. 后台写入任务打满，出现阻塞("pengding-task")，但是前台写入很小的情况下，碰到了一些代码中阈值判断条件触发了 [tiflash #6099](https://github.com/pingcap/tiflash/issues/6099)。
2. 由于 [#6099](https://github.com/pingcap/tiflash/issues/6099) iolimiter 的 bug，在整体 IO 资源比较空闲的情况下，tiflash 后台 segment 数据 minor compact 的速度仍然被限制在很小的值(1 MB/s)。
3. 这时候相同 key-range 的 region 收到 raft compact log 命令，apply raft log 需要等待 2 中的后台任务完成。
4. 2 的后台任务持续了超过 30min 才完成，因此这段时间内 raft apply 完全被卡住了，这个过程中执行查询时因为 wait index 超时导致失败。
5. 在 2 的 minor compact 任务完成后，raft log 可以顺利 apply，整体也恢复正常了。

## Resolution

升级到未受影响版本

## Workaround

1. 等待后台任务完成，或者重启 tiflash 节点。
2. 或者将 config 文件中的 storage.io_rate_limit.max_bytes_per_sec 设为 0 可以绕过这个问题。

## Affect Version

v6.1.0, v6.1.1
