-
Notifications
You must be signed in to change notification settings - Fork 1
/
key-range.go
65 lines (51 loc) · 1.8 KB
/
key-range.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package client
import (
"context"
"time"
"github.com/Ferlab-Ste-Justine/etcd-sdk/keymodels"
clientv3 "go.etcd.io/etcd/client/v3"
)
func (cli *EtcdClient) getKeyRangeWithRetries(key string, rangeEnd string, retries uint64) (map[string]keymodels.KeyInfo, int64, error) {
ctx, cancel := context.WithTimeout(context.Background(), cli.RequestTimeout)
defer cancel()
keys := make(map[string]keymodels.KeyInfo)
res, err := cli.Client.Get(ctx, key, clientv3.WithRange(rangeEnd))
if err != nil {
if !shouldRetry(err, retries) {
return keys, -1, err
}
time.Sleep(100 * time.Millisecond)
return cli.getKeyRangeWithRetries(key, rangeEnd, retries - 1)
}
for _, kv := range res.Kvs {
key, value, createRevision, modRevision, version, lease := string(kv.Key), string(kv.Value), kv.CreateRevision, kv.ModRevision, kv.Version, kv.Lease
keys[key] = keymodels.KeyInfo{
Key: key,
Value: value,
Version: version,
CreateRevision: createRevision,
ModRevision: modRevision,
Lease: lease,
}
}
return keys, res.Header.Revision, nil
}
func (cli *EtcdClient) GetKeyRange(key string, rangeEnd string) (map[string]keymodels.KeyInfo, int64, error) {
return cli.getKeyRangeWithRetries(key, rangeEnd, cli.Retries)
}
func (cli *EtcdClient) deleteKeyRangeWithRetries(key string, rangeEnd string , retries uint64) error {
ctx, cancel := context.WithTimeout(context.Background(), cli.RequestTimeout)
defer cancel()
_, err := cli.Client.Delete(ctx, key, clientv3.WithRange(rangeEnd))
if err != nil {
if !shouldRetry(err, retries) {
return err
}
time.Sleep(100 * time.Millisecond)
return cli.deleteKeyRangeWithRetries(key, rangeEnd, retries - 1)
}
return nil
}
func (cli *EtcdClient) DeleteKeyRange(key string, rangeEnd string) error {
return cli.deleteKeyRangeWithRetries(key, rangeEnd, cli.Retries)
}