mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
Merge pull request #4583 from gyuho/delete
*: return the number of deleted keys
This commit is contained in:
commit
67472d1ee0
@ -232,6 +232,8 @@ func (*DeleteRangeRequest) ProtoMessage() {}
|
|||||||
|
|
||||||
type DeleteRangeResponse struct {
|
type DeleteRangeResponse struct {
|
||||||
Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"`
|
Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"`
|
||||||
|
// Deleted is the number of keys that got deleted.
|
||||||
|
Deleted int64 `protobuf:"varint,2,opt,name=deleted,proto3" json:"deleted,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *DeleteRangeResponse) Reset() { *m = DeleteRangeResponse{} }
|
func (m *DeleteRangeResponse) Reset() { *m = DeleteRangeResponse{} }
|
||||||
@ -2088,6 +2090,11 @@ func (m *DeleteRangeResponse) MarshalTo(data []byte) (int, error) {
|
|||||||
}
|
}
|
||||||
i += n3
|
i += n3
|
||||||
}
|
}
|
||||||
|
if m.Deleted != 0 {
|
||||||
|
data[i] = 0x10
|
||||||
|
i++
|
||||||
|
i = encodeVarintRpc(data, i, uint64(m.Deleted))
|
||||||
|
}
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3342,6 +3349,9 @@ func (m *DeleteRangeResponse) Size() (n int) {
|
|||||||
l = m.Header.Size()
|
l = m.Header.Size()
|
||||||
n += 1 + l + sovRpc(uint64(l))
|
n += 1 + l + sovRpc(uint64(l))
|
||||||
}
|
}
|
||||||
|
if m.Deleted != 0 {
|
||||||
|
n += 1 + sovRpc(uint64(m.Deleted))
|
||||||
|
}
|
||||||
return n
|
return n
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4696,6 +4706,25 @@ func (m *DeleteRangeResponse) Unmarshal(data []byte) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
iNdEx = postIndex
|
iNdEx = postIndex
|
||||||
|
case 2:
|
||||||
|
if wireType != 0 {
|
||||||
|
return fmt.Errorf("proto: wrong wireType = %d for field Deleted", wireType)
|
||||||
|
}
|
||||||
|
m.Deleted = 0
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowRpc
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := data[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
m.Deleted |= (int64(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
iNdEx = preIndex
|
iNdEx = preIndex
|
||||||
skippy, err := skipRpc(data[iNdEx:])
|
skippy, err := skipRpc(data[iNdEx:])
|
||||||
|
@ -152,6 +152,8 @@ message DeleteRangeRequest {
|
|||||||
|
|
||||||
message DeleteRangeResponse {
|
message DeleteRangeResponse {
|
||||||
ResponseHeader header = 1;
|
ResponseHeader header = 1;
|
||||||
|
// Deleted is the number of keys that got deleted.
|
||||||
|
int64 deleted = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
message RequestUnion {
|
message RequestUnion {
|
||||||
|
@ -384,6 +384,7 @@ func applyDeleteRange(txnID int64, kv dstorage.KV, dr *pb.DeleteRangeRequest) (*
|
|||||||
resp.Header = &pb.ResponseHeader{}
|
resp.Header = &pb.ResponseHeader{}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
n int64
|
||||||
rev int64
|
rev int64
|
||||||
err error
|
err error
|
||||||
)
|
)
|
||||||
@ -393,14 +394,15 @@ func applyDeleteRange(txnID int64, kv dstorage.KV, dr *pb.DeleteRangeRequest) (*
|
|||||||
}
|
}
|
||||||
|
|
||||||
if txnID != noTxn {
|
if txnID != noTxn {
|
||||||
_, rev, err = kv.TxnDeleteRange(txnID, dr.Key, dr.RangeEnd)
|
n, rev, err = kv.TxnDeleteRange(txnID, dr.Key, dr.RangeEnd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
_, rev = kv.DeleteRange(dr.Key, dr.RangeEnd)
|
n, rev = kv.DeleteRange(dr.Key, dr.RangeEnd)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
resp.Deleted = n
|
||||||
resp.Header.Revision = rev
|
resp.Header.Revision = rev
|
||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
@ -282,42 +282,43 @@ func TestV3DeleteRange(t *testing.T) {
|
|||||||
end string
|
end string
|
||||||
|
|
||||||
wantSet [][]byte
|
wantSet [][]byte
|
||||||
|
deleted int64
|
||||||
}{
|
}{
|
||||||
// delete middle
|
// delete middle
|
||||||
{
|
{
|
||||||
[]string{"foo", "foo/abc", "fop"},
|
[]string{"foo", "foo/abc", "fop"},
|
||||||
"foo/", "fop",
|
"foo/", "fop",
|
||||||
[][]byte{[]byte("foo"), []byte("fop")},
|
[][]byte{[]byte("foo"), []byte("fop")}, 1,
|
||||||
},
|
},
|
||||||
// no delete
|
// no delete
|
||||||
{
|
{
|
||||||
[]string{"foo", "foo/abc", "fop"},
|
[]string{"foo", "foo/abc", "fop"},
|
||||||
"foo/", "foo/",
|
"foo/", "foo/",
|
||||||
[][]byte{[]byte("foo"), []byte("foo/abc"), []byte("fop")},
|
[][]byte{[]byte("foo"), []byte("foo/abc"), []byte("fop")}, 0,
|
||||||
},
|
},
|
||||||
// delete first
|
// delete first
|
||||||
{
|
{
|
||||||
[]string{"foo", "foo/abc", "fop"},
|
[]string{"foo", "foo/abc", "fop"},
|
||||||
"fo", "fop",
|
"fo", "fop",
|
||||||
[][]byte{[]byte("fop")},
|
[][]byte{[]byte("fop")}, 2,
|
||||||
},
|
},
|
||||||
// delete tail
|
// delete tail
|
||||||
{
|
{
|
||||||
[]string{"foo", "foo/abc", "fop"},
|
[]string{"foo", "foo/abc", "fop"},
|
||||||
"foo/", "fos",
|
"foo/", "fos",
|
||||||
[][]byte{[]byte("foo")},
|
[][]byte{[]byte("foo")}, 2,
|
||||||
},
|
},
|
||||||
// delete exact
|
// delete exact
|
||||||
{
|
{
|
||||||
[]string{"foo", "foo/abc", "fop"},
|
[]string{"foo", "foo/abc", "fop"},
|
||||||
"foo/abc", "",
|
"foo/abc", "",
|
||||||
[][]byte{[]byte("foo"), []byte("fop")},
|
[][]byte{[]byte("foo"), []byte("fop")}, 1,
|
||||||
},
|
},
|
||||||
// delete none, [x,x)
|
// delete none, [x,x)
|
||||||
{
|
{
|
||||||
[]string{"foo"},
|
[]string{"foo"},
|
||||||
"foo", "foo",
|
"foo", "foo",
|
||||||
[][]byte{[]byte("foo")},
|
[][]byte{[]byte("foo")}, 0,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -341,6 +342,9 @@ func TestV3DeleteRange(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("couldn't delete range on test %d (%v)", i, err)
|
t.Fatalf("couldn't delete range on test %d (%v)", i, err)
|
||||||
}
|
}
|
||||||
|
if tt.deleted != dresp.Deleted {
|
||||||
|
t.Errorf("expected %d on test %v, got %d", tt.deleted, i, dresp.Deleted)
|
||||||
|
}
|
||||||
|
|
||||||
rreq := &pb.RangeRequest{Key: []byte{0x0}, RangeEnd: []byte{0xff}}
|
rreq := &pb.RangeRequest{Key: []byte{0x0}, RangeEnd: []byte{0xff}}
|
||||||
rresp, err := kvc.Range(context.TODO(), rreq)
|
rresp, err := kvc.Range(context.TODO(), rreq)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user