UnsafeDestroyRange Unimplemented

【TiDB 版本】
v5.0.0-rc
【问题描述】
执行UnsafeDestroyRange 到tikv 提示Unimplemented 的错误,但是数据确实被清除了,这个错误是什么原因导致的呢?
同时在为什么gc_work 在发送完UnsafeDestroyRange 请求还要执行NewNotifyDeleteRangeTask?

  1. 具体的报错日志是怎么样的?
  2. UnsafeDestroyRange 是用于在 drop table/index 的情况下快速回收空间的 API ,UnsafeDestroyRange 只是用于在 Delete Ranges 阶段快速删除 drop table/index 的数据,正常 GC 的数据是在 Do GC 阶段完成的,完整的 GC 流程可以参考:https://docs.pingcap.com/zh/tidb/stable/garbage-collection-overview
  3. 这是调试 TiKV 代码还是修改?

1.错误信息如下


2.目前只是想封装一个简单的工具可以快速清理tikv 中的key/value

方便提供一下代码么

stores, err := storage.GetRegionCache().PDClient().GetAllStores(ctx)
if err != nil {
    zap.L().Error("get store list from PD:", zap.Error(err))
    return err
}
req := tikvrpc.NewRequest(tikvrpc.CmdUnsafeDestroyRange, &kvrpcpb.UnsafeDestroyRangeRequest{
    StartKey: startKey,
    EndKey:   endKey,
})
tikvCli := storage.GetTiKVClient()
var wg sync.WaitGroup
for _, store := range stores {
    if store.State != metapb.StoreState_Up {
        continue
    }
    wg.Add(1)
    go func() {
        defer wg.Done()
        _, storeErr := tikvCli.SendRequest(ctx, store.Address, req, tikv.UnsafeDestroyRangeTimeout)
        if storeErr != nil {
            zap.L().Error("destroy range error",zap.Error(storeErr))
        }
    }()
}
wg.Wait()

部署的环境是裸 KV 环境吗?只有 TiKV 节点和 PD 节点,没有 TiDB 节点。
写入数据的时候是通过 raw api 写入数据的还是 txn api 写入数据的?

1.部署环境是按照文档中的tiup 方式部署的,
具体部署命令 tiup playground --pd 3 --kv 3 --monitor
https://docs.pingcap.com/zh/tidb/stable/quick-start-with-tidb
2. 数据写入方式是使用txn api 的方式写入的

可以确认下集群中是否有启动 TiFlash 节点吗?TiFlash 节点没有实现 UnsafeDestroyRange 的接口。

TiFlash 节点应该是没有启动

  1. ps 没有发现TiFlash 相关进程
    2.通过获取store的label.GetValue() 没有发现为tiflash 的

请问问题是否可以复现?可以复现的话可以尝试打开 TiKV 的 debug log,看看这个 log 能不能打出来:https://github.com/tikv/tikv/blob/master/src/server/service/kv.rs#L508

@nioshield hello,有时间请看下楼上的回复。

重新复现了一次,发现没有楼上所说的 unsafe_destroy_range 错误
但是有类似于这样的错误,错误出现在 tiup 启动之后,unsafe_destroy_range执行之前
[2021/02/19 10:53:47.517 +08:00] [DEBUG] [kv.rs:874] ["kv rpc failed"] [err=RemoteStopped] [request=batch_commands]

研发童鞋回复:

  1. UnsafeDestroyRange 是绕过 Raft 层直接对数据进行清理,对于范围较大的区间,可以快速释放空间,但清除之后无法保证没有任何残留数据,甚至 Region 副本之间的数据可能不一致。因而仅当可以保证被清理的区间再也不会被访问时,才适合调用这个接口,调用这个接口意味着一段区间被永久废弃。请确认这是您需要的效果。
  2. 您应该是在自己的代码里,调用了 TiDB 中的代码,麻烦提供一下 go.mod 里依赖的 TiDB 版本和 hash。
    另外,那个 NotifyDeleteRange 是过时的代码,可以不管

1.针对第一条中 “无法保证没有任何残留数据,甚至 Region 副本之间的数据可能不一致”,最终这部分残留数据会被清除吗?
2.
github.com/pingcap/kvproto v0.0.0-20210204074845-dd36cf2e1c6b github.com/pingcap/tidb v1.1.0-beta.0.20201210112752-c33e90a7aef4 github.com/pingcap/tipb v0.0.0-20210204051656-2870a0852037 // indirect

方便提供一下后端 TiKV 版本吗,playground 默认启动的版本应该是 4.0
执行一下 ./tikv-server -V

TiKV
Release Version: 5.0.0-rc
Edition: Community
Git Commit Hash: 901f62d0ebe67db5d59402b31603b9aa903eb3e1
Git Commit Branch: HEAD
UTC Build Time: 2021-01-12 13:03:56
Rust Version: rustc 1.49.0-nightly (b1496c6e6 2020-10-18)
Enable Features: jemalloc sse protobuf-codec test-engines-rocksdb
Profile: dist_release