Skip to content
This repository was archived by the owner on Feb 1, 2023. It is now read-only.

Commit d4191c4

Browse files
committed
feat(peermanager): move refcnt
Move refcnt tracking from the messagequeue to the peermanager, where it's relevant
1 parent 434e0f4 commit d4191c4

File tree

3 files changed

+36
-49
lines changed

3 files changed

+36
-49
lines changed

messagequeue/messagequeue.go

-20
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@ type MessageQueue struct {
3434

3535
sender bsnet.MessageSender
3636

37-
refcnt int
38-
3937
work chan struct{}
4038
done chan struct{}
4139
}
@@ -48,27 +46,9 @@ func New(p peer.ID, network MessageNetwork) *MessageQueue {
4846
wl: wantlist.NewThreadSafe(),
4947
network: network,
5048
p: p,
51-
refcnt: 0,
5249
}
5350
}
5451

55-
// RefCount returns the number of open connections for this queue.
56-
func (mq *MessageQueue) RefCount() int {
57-
return mq.refcnt
58-
}
59-
60-
// RefIncrement increments the refcount for a message queue.
61-
func (mq *MessageQueue) RefIncrement() {
62-
mq.refcnt++
63-
}
64-
65-
// RefDecrement decrements the refcount for a message queue and returns true
66-
// if the refcount is now 0.
67-
func (mq *MessageQueue) RefDecrement() bool {
68-
mq.refcnt--
69-
return mq.refcnt > 0
70-
}
71-
7252
// AddMessage adds new entries to an outgoing message for a given session.
7353
func (mq *MessageQueue) AddMessage(entries []*bsmsg.Entry, ses uint64) {
7454
if !mq.addEntries(entries, ses) {

peermanager/peermanager.go

+35-21
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,6 @@ var (
1919

2020
// PeerQueue provides a queer of messages to be sent for a single peer.
2121
type PeerQueue interface {
22-
RefIncrement()
23-
RefDecrement() bool
24-
RefCount() int
2522
AddMessage(entries []*bsmsg.Entry, ses uint64)
2623
Startup(ctx context.Context)
2724
AddWantlist(initialEntries []*wantlist.Entry)
@@ -35,10 +32,15 @@ type peerMessage interface {
3532
handle(pm *PeerManager)
3633
}
3734

35+
type peerQueueInstance struct {
36+
refcnt int
37+
pq PeerQueue
38+
}
39+
3840
// PeerManager manages a pool of peers and sends messages to peers in the pool.
3941
type PeerManager struct {
4042
// peerQueues -- interact through internal utility functions get/set/remove/iterate
41-
peerQueues map[peer.ID]PeerQueue
43+
peerQueues map[peer.ID]*peerQueueInstance
4244
peerQueuesLk sync.RWMutex
4345

4446
createPeerQueue PeerQueueFactory
@@ -48,7 +50,7 @@ type PeerManager struct {
4850
// New creates a new PeerManager, given a context and a peerQueueFactory.
4951
func New(ctx context.Context, createPeerQueue PeerQueueFactory) *PeerManager {
5052
return &PeerManager{
51-
peerQueues: make(map[peer.ID]PeerQueue),
53+
peerQueues: make(map[peer.ID]*peerQueueInstance),
5254
createPeerQueue: createPeerQueue,
5355
ctx: ctx,
5456
}
@@ -68,28 +70,39 @@ func (pm *PeerManager) ConnectedPeers() []peer.ID {
6870
// Connected is called to add a new peer to the pool, and send it an initial set
6971
// of wants.
7072
func (pm *PeerManager) Connected(p peer.ID, initialEntries []*wantlist.Entry) {
71-
mq := pm.getOrCreate(p)
73+
pm.peerQueuesLk.Lock()
74+
75+
pq := pm.getOrCreate(p)
7276

73-
if mq.RefCount() == 0 {
74-
mq.AddWantlist(initialEntries)
77+
if pq.refcnt == 0 {
78+
pq.pq.AddWantlist(initialEntries)
7579
}
76-
mq.RefIncrement()
80+
81+
pq.refcnt++
82+
83+
pm.peerQueuesLk.Unlock()
7784
}
7885

7986
// Disconnected is called to remove a peer from the pool.
8087
func (pm *PeerManager) Disconnected(p peer.ID) {
8188
pm.peerQueuesLk.Lock()
8289
pq, ok := pm.peerQueues[p]
8390

84-
if !ok || pq.RefDecrement() {
91+
if !ok {
92+
pm.peerQueuesLk.Unlock()
93+
return
94+
}
95+
96+
pq.refcnt--
97+
if pq.refcnt > 0 {
8598
pm.peerQueuesLk.Unlock()
8699
return
87100
}
88101

89102
delete(pm.peerQueues, p)
90103
pm.peerQueuesLk.Unlock()
91104

92-
pq.Shutdown()
105+
pq.pq.Shutdown()
93106

94107
}
95108

@@ -99,25 +112,26 @@ func (pm *PeerManager) SendMessage(entries []*bsmsg.Entry, targets []peer.ID, fr
99112
if len(targets) == 0 {
100113
pm.peerQueuesLk.RLock()
101114
for _, p := range pm.peerQueues {
102-
p.AddMessage(entries, from)
115+
p.pq.AddMessage(entries, from)
103116
}
104117
pm.peerQueuesLk.RUnlock()
105118
} else {
106119
for _, t := range targets {
107-
p := pm.getOrCreate(t)
108-
p.AddMessage(entries, from)
120+
pm.peerQueuesLk.Lock()
121+
pqi := pm.getOrCreate(t)
122+
pm.peerQueuesLk.Unlock()
123+
pqi.pq.AddMessage(entries, from)
109124
}
110125
}
111126
}
112127

113-
func (pm *PeerManager) getOrCreate(p peer.ID) PeerQueue {
114-
pm.peerQueuesLk.Lock()
115-
pq, ok := pm.peerQueues[p]
128+
func (pm *PeerManager) getOrCreate(p peer.ID) *peerQueueInstance {
129+
pqi, ok := pm.peerQueues[p]
116130
if !ok {
117-
pq = pm.createPeerQueue(p)
131+
pq := pm.createPeerQueue(p)
118132
pq.Startup(pm.ctx)
119-
pm.peerQueues[p] = pq
133+
pqi = &peerQueueInstance{0, pq}
134+
pm.peerQueues[p] = pqi
120135
}
121-
pm.peerQueuesLk.Unlock()
122-
return pq
136+
return pqi
123137
}

peermanager/peermanager_test.go

+1-8
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,13 @@ type messageSent struct {
2020
}
2121

2222
type fakePeer struct {
23-
refcnt int
2423
p peer.ID
2524
messagesSent chan messageSent
2625
}
2726

2827
func (fp *fakePeer) Startup(ctx context.Context) {}
2928
func (fp *fakePeer) Shutdown() {}
30-
func (fp *fakePeer) RefCount() int { return fp.refcnt }
31-
func (fp *fakePeer) RefIncrement() { fp.refcnt++ }
32-
func (fp *fakePeer) RefDecrement() bool {
33-
fp.refcnt--
34-
return fp.refcnt > 0
35-
}
29+
3630
func (fp *fakePeer) AddMessage(entries []*bsmsg.Entry, ses uint64) {
3731
fp.messagesSent <- messageSent{fp.p, entries, ses}
3832
}
@@ -41,7 +35,6 @@ func makePeerQueueFactory(messagesSent chan messageSent) PeerQueueFactory {
4135
return func(p peer.ID) PeerQueue {
4236
return &fakePeer{
4337
p: p,
44-
refcnt: 0,
4538
messagesSent: messagesSent,
4639
}
4740
}

0 commit comments

Comments
 (0)