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
+}