-
Notifications
You must be signed in to change notification settings - Fork 233
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Unexpected result when DeleteRange at range [nil, nil) #428
Comments
I'll take a look. |
When i debug source code in tikv/client, i found code here may not correct when I try to hard code in // Execute performs the delete range operation.
func (t *DeleteRangeTask) sendReqOnRange(ctx context.Context, r kv.KeyRange) (TaskStat, error) {
startKey, rangeEndKey := r.StartKey, r.EndKey
var stat TaskStat
for {
select {
case <-ctx.Done():
return stat, errors.WithStack(ctx.Err())
default:
}
// if bytes.Compare(startKey, rangeEndKey) >= 0 {
// break
// }
// hard code part begin
// normal case: startKey >= rangeEndKey
if len(rangeEndKey) > 0 && bytes.Compare(startKey, rangeEndKey) >= 0 {
break
}
// hard code part end
bo := retry.NewBackofferWithVars(ctx, deleteRangeOneRegionMaxBackoff, nil)
loc, err := t.store.GetRegionCache().LocateKey(bo, startKey)
if err != nil {
return stat, err
}
// Delete to the end of the region, except if it's the last region overlapping the range
endKey := loc.EndKey
// If it is the last region
if loc.Contains(rangeEndKey) {
endKey = rangeEndKey
}
// log begin
logutil.Logger(ctx).Info("send on range info",
zap.String("startKey", kv.StrKey(startKey)),
zap.String("range endKey", kv.StrKey(rangeEndKey)),
zap.String("endKey", kv.StrKey(endKey)))
// log end
req := tikvrpc.NewRequest(tikvrpc.CmdDeleteRange, &kvrpcpb.DeleteRangeRequest{
StartKey: startKey,
EndKey: endKey,
NotifyOnly: t.notifyOnly,
})
resp, err := t.store.SendReq(bo, req, loc.Region, client.ReadTimeoutMedium)
if err != nil {
return stat, err
}
regionErr, err := resp.GetRegionError()
if err != nil {
return stat, err
}
if regionErr != nil {
err = bo.Backoff(retry.BoRegionMiss, errors.New(regionErr.String()))
if err != nil {
return stat, err
}
// log begin
logutil.Logger(ctx).Info("send on range error",
zap.String("err", regionErr.String()))
// log end
continue
}
if resp.Resp == nil {
return stat, errors.WithStack(tikverr.ErrBodyMissing)
}
deleteRangeResp := resp.Resp.(*kvrpcpb.DeleteRangeResponse)
if err := deleteRangeResp.GetError(); err != "" {
return stat, errors.Errorf("unexpected delete range err: %v", err)
}
stat.CompletedRegions++
startKey = endKey
// hard code begin
// case rangeEndKey = nil: will find the end of tikv data.
if len(endKey) == 0 {
break
}
// hard code end
}
return stat, nil
} Result:
tikv log error when test:
It keeps reporting error when send request to tikv and i don't know what's going on. |
@Jy-poi I found this issue too. I think there are bug in tikv side too and it prevents using nil as end key of delete range. |
I have send a PR. You can help to review if it is convenient. |
Ok, I will review this after a while. |
It does not delete all data in tikv when i called
DeleteRange(ctx, nil, nil, 10)
Reproduce code:
Result in my tikv(v5.3.0):
It can see that DeleteRange(ctx, nil, nil,10) can not delete data in all range.
The text was updated successfully, but these errors were encountered: