Skip to content

Commit

Permalink
Merge pull request #551 from forta-network/make-auto-update-more-robust
Browse files Browse the repository at this point in the history
Fix auto-update panic
  • Loading branch information
canercidam committed Aug 2, 2022
2 parents 2608356 + d842324 commit 79000a6
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 28 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ require (
github.com/docker/go-connections v0.4.0
github.com/ethereum/go-ethereum v1.10.16
github.com/fatih/color v1.13.0
github.com/forta-network/forta-core-go v0.0.0-20220731203628-b95a79bc7ba3
github.com/forta-network/forta-core-go v0.0.0-20220801114911-f1eccf236e8e
github.com/go-playground/validator/v10 v10.9.0
github.com/goccy/go-json v0.9.4
github.com/golang/mock v1.6.0
Expand Down
5 changes: 2 additions & 3 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -231,8 +231,8 @@ github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYF
github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c=
github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0=
github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
github.com/forta-network/forta-core-go v0.0.0-20220731203628-b95a79bc7ba3 h1:PjVy+S5vfPeAhRDJ/ubRcKf/VO42LQYfVi30ScIV1xM=
github.com/forta-network/forta-core-go v0.0.0-20220731203628-b95a79bc7ba3/go.mod h1:EqD2jws4EyOh/jRbXHfSFHCt3dYzjnLmxxd9sUXn09A=
github.com/forta-network/forta-core-go v0.0.0-20220801114911-f1eccf236e8e h1:n8ARB7Emke7I6UI1VaYeeoaKLihreBWw3z+ekmNtQQM=
github.com/forta-network/forta-core-go v0.0.0-20220801114911-f1eccf236e8e/go.mod h1:EqD2jws4EyOh/jRbXHfSFHCt3dYzjnLmxxd9sUXn09A=
github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE=
github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
Expand Down Expand Up @@ -720,7 +720,6 @@ github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc=
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE=
github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE=
Expand Down
61 changes: 37 additions & 24 deletions services/updater/updater.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ func (updater *UpdaterService) Start() error {
updater.stopServer()
return
case <-t.C:
err := updater.updateLatestReleaseWithDelay(updater.updateCheckInterval)
err := updater.updateLatestReleaseWithDelay(updater.updateDelay)
updater.lastErr.Set(err)
updater.lastChecked.Set()
if err != nil {
Expand All @@ -134,20 +134,29 @@ func (updater *UpdaterService) updateLatestRelease() error {
}

func (updater *UpdaterService) updateLatestReleaseWithDelay(delay time.Duration) error {
if updater.developmentMode {
return updater.readLocalReleaseManifest()
}

log.Info("updating latest release")

ref, rm, err := updater.getNewerRelease(updater.latestReference)
updater.mu.RLock()
latestReference := updater.latestReference
updater.mu.RUnlock()

var (
releaseRef string
releaseManifest *release.ReleaseManifest
err error
)
if updater.developmentMode {
releaseRef, releaseManifest, err = updater.readLocalRelease(latestReference)
} else {
releaseRef, releaseManifest, err = updater.fetchNewerRelease(latestReference)
}
switch err {
case nil:
// we downloaded new release info successfully

case errNotAvailable:
log.WithFields(log.Fields{
"release": ref,
"release": releaseRef,
}).Info("no change to release")
return nil

Expand All @@ -158,32 +167,32 @@ func (updater *UpdaterService) updateLatestReleaseWithDelay(delay time.Duration)
// so that all scanners don't update simultaneously, this waits a period of time
if delay > 0 {
log.WithFields(log.Fields{
"release": ref, "delay": delay,
"release": releaseRef, "delay": delay,
}).Info("delaying update")

if foundNew := updater.checkNewerReleaseAndWait(ref, delay); foundNew {
if foundNew := updater.checkNewerReleaseAndWait(releaseRef, delay); foundNew {
log.Info("detected newer release while delaying current update - aborting")
return nil
}

log.Info("successfully waited before version update")
}

updater.latestVersion.Set(rm.Release.Version)
updater.latestVersion.Set(releaseManifest.Release.Version)
updater.latestIsPrerelease.Set(strconv.FormatBool(updater.trackPrereleases))

updater.mu.Lock()
defer updater.mu.Unlock()
updater.latestRelease = rm
updater.latestReference = ref
updater.latestRelease = releaseManifest
updater.latestReference = releaseRef
log.WithFields(log.Fields{
"release": ref,
"release": releaseRef,
}).Info("updating to release")

return nil
}

func (updater *UpdaterService) getNewerRelease(previousRef string) (string, *release.ReleaseManifest, error) {
func (updater *UpdaterService) fetchNewerRelease(previousRef string) (string, *release.ReleaseManifest, error) {
ref, err := updater.compareScannerNodeVersion(previousRef)
if err != nil {
return ref, nil, err
Expand All @@ -197,6 +206,11 @@ func (updater *UpdaterService) getNewerRelease(previousRef string) (string, *rel
}

func (updater *UpdaterService) compareScannerNodeVersion(previousRef string) (newRef string, err error) {
if updater.developmentMode {
newRef, _, err = updater.readLocalRelease(previousRef)
return
}

var ref string
if updater.trackPrereleases {
ref, err = updater.registryClient.GetScannerNodePrereleaseVersion()
Expand All @@ -215,7 +229,6 @@ func (updater *UpdaterService) compareScannerNodeVersion(previousRef string) (ne

func (updater *UpdaterService) checkNewerReleaseAndWait(previousRef string, delay time.Duration) (foundNew bool) {
detectedCh := make(chan struct{})
defer close(detectedCh)

ctx, cancel := context.WithCancel(updater.ctx)
defer cancel()
Expand Down Expand Up @@ -246,22 +259,22 @@ func (updater *UpdaterService) detectNewerRelease(ctx context.Context, previousR
}
}

func (updater *UpdaterService) readLocalReleaseManifest() error {
b, err := ioutil.ReadFile(path.Join(config.DefaultContainerFortaDirPath, "test-release.json"))
func (updater *UpdaterService) readLocalRelease(previousRef string) (string, *release.ReleaseManifest, error) {
b, err := ioutil.ReadFile(path.Join(config.DefaultContainerFortaDirPath, "local-release.json"))
if err != nil {
log.WithError(err).Info("could not read the test release manifest file - ignoring error")
return nil
return "", nil, err
}
var release release.ReleaseManifest
if err := json.Unmarshal(b, &release); err != nil {
log.WithError(err).Info("could not unmarshal the test release manifest - ignoring error")
return nil
return "", nil, err
}
updater.mu.Lock()
defer updater.mu.Unlock()
updater.latestReference = "test-release.json"
updater.latestRelease = &release
return nil
currentRef := release.Release.Commit // use commit as ref (dev mode hack)
if currentRef == previousRef {
return currentRef, nil, errNotAvailable
}
return currentRef, &release, nil
}

// Name returns the name of the service.
Expand Down

0 comments on commit 79000a6

Please sign in to comment.