fixed fetcher semaphores

This commit is contained in:
zsfelfoldi 2016-06-29 02:43:36 +02:00
parent 947d696210
commit 8c3701c7c5

View file

@ -20,6 +20,7 @@ package les
import ( import (
"fmt" "fmt"
"sync" "sync"
"sync/atomic"
"time" "time"
"github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core"
@ -35,6 +36,7 @@ type lightFetcher struct{
syncPoolMu sync.Mutex syncPoolMu sync.Mutex
syncPool map[*peer]struct{} syncPool map[*peer]struct{}
syncPoolNotify chan struct{} syncPoolNotify chan struct{}
syncPoolNotified uint32
} }
func newLightFetcher(pm *ProtocolManager) *lightFetcher { func newLightFetcher(pm *ProtocolManager) *lightFetcher {
@ -85,7 +87,9 @@ func (f *lightFetcher) notify(p *peer, block blockInfo) {
f.syncPoolMu.Lock() f.syncPoolMu.Lock()
f.syncPool[p] = struct{}{} f.syncPool[p] = struct{}{}
f.syncPoolMu.Unlock() f.syncPoolMu.Unlock()
f.syncPoolNotify <- struct{}{} if atomic.SwapUint32(&f.syncPoolNotified, 1) == 0 {
f.syncPoolNotify <- struct{}{}
}
} }
} }
@ -113,24 +117,32 @@ func (f *lightFetcher) fetchBestFromPool() *peer {
} }
func (f *lightFetcher) syncLoop() { func (f *lightFetcher) syncLoop() {
f.pm.wg.Add(1)
defer f.pm.wg.Done()
for { for {
select { select {
case <-f.pm.quitSync: case <-f.pm.quitSync:
return return
case <-f.syncPoolNotify: case <-f.syncPoolNotify:
atomic.StoreUint32(&f.syncPoolNotified, 0)
chn := f.pm.getSyncLock(false) chn := f.pm.getSyncLock(false)
if chn != nil { if chn != nil {
go func() { if atomic.SwapUint32(&f.syncPoolNotified, 1) == 0 {
<-chn go func() {
f.syncPoolNotify <- struct{}{} <-chn
}() f.syncPoolNotify <- struct{}{}
}()
}
} else { } else {
if p := f.fetchBestFromPool(); p != nil { if p := f.fetchBestFromPool(); p != nil {
go f.syncWithPeer(p) go f.syncWithPeer(p)
go func() { if atomic.SwapUint32(&f.syncPoolNotified, 1) == 0 {
time.Sleep(softRequestTimeout) go func() {
f.syncPoolNotify <- struct{}{} time.Sleep(softRequestTimeout)
}() f.syncPoolNotify <- struct{}{}
}()
}
} }
} }
} }