implement more primitives
This commit is contained in:
parent
ce8d109039
commit
ae5f39fb34
@ -22,6 +22,15 @@ type Client interface {
|
|||||||
// considering we can sort by increasing distance from the origin and then do
|
// considering we can sort by increasing distance from the origin and then do
|
||||||
// the query in linear time.
|
// the query in linear time.
|
||||||
|
|
||||||
|
// Find finds the first node in the network preceding id.
|
||||||
|
func Find(ctx context.Context, cl Client, n *Node, id ID) (Peer, error) {
|
||||||
|
if n.IsLocal(id) {
|
||||||
|
return n.self, nil
|
||||||
|
}
|
||||||
|
p, err := cl.FindSuccessor(ctx, n.Closest(id), id)
|
||||||
|
return p, err
|
||||||
|
}
|
||||||
|
|
||||||
// Join creates a new node joining an existing Chord network by communicating
|
// Join creates a new node joining an existing Chord network by communicating
|
||||||
// with any peer already in the network.
|
// with any peer already in the network.
|
||||||
func Join(ctx context.Context, cl Client, addr netip.AddrPort, np Peer) (*Node, error) {
|
func Join(ctx context.Context, cl Client, addr netip.AddrPort, np Peer) (*Node, error) {
|
||||||
|
10
chord/id.go
10
chord/id.go
@ -4,6 +4,7 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"crypto/sha1"
|
"crypto/sha1"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
|
"errors"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -49,3 +50,12 @@ func (id ID) String() string {
|
|||||||
b = hex.AppendEncode(b, id[:])
|
b = hex.AppendEncode(b, id[:])
|
||||||
return string(b)
|
return string(b)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ParseID(s string) (ID, error) {
|
||||||
|
if len(s) != len(ID{})*2 {
|
||||||
|
return ID{}, errors.New("invalid ID")
|
||||||
|
}
|
||||||
|
var id ID
|
||||||
|
_, err := hex.AppendDecode(id[:], []byte(s))
|
||||||
|
return id, err
|
||||||
|
}
|
||||||
|
@ -26,16 +26,19 @@ func (n *Node) Successor() Peer {
|
|||||||
return n.succ[0]
|
return n.succ[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Neighbors returns the node's predecessor and appends its successor list to s.
|
||||||
|
func (n *Node) Neighbors(s []Peer) (Peer, []Peer) {
|
||||||
|
return n.pred, append(s, n.succ...)
|
||||||
|
}
|
||||||
|
|
||||||
// IsLocal reports whether this node owns the given key.
|
// IsLocal reports whether this node owns the given key.
|
||||||
func (n *Node) IsLocal(key string) bool {
|
func (n *Node) IsLocal(id ID) bool {
|
||||||
id := keyID(key)
|
|
||||||
return contains(n.self.id, n.Successor().id, id)
|
return contains(n.self.id, n.Successor().id, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Closest finds the locally known peer which is the closest predecessor of key.
|
// Closest finds the locally known peer which is the closest predecessor of key.
|
||||||
func (n *Node) Closest(key string) Peer {
|
func (n *Node) Closest(id ID) Peer {
|
||||||
self := n.self.id
|
self := n.self.id
|
||||||
id := keyID(key)
|
|
||||||
l := n.fingers
|
l := n.fingers
|
||||||
for i := len(l) - 1; i >= 0; i-- {
|
for i := len(l) - 1; i >= 0; i-- {
|
||||||
f := l[i]
|
f := l[i]
|
||||||
|
Loading…
Reference in New Issue
Block a user