forked from lni/dragonboat
-
Notifications
You must be signed in to change notification settings - Fork 0
/
multikey_error.go
72 lines (62 loc) · 1.86 KB
/
multikey_error.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
66
67
68
69
70
71
72
package levigo
import (
"fmt"
)
// MultiKeyError encapsulates multiple errors encountered in a Get/Put-Many() call,
// behind the errors.error interface. Caller may cast the generic error object to
// a MultiKeyError and call ErrorsByKeyIdx() to get all the errors by the failed key index.
type MultiKeyError struct {
// invariant: errsByIdx is either nil or has at least ONE entry, it's never an empty map
errsByIdx map[int]error
}
func (mke *MultiKeyError) Error() string {
if mke.errsByIdx == nil {
return ""
}
// Show a few errors to informed the user
var topErrsMsg string
const maxNumErrs = 3
cnt := 0
for i := range mke.errsByIdx {
topErrsMsg += fmt.Sprintf(" keys[%d]:%s;", i, mke.errsByIdx[i].Error())
cnt++
if cnt >= maxNumErrs {
break
}
}
return fmt.Sprintf("%d keys encountered error (here's a few:%s), cast via err.(*levigo.MultiKeyErrors).ErrorsByKeyIdx() to get all the errors", len(mke.errsByIdx), topErrsMsg)
}
func (mke *MultiKeyError) GoString() string {
return fmt.Sprintf("*%#v", *mke)
}
// ErrorsByKeyIdx() returns a result map of keyIdx => error. e.g.
// If one calls GetMany(keys) and keys[2], keys[3], keys[7]
// failed, then result[2] will hold the error for keys[2],
// result[3] for keys[3] and result[7] the error for keys[7]
func (mke *MultiKeyError) ErrorsByKeyIdx() map[int]error {
if mke.errsByIdx == nil {
return nil
}
result := make(map[int]error, len(mke.errsByIdx))
for keyIdx, err := range mke.errsByIdx {
result[keyIdx] = err
}
return result
}
func (mke *MultiKeyError) addKeyErr(keyIdx int, err error) {
if mke.errsByIdx == nil {
mke.errsByIdx = make(map[int]error)
}
// This means operation on keys[keyIdx] failed with err
mke.errsByIdx[keyIdx] = err
}
func (mke *MultiKeyError) errAt(i int) error {
if mke.errsByIdx == nil {
return nil
}
err, ok := mke.errsByIdx[i]
if !ok {
return nil
}
return err
}