# [Known Issues] 关于集群有多个空 region 始终不回收的问题

## Key Words

Empty Region, 空 region 不回收, placement rule

## Description

通过PD 监控（Region Heathy）发现集群始终有大量空 region 不回收

## Root Cause

如果设置了 placement rule，并且这些规则定义的 start_key 和 end_key 的 range 不是连续的，也就是规则 A 和 规则 B 之间是有空隙的，类似下面这种情况：\[100... Placement Rule A ... 200)\[200... Empty Region ... 300)\[300... Placement Rule B ...400)

在这种情况下，pd 会判断空 region 无法和前后 placement rule 的边界合并，导致这些 placement rule 规则之间的空隙形成了空 region 后就无法进一步和它相连的 region merge

## Diagnostic Steps

检查 PD 控制参数 [enable-cross-table-merge](https://docs.pingcap.com/zh/tidb/stable/pd-configuration-file##enable-cross-table-merge) 是否开启，为 True 时才可以跨 Schema 回收 空 region。

1. 检查 PD 控制参数 [Store-limit](https://docs.pingcap.com/zh/tidb/stable/pd-configuration-file##enable-cross-table-merge) 是否大于 0，此参数需要设置大于 0 ，TiKV 才会处理 PD 下发各类 Region 调度 Task

2. 检查 PD 控制参数 [merge-schedule-limit](https://docs.pingcap.com/zh/tidb/stable/pd-configuration-file##merge-schedule-limit) 是否小于默认值 8，此参数控制 PD 向各各 TIKV 发出 Region Merge Task 的数量

3. 检查 PD 控制参数 [split-merge-interval](https://docs.pingcap.com/zh/tidb/stable/pd-configuration-file##split-merge-interval) 是否大于默认值 1h， 此参数控制 空 Region 生成的保持不被 merge 的时间阈值，设置过长往往会导致 空 Region 长时间不回收

4. 通过 CTL 命令 获取 空 region 信息 pd-ctl region check empty-region，通过分析 命令获取的 空 region 信息，再结合 placement rule 规则（往往用户有大量 TiFlash 表）。判断 空 region 的边界是否正好是在 ，上下 placement rule key 的 中间。如果是此 空 Region 无法与前后的 Region 进行合并

## Resolution

1. 清空所有 placement rule 待空 Region 合并后，再重建 placement Rule

2. 业务层面避免 会大量使用　Rename Table 的场景来替换 Tiflash 中的 Table

    1. 表 A 已添加到 Tiflash 中

    2. 业务需求 对表 A 的数据进行大规模修改，随即建立表 A` 。

    3. 将 表 A` 同步到 TiFlash 中

    4. 切换 表 A 与 表 A`的 table name。

    5. 删除 老表 A。此场景频繁操作即会出现此问题

## Workaround

N/A

## Affected Version

< 5.4.0