-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathnode.go
More file actions
83 lines (73 loc) · 2.06 KB
/
node.go
File metadata and controls
83 lines (73 loc) · 2.06 KB
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
73
74
75
76
77
78
79
80
81
82
83
package ring
import (
"github.com/gholt/holdme"
"github.com/gholt/ring/lowring"
)
type Node struct {
ring *Ring
index int
info string
capacity int
replicaToPartitions [][]uint32
}
func (n *Node) Info() string {
return n.info
}
func (n *Node) Capacity() int {
return n.capacity
}
func (n *Node) Group() *Group {
return n.ring.groups[n.ring.nodeToGroup[n.index]]
}
func (n *Node) fillReplicaToPartitions() {
if n.replicaToPartitions == nil {
replicaCount := len(n.ring.replicaToPartitionToNode)
partitionCount := uint32(len(n.ring.replicaToPartitionToNode[0]))
n.replicaToPartitions = make([][]uint32, replicaCount)
for replica := 0; replica < replicaCount; replica++ {
partitions := []uint32{}
partitionToNode := n.ring.replicaToPartitionToNode[replica]
for partition := uint32(0); partition < partitionCount; partition++ {
if partitionToNode[partition] == lowring.Node(n.index) {
partitions = append(partitions, partition)
}
}
n.replicaToPartitions[replica] = partitions
}
}
}
func (n *Node) Partitions() []int {
n.fillReplicaToPartitions()
var partitions holdme.OrderedIntsNoDups
for _, parts := range n.replicaToPartitions {
for _, partition := range parts {
partitions.Add(int(partition))
}
}
return partitions
}
func (n *Node) PartitionsForReplica(replica int) []int {
n.fillReplicaToPartitions()
partitions := make([]int, len(n.replicaToPartitions[replica]))
for i, partition := range n.replicaToPartitions[replica] {
partitions[i] = int(partition)
}
return partitions
}
func (n *Node) Responsible(key int) int {
partition := key % len(n.ring.replicaToPartitionToNode[0])
for replica, partitionToNode := range n.ring.replicaToPartitionToNode {
if int(partitionToNode[partition]) == n.index {
return replica
}
}
return -1
}
func (n *Node) ResponsibleForReplicaPartition(replica, partition int) bool {
for _, partitionToNode := range n.ring.replicaToPartitionToNode {
if int(partitionToNode[partition]) == n.index {
return true
}
}
return false
}