etcd/mod/lock/v2/lock_nodes.go
Ben Johnson dde2b71850 fix(mod/lock): correct watch index to remove cpu load
The waitIndex was being pulled from the wrong node in the lock parent which caused the watch to be returned immediately. This caused a continuous set of calls while a client was waiting for a lock.
2014-02-26 17:26:25 -07:00

61 lines
1.4 KiB
Go

package v2
import (
"path"
"sort"
"strconv"
"github.com/coreos/etcd/third_party/github.com/coreos/go-etcd/etcd"
)
// lockNodes is a wrapper for go-etcd's Nodes to allow for sorting by numeric key.
type lockNodes struct {
etcd.Nodes
}
// Less sorts the nodes by key (numerically).
func (s lockNodes) Less(i, j int) bool {
a, _ := strconv.Atoi(path.Base(s.Nodes[i].Key))
b, _ := strconv.Atoi(path.Base(s.Nodes[j].Key))
return a < b
}
// Retrieves the first node in the set of lock nodes.
func (s lockNodes) First() *etcd.Node {
sort.Sort(s)
if len(s.Nodes) > 0 {
return &s.Nodes[0]
}
return nil
}
// Retrieves the first node with a given value.
func (s lockNodes) FindByValue(value string) (*etcd.Node, int) {
sort.Sort(s)
for i, node := range s.Nodes {
if node.Value == value {
return &node, i
}
}
return nil, 0
}
// Find the node with the largest index in the lockNodes that is smaller than the given index. Also return the lastModified index of that node.
func (s lockNodes) PrevIndex(index int) (int, int) {
sort.Sort(s)
// Iterate over each node to find the given index. We keep track of the
// previous index on each iteration so we can return it when we match the
// index we're looking for.
var prevIndex int
for _, node := range s.Nodes {
idx, _ := strconv.Atoi(path.Base(node.Key))
if index == idx {
return prevIndex, int(node.ModifiedIndex)
}
prevIndex = idx
}
return 0, 0
}