Skip to content
Snippets Groups Projects
Commit 7da62010 authored by Benjamin Wenger's avatar Benjamin Wenger
Browse files

added a hack to fix stop network follower crashes

parent a63c881b
No related branches found
No related tags found
No related merge requests found
package interfaces
// this interface is used to allow the follower to to be stopped later if it
// fails
type Running interface{
IsRunning()bool
}
......@@ -46,7 +46,7 @@ type followNetworkComms interface {
// followNetwork polls the network to get updated on the state of nodes, the
// round status, and informs the client when messages can be retrieved.
func (m *manager) followNetwork(report interfaces.ClientErrorReport, quitCh <-chan struct{}) {
func (m *manager) followNetwork(report interfaces.ClientErrorReport, quitCh <-chan struct{}, isRunning interfaces.Running) {
ticker := time.NewTicker(m.param.TrackNetworkPeriod)
TrackTicker := time.NewTicker(debugTrackPeriod)
rng := m.Rng.GetStream()
......@@ -58,17 +58,23 @@ func (m *manager) followNetwork(report interfaces.ClientErrorReport, quitCh <-ch
rng.Close()
done = true
case <-ticker.C:
m.follow(report, rng, m.Comms)
m.follow(report, rng, m.Comms, isRunning)
case <-TrackTicker.C:
numPolls := atomic.SwapUint64(m.tracker, 0)
jww.INFO.Printf("Polled the network %d times in the "+
"last %s", numPolls, debugTrackPeriod)
}
if !isRunning.IsRunning(){
jww.ERROR.Printf("Killing network follower " +
"due to failed exit")
return
}
}
}
// executes each iteration of the follower
func (m *manager) follow(report interfaces.ClientErrorReport, rng csprng.Source, comms followNetworkComms) {
func (m *manager) follow(report interfaces.ClientErrorReport, rng csprng.Source,
comms followNetworkComms, isRunning interfaces.Running) {
//get the identity we will poll for
identity, err := m.Session.Reception().GetIdentity(rng)
......@@ -100,6 +106,11 @@ func (m *manager) follow(report interfaces.ClientErrorReport, rng csprng.Source,
identity.EndRequest, identity.EndRequest.Sub(identity.StartRequest), host.GetId())
return comms.SendPoll(host, &pollReq)
})
if !isRunning.IsRunning(){
jww.ERROR.Printf("Killing network follower " +
"due to failed exit")
return
}
if err != nil {
if report != nil {
report(
......
......@@ -130,7 +130,7 @@ func (m *manager) Follow(report interfaces.ClientErrorReport) (stoppable.Stoppab
// Start the Network Tracker
trackNetworkStopper := stoppable.NewSingle("TrackNetwork")
go m.followNetwork(report, trackNetworkStopper.Quit())
go m.followNetwork(report, trackNetworkStopper.Quit(), trackNetworkStopper)
multi.Add(trackNetworkStopper)
// Message reception
......
......@@ -52,7 +52,6 @@ func (s *Single) Name() string {
func (s *Single) Close(timeout time.Duration) error {
var err error
s.once.Do(func() {
atomic.StoreUint32(&s.running, 0)
timer := time.NewTimer(timeout)
select {
case <-timer.C:
......@@ -61,6 +60,7 @@ func (s *Single) Close(timeout time.Duration) error {
err = errors.Errorf("%s failed to close", s.name)
case s.quit <- struct{}{}:
}
atomic.StoreUint32(&s.running, 0)
})
return err
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment