diff --git a/api/client.go b/api/client.go index 9068708d01307030a811065b810588d8614b677c..118615bdcb7d4dc23b6a7fde682a3fdc224b4a6a 100644 --- a/api/client.go +++ b/api/client.go @@ -435,15 +435,16 @@ func (c *Client) StopNetworkFollower(timeout time.Duration) error { return errors.WithMessage(err, "Failed to Stop the Network Follower") } err = c.runner.Close(timeout) - if err != nil { - return errors.WithMessage(err, "Failed to Stop the Network Follower") - } c.runner = stoppable.NewMulti("client") - err = c.status.toStopped() - if err != nil { - return errors.WithMessage(err, "Failed to Stop the Network Follower") + err2 := c.status.toStopped() + if err2 != nil { + if err ==nil{ + err = err2 + }else{ + err = errors.WithMessage(err,err2.Error()) + } } - return nil + return err } // NetworkFollowerStatus Gets the state of the network follower. Returns: diff --git a/api/version_vars.go b/api/version_vars.go index 7a6a80ad7afc287095b1f57d7b6f7f975171495d..75d1adeef89b0d9ed44699e42d0bb7e6306fbbb6 100644 --- a/api/version_vars.go +++ b/api/version_vars.go @@ -1,10 +1,10 @@ // Code generated by go generate; DO NOT EDIT. // This file was generated by robots at -// 2021-05-05 15:53:47.443011 -0500 CDT m=+0.014473892 +// 2021-05-07 09:33:37.4750421 -0700 PDT m=+0.043142701 package api -const GITVERSION = `b6f474ae fixed sendCmix time delay and the interface for bindings time now` -const SEMVER = "2.4.0" +const GITVERSION = `51fdae45 made stop network follower always allow restart` +const SEMVER = "2.5.0" const DEPENDENCIES = `module gitlab.com/elixxir/client go 1.13 @@ -24,14 +24,15 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 github.com/spf13/viper v1.7.1 gitlab.com/elixxir/bloomfilter v0.0.0-20200930191214-10e9ac31b228 - gitlab.com/elixxir/comms v0.0.4-0.20210505205202-1d4c18a7fcb2 - gitlab.com/elixxir/crypto v0.0.7-0.20210504210535-3077ddf9984d + gitlab.com/elixxir/comms v0.0.4-0.20210506225017-37485f5ba063 + gitlab.com/elixxir/crypto v0.0.7-0.20210506223047-3196e4301110 gitlab.com/elixxir/ekv v0.1.5 gitlab.com/elixxir/primitives v0.0.3-0.20210504210415-34cf31c2816e gitlab.com/xx_network/comms v0.0.4-0.20210505205155-48daa8448ad7 gitlab.com/xx_network/crypto v0.0.5-0.20210504210244-9ddabbad25fd gitlab.com/xx_network/primitives v0.0.4-0.20210504205835-db68f11de78a golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 + golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57 // indirect google.golang.org/genproto v0.0.0-20210105202744-fe13368bc0e1 // indirect google.golang.org/grpc v1.34.0 // indirect diff --git a/auth/request.go b/auth/request.go index c43707904f835b19d1e64ba53cb4ec9fe550355f..76af994787f8e1658e13345bf14883e091e7790d 100644 --- a/auth/request.go +++ b/auth/request.go @@ -55,17 +55,20 @@ func RequestAuth(partner, me contact.Contact, message string, rng io.Reader, //lookup if an ongoing request is occurring rqType, sr, _, err := storage.Auth().GetRequest(partner.ID) - if err != nil && !strings.Contains(err.Error(), auth.NoRequest){ + if err == nil { if rqType == auth.Receive { - return 0, errors.WithMessage(err, - "Cannot send a request after receiving a request") + return 0, errors.Errorf("Cannot send a request after " + + "receiving a request") } else if rqType == auth.Sent { resend = true }else{ - return 0, errors.WithMessage(err, - "Cannot send a request after receiving unknown error " + - "on requesting contact status") + return 0, errors.Errorf("Cannot send a request after " + + " a stored request with unknown rqType: %d", rqType) } + }else if !strings.Contains(err.Error(), auth.NoRequest){ + return 0, errors.WithMessage(err, + "Cannot send a request after receiving unknown error " + + "on requesting contact status") } grp := storage.E2e().GetGroup() diff --git a/cmd/version.go b/cmd/version.go index b781e502cb97afc8edd8c90300c8a9f1e5816969..67b545b53c3ed7e36e85abccbeadf817bc52dc25 100644 --- a/cmd/version.go +++ b/cmd/version.go @@ -18,7 +18,7 @@ import ( ) // Change this value to set the version for this build -const currentVersion = "2.4.0" +const currentVersion = "2.5.0" func Version() string { out := fmt.Sprintf("Elixxir Client v%s -- %s\n\n", api.SEMVER, diff --git a/go.mod b/go.mod index b8327e0195269546595585518ee07b2583071bd4..7142c43f2d9fa81eacd6878befdc445e5d8f8a1f 100644 --- a/go.mod +++ b/go.mod @@ -17,8 +17,8 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 github.com/spf13/viper v1.7.1 gitlab.com/elixxir/bloomfilter v0.0.0-20200930191214-10e9ac31b228 - gitlab.com/elixxir/comms v0.0.4-0.20210506161214-6371db79ce6f - gitlab.com/elixxir/crypto v0.0.7-0.20210504210535-3077ddf9984d + gitlab.com/elixxir/comms v0.0.4-0.20210506225017-37485f5ba063 + gitlab.com/elixxir/crypto v0.0.7-0.20210506223047-3196e4301110 gitlab.com/elixxir/ekv v0.1.5 gitlab.com/elixxir/primitives v0.0.3-0.20210504210415-34cf31c2816e gitlab.com/xx_network/comms v0.0.4-0.20210505205155-48daa8448ad7 diff --git a/go.sum b/go.sum index e07685770c61db52aa8e701d5040959f292fcbf5..c02d426f81e92c2cecddcaabb483586a412caa9e 100644 --- a/go.sum +++ b/go.sum @@ -257,12 +257,16 @@ gitlab.com/elixxir/comms v0.0.4-0.20210505205202-1d4c18a7fcb2 h1:8aL4V7FaKkDb5iP gitlab.com/elixxir/comms v0.0.4-0.20210505205202-1d4c18a7fcb2/go.mod h1:VN0fNE7GFMrkZwRGnqA7fNNRAXDA4CCP6su/FQQ68RI= gitlab.com/elixxir/comms v0.0.4-0.20210506161214-6371db79ce6f h1:0hvU+6Y+JGFnBu8ZSMk0ukNuYg+GAnVKD8Yo4VwSdao= gitlab.com/elixxir/comms v0.0.4-0.20210506161214-6371db79ce6f/go.mod h1:7ff+A4Nom55mKiRW7qWsN7LDjGay4OZwiaaIVXZ4hdk= +gitlab.com/elixxir/comms v0.0.4-0.20210506225017-37485f5ba063 h1:9A2FT1IDzb9E0HaEEcRMAZEVRM4SMXpklYvS6owSyIk= +gitlab.com/elixxir/comms v0.0.4-0.20210506225017-37485f5ba063/go.mod h1:KHV+lNKhcsXoor1KQizUHhCuHugnquldrAR8UU5PNKU= gitlab.com/elixxir/crypto v0.0.0-20200804182833-984246dea2c4 h1:28ftZDeYEko7xptCZzeFWS1Iam95dj46TWFVVlKmw6A= gitlab.com/elixxir/crypto v0.0.0-20200804182833-984246dea2c4/go.mod h1:ucm9SFKJo+K0N2GwRRpaNr+tKXMIOVWzmyUD0SbOu2c= gitlab.com/elixxir/crypto v0.0.3 h1:znCt/x2bL4y8czTPaaFkwzdgSgW3BJc/1+dxyf1jqVw= gitlab.com/elixxir/crypto v0.0.3/go.mod h1:ZNgBOblhYToR4m8tj4cMvJ9UsJAUKq+p0gCp07WQmhA= gitlab.com/elixxir/crypto v0.0.7-0.20210504210535-3077ddf9984d h1:E16E+gM2jJosFc8YmT2ISGxcfBThG2KAgsAcQXtxSIc= gitlab.com/elixxir/crypto v0.0.7-0.20210504210535-3077ddf9984d/go.mod h1:pbq80k+R7XXvjyWDqanD2eCJi1ClfESdKS0K8NndoLs= +gitlab.com/elixxir/crypto v0.0.7-0.20210506223047-3196e4301110 h1:4KWUbx1RI5TABBM2omWl5MLW16dwySglz895X2rhSFQ= +gitlab.com/elixxir/crypto v0.0.7-0.20210506223047-3196e4301110/go.mod h1:pbq80k+R7XXvjyWDqanD2eCJi1ClfESdKS0K8NndoLs= gitlab.com/elixxir/ekv v0.1.5 h1:R8M1PA5zRU1HVnTyrtwybdABh7gUJSCvt1JZwUSeTzk= gitlab.com/elixxir/ekv v0.1.5/go.mod h1:e6WPUt97taFZe5PFLPb1Dupk7tqmDCTQu1kkstqJvw4= gitlab.com/elixxir/primitives v0.0.0-20200731184040-494269b53b4d/go.mod h1:OQgUZq7SjnE0b+8+iIAT2eqQF+2IFHn73tOo+aV11mg= diff --git a/interfaces/IsRunning.go b/interfaces/IsRunning.go new file mode 100644 index 0000000000000000000000000000000000000000..950b842864712858b3d1dcf769f4765e5af86159 --- /dev/null +++ b/interfaces/IsRunning.go @@ -0,0 +1,8 @@ +package interfaces + +// this interface is used to allow the follower to to be stopped later if it +// fails + +type Running interface{ + IsRunning()bool +} diff --git a/network/follow.go b/network/follow.go index 83e82ec0b2e882e7b432f7bbd117a0c505713f4a..71eee53edaf362fdad6cfdeb700b74cdf96fbf94 100644 --- a/network/follow.go +++ b/network/follow.go @@ -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( diff --git a/network/manager.go b/network/manager.go index 31adb444767b544e7c6a62da9489631293dbdd8a..1cf065d691b44ca061404b426af7c26df965ca40 100644 --- a/network/manager.go +++ b/network/manager.go @@ -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 diff --git a/network/message/sendCmix.go b/network/message/sendCmix.go index 1b4f0e109ad3ea67078778c651856d299d2eb68b..2a7095843eb57c6f9af2af16ea9725fab0aac627 100644 --- a/network/message/sendCmix.go +++ b/network/message/sendCmix.go @@ -34,7 +34,7 @@ type sendCmixCommsInterface interface { } // 1.5 seconds -const sendTimeBuffer = 1500 * time.Millisecond +const sendTimeBuffer = 2500 * time.Millisecond // WARNING: Potentially Unsafe // Public manager function to send a message over CMIX diff --git a/network/message/sendUnsafe.go b/network/message/sendUnsafe.go index df7f05cb8df4ba368f3a3a19368dcb13214f7d49..19f7d5d5ce0bfe6dd14df77b76f0a21c824b2404 100644 --- a/network/message/sendUnsafe.go +++ b/network/message/sendUnsafe.go @@ -82,7 +82,7 @@ func (m *Manager) SendUnsafe(msg message.Send, param params.Unsafe) ([]id.Round, return nil, errors.Errorf("Failed to send %v/%v sub payloads:"+ " %s", numFail, len(partitions), errRtn) } else { - jww.INFO.Printf("Sucesfully Unsafe sent %d/%d to %s", + jww.INFO.Printf("Successfully Unsafe sent %d/%d to %s", len(partitions)-numFail, len(partitions), msg.Recipient) } diff --git a/stoppable/single.go b/stoppable/single.go index 8821db88eb4934a06db4f96484ef700b2c6beeff..2e8fa78a2a1c3f4f12752f045cb93c541da8412b 100644 --- a/stoppable/single.go +++ b/stoppable/single.go @@ -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 } diff --git a/storage/utility/blockStore.go b/storage/utility/blockStore.go index a405e9b966175b77f8a9803e2efbe72bf2cf27af..b29dcd12d56037d6e7d0622b1fbc47f8faea62b9 100644 --- a/storage/utility/blockStore.go +++ b/storage/utility/blockStore.go @@ -21,6 +21,7 @@ const ( const ( bsBuffLengthErr = "length of buffer %d != %d expected" bsKvSaveErr = "failed to save blockStore to KV: %+v" + bsKvInitSaveErr = "failed to save initial block: %+v" bsKvLoadErr = "failed to get BlockStore from storage: %+v" bsKvUnmarshalErr = "failed to unmarshal BlockStore loaded from storage: %+v" bJsonMarshalErr = "failed to JSON marshal block %d: %+v" @@ -218,6 +219,12 @@ func (bs *BlockStore) save() error { return errors.Errorf(bsKvSaveErr, err) } + // Save initial block + err = bs.saveBlock() + if err != nil { + return errors.Errorf(bsKvInitSaveErr, err) + } + return nil }