Commit b71a0ace authored by Jeromy's avatar Jeromy Committed by Juan Batiz-Benet

clarify synhronization constructs

parent c273a3bd
...@@ -14,22 +14,16 @@ import ( ...@@ -14,22 +14,16 @@ import (
) )
type WantManager struct { type WantManager struct {
receiver bsnet.Receiver // sync channels for Run loop
incoming chan []*bsmsg.Entry incoming chan []*bsmsg.Entry
connect chan peer.ID // notification channel for new peers connecting
disconnect chan peer.ID // notification channel for peers disconnecting
// notification channel for new peers connecting // synchronized by Run loop, only touch inside there
connect chan peer.ID
// notification channel for peers disconnecting
disconnect chan peer.ID
peers map[peer.ID]*msgQueue peers map[peer.ID]*msgQueue
wl *wantlist.Wantlist wl *wantlist.Wantlist
network bsnet.BitSwapNetwork network bsnet.BitSwapNetwork
ctx context.Context ctx context.Context
} }
...@@ -60,6 +54,7 @@ type msgQueue struct { ...@@ -60,6 +54,7 @@ type msgQueue struct {
outlk sync.Mutex outlk sync.Mutex
out bsmsg.BitSwapMessage out bsmsg.BitSwapMessage
network bsnet.BitSwapNetwork
work chan struct{} work chan struct{}
done chan struct{} done chan struct{}
...@@ -112,7 +107,7 @@ func (pm *WantManager) startPeerHandler(p peer.ID) *msgQueue { ...@@ -112,7 +107,7 @@ func (pm *WantManager) startPeerHandler(p peer.ID) *msgQueue {
return nil return nil
} }
mq := newMsgQueue(p) mq := pm.newMsgQueue(p)
// new peer, we will want to give them our full wantlist // new peer, we will want to give them our full wantlist
fullwantlist := bsmsg.New(true) fullwantlist := bsmsg.New(true)
...@@ -123,7 +118,7 @@ func (pm *WantManager) startPeerHandler(p peer.ID) *msgQueue { ...@@ -123,7 +118,7 @@ func (pm *WantManager) startPeerHandler(p peer.ID) *msgQueue {
mq.work <- struct{}{} mq.work <- struct{}{}
pm.peers[p] = mq pm.peers[p] = mq
go pm.runQueue(mq) go mq.runQueue(pm.ctx)
return mq return mq
} }
...@@ -138,12 +133,12 @@ func (pm *WantManager) stopPeerHandler(p peer.ID) { ...@@ -138,12 +133,12 @@ func (pm *WantManager) stopPeerHandler(p peer.ID) {
delete(pm.peers, p) delete(pm.peers, p)
} }
func (pm *WantManager) runQueue(mq *msgQueue) { func (mq *msgQueue) runQueue(ctx context.Context) {
for { for {
select { select {
case <-mq.work: // there is work to be done case <-mq.work: // there is work to be done
err := pm.network.ConnectTo(pm.ctx, mq.p) err := mq.network.ConnectTo(ctx, mq.p)
if err != nil { if err != nil {
log.Errorf("cant connect to peer %s: %s", mq.p, err) log.Errorf("cant connect to peer %s: %s", mq.p, err)
// TODO: cant connect, what now? // TODO: cant connect, what now?
...@@ -161,7 +156,7 @@ func (pm *WantManager) runQueue(mq *msgQueue) { ...@@ -161,7 +156,7 @@ func (pm *WantManager) runQueue(mq *msgQueue) {
mq.outlk.Unlock() mq.outlk.Unlock()
// send wantlist updates // send wantlist updates
err = pm.network.SendMessage(pm.ctx, mq.p, wlm) err = mq.network.SendMessage(ctx, mq.p, wlm)
if err != nil { if err != nil {
log.Error("bitswap send error: ", err) log.Error("bitswap send error: ", err)
// TODO: what do we do if this fails? // TODO: what do we do if this fails?
...@@ -224,10 +219,11 @@ func (pm *WantManager) Run() { ...@@ -224,10 +219,11 @@ func (pm *WantManager) Run() {
} }
} }
func newMsgQueue(p peer.ID) *msgQueue { func (wm *WantManager) newMsgQueue(p peer.ID) *msgQueue {
mq := new(msgQueue) mq := new(msgQueue)
mq.done = make(chan struct{}) mq.done = make(chan struct{})
mq.work = make(chan struct{}, 1) mq.work = make(chan struct{}, 1)
mq.network = wm.network
mq.p = p mq.p = p
return mq return mq
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment