Define constants for version semantics

This commit is contained in:
M Essam Hamed
2025-09-01 15:13:14 +03:00
parent 84501a3f56
commit 58d48127e0
5 changed files with 46 additions and 28 deletions
+14 -9
View File
@@ -76,6 +76,9 @@ const (
PeerConnectionTimeoutMax = 45000 // ms
PeerConnectionTimeoutMin = 30000 // ms
connInitLimit = 200
// skipAutoUpdateVersion used as a placeholder for autoUpdateVersion in proto responses to indicate response contains no new updates
skipAutoUpdateVersion = "skip"
disableAutoUpdate = "disabled"
)
var ErrResetConnection = fmt.Errorf("reset connection")
@@ -704,15 +707,17 @@ func (e *Engine) handleSync(update *mgmProto.SyncResponse) error {
e.syncMsgMux.Lock()
defer e.syncMsgMux.Unlock()
if e.updateManager == nil && update.GetAutoUpdateVersion() != "disabled" {
e.updateManager = updatemanager.NewUpdateManager(e.statusRecorder)
e.updateManager.Start(e.ctx)
} else if e.updateManager != nil && update.GetAutoUpdateVersion() == "disabled" {
e.updateManager.Stop()
e.updateManager = nil
}
if e.updateManager != nil {
e.updateManager.SetVersion(update.GetAutoUpdateVersion())
if update.GetAutoUpdateVersion() != skipAutoUpdateVersion {
if e.updateManager == nil && update.GetAutoUpdateVersion() != disableAutoUpdate {
e.updateManager = updatemanager.NewUpdateManager(e.statusRecorder)
e.updateManager.Start(e.ctx)
} else if e.updateManager != nil && update.GetAutoUpdateVersion() == disableAutoUpdate {
e.updateManager.Stop()
e.updateManager = nil
}
if e.updateManager != nil {
e.updateManager.SetVersion(update.GetAutoUpdateVersion())
}
}
if update.GetNetbirdConfig() != nil {
wCfg := update.GetNetbirdConfig()
+23 -14
View File
@@ -34,8 +34,9 @@ type UpdateManager struct {
cancel context.CancelFunc
update *version.Update
expectedVersion string
expectedVersionMutex sync.Mutex
expectedVersion *v.Version
updateToLatestVersion bool
expectedVersionMutex sync.Mutex
}
func NewUpdateManager(statusRecorder *peer.Status) *UpdateManager {
@@ -69,7 +70,7 @@ func (u *UpdateManager) Start(ctx context.Context) {
go u.updateLoop(ctx)
}
func (u *UpdateManager) SetVersion(v string) {
func (u *UpdateManager) SetVersion(expectedVersion string) {
if u.cancel == nil {
log.Errorf("UpdateManager not started")
return
@@ -77,12 +78,22 @@ func (u *UpdateManager) SetVersion(v string) {
u.expectedVersionMutex.Lock()
defer u.expectedVersionMutex.Unlock()
if u.expectedVersion == v {
return
if expectedVersion == latestVersion {
u.updateToLatestVersion = true
u.expectedVersion = nil
} else {
expectedSemVer, err := v.NewVersion(expectedVersion)
if err != nil {
log.Errorf("Error parsing version: %v", err)
return
}
if u.expectedVersion.Equal(expectedSemVer) {
return
}
u.expectedVersion = expectedSemVer
u.updateToLatestVersion = false
}
u.expectedVersion = v
select {
case u.mgmUpdateChan <- struct{}{}:
default:
@@ -126,19 +137,17 @@ func (u *UpdateManager) handleUpdate(ctx context.Context) {
u.expectedVersionMutex.Unlock()
// Resolve "latest" to actual version
if expectedVersion == latestVersion {
if u.updateToLatestVersion {
if !u.isVersionAvailable() {
log.Tracef("Latest version not fetched yet")
return
}
updateVersion = u.update.LatestVersion()
} else if u.expectedVersion != nil {
updateVersion = expectedVersion
} else {
var err error
updateVersion, err = v.NewSemver(expectedVersion)
if err != nil {
log.Errorf("Failed to parse latest version: %v", err)
return
}
log.Debugf("No expected version information set")
return
}
if !u.shouldUpdate(updateVersion) {