/
vbucketmap.go
71 lines (54 loc) · 1.48 KB
/
vbucketmap.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
package gocbcore
type vbucketMap struct {
entries [][]int
numReplicas int
}
func newVbucketMap(entries [][]int, numReplicas int) *vbucketMap {
vbMap := vbucketMap{
entries: entries,
numReplicas: numReplicas,
}
return &vbMap
}
func (vbMap vbucketMap) IsValid() bool {
return len(vbMap.entries) > 0 && len(vbMap.entries[0]) > 0
}
func (vbMap vbucketMap) NumVbuckets() int {
return len(vbMap.entries)
}
func (vbMap vbucketMap) NumReplicas() int {
return vbMap.numReplicas
}
func (vbMap vbucketMap) VbucketsByServer(replicaID int) [][]uint16 {
var vbList [][]uint16
// We do not currently support listing for all replicas at once
if replicaID < 0 {
return nil
}
for vbID, entry := range vbMap.entries {
if len(entry) <= replicaID {
continue
}
serverID := entry[replicaID]
for len(vbList) <= serverID {
vbList = append(vbList, nil)
}
vbList[serverID] = append(vbList[serverID], uint16(vbID))
}
return vbList
}
func (vbMap vbucketMap) VbucketByKey(key []byte) uint16 {
return uint16(cbCrc(key) % uint32(len(vbMap.entries)))
}
func (vbMap vbucketMap) NodeByVbucket(vbID uint16, replicaID uint32) (int, error) {
if vbID >= uint16(len(vbMap.entries)) {
return 0, ErrInvalidVBucket
}
if replicaID >= uint32(len(vbMap.entries[vbID])) {
return 0, ErrInvalidReplica
}
return vbMap.entries[vbID][replicaID], nil
}
func (vbMap vbucketMap) NodeByKey(key []byte, replicaID uint32) (int, error) {
return vbMap.NodeByVbucket(vbMap.VbucketByKey(key), replicaID)
}