@cryptotaxi247 / kubo / commits / c08b89585

Peerstore - threadsafe peer collection

will have persistence later on as a datastore passed in.

Juan Batiz-Benet committed Sep 16, 2014 at 05:06 UTC c08b895851001efe6a014bd20612128feb7b9de3
1 file changed +86
peer/peerstore.go new
+86
@@ -0,0 +1,86 @@
1 +package peer
2 +
3 +import (
4 + "errors"
5 + "sync"
6 +
7 + u "github.com/jbenet/go-ipfs/util"
8 +
9 + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go"
10 +)
11 +
12 +// Peerstore provides a threadsafe collection for peers.
13 +type Peerstore interface {
14 + Get(ID) (*Peer, error)
15 + Add(*Peer) error
16 + Remove(ID) error
17 + All() (*map[u.Key]*Peer, error)
18 +}
19 +
20 +type peerstore struct {
21 + sync.RWMutex
22 + peers ds.Datastore
23 +}
24 +
25 +// NewPeerstore creates a threadsafe collection of peers.
26 +func NewPeerstore() Peerstore {
27 + return &peerstore{
28 + peers: ds.NewMapDatastore(),
29 + }
30 +}
31 +
32 +func (p *peerstore) Get(i ID) (*Peer, error) {
33 + p.RLock()
34 + defer p.RUnlock()
35 +
36 + val, err := p.peers.Get(ds.NewKey(string(i)))
37 + if err != nil {
38 + return nil, err
39 + }
40 +
41 + peer, ok := val.(*Peer)
42 + if !ok {
43 + return nil, errors.New("stored value was not a Peer")
44 + }
45 + return peer, nil
46 +}
47 +
48 +func (p *peerstore) Add(peer *Peer) error {
49 + p.Lock()
50 + defer p.Unlock()
51 +
52 + k := ds.NewKey(string(peer.ID))
53 + return p.peers.Put(k, peer)
54 +}
55 +
56 +func (p *peerstore) Remove(i ID) error {
57 + p.Lock()
58 + defer p.Unlock()
59 +
60 + k := ds.NewKey(string(i))
61 + return p.peers.Delete(k)
62 +}
63 +
64 +func (p *peerstore) All() (*map[u.Key]*Peer, error) {
65 + p.RLock()
66 + defer p.RUnlock()
67 +
68 + l, err := p.peers.KeyList()
69 + if err != nil {
70 + return nil, err
71 + }
72 +
73 + ps := &map[u.Key]*Peer{}
74 + for _, k := range l {
75 + val, err := p.peers.Get(k)
76 + if err != nil {
77 + continue
78 + }
79 +
80 + pval, ok := val.(*Peer)
81 + if ok {
82 + (*ps)[u.Key(k.String())] = pval
83 + }
84 + }
85 + return ps, nil
86 +}