Config: Refactor version packages (#1887)

* Config: Move config versions to separate pacakges

* Config: Move version tests to blackbox texts

* Config: Protect registerVersion from overflow

* Config: Protect against version already registered
This commit is contained in:
Gareth Kirwan
2025-04-22 04:13:01 +02:00
committed by GitHub
parent 545fa9d01a
commit 1bf3433d61
19 changed files with 254 additions and 153 deletions

View File

@@ -32,6 +32,7 @@ const UseLatestVersion = math.MaxUint16
var (
errVersionIncompatible = errors.New("version does not implement ConfigVersion or ExchangeVersion")
errAlreadyRegistered = errors.New("version is already registered")
errModifyingExchange = errors.New("error modifying exchange config")
errNoVersions = errors.New("error retrieving latest config version: No config versions are registered")
errApplyingVersion = errors.New("error applying version")
@@ -40,7 +41,6 @@ var (
errConfigVersionUnavail = errors.New("version is higher than the latest available version")
errConfigVersionNegative = errors.New("version is negative")
errConfigVersionMax = errors.New("version is above max versions")
errUpgrading = errors.New("error upgrading")
)
// ConfigVersion is a version that affects the general configuration
@@ -211,15 +211,28 @@ func exchangeDeploy(ctx context.Context, patch ExchangeVersion, method func(Exch
}
// registerVersion takes instances of config versions and adds them to the registry
func (m *manager) registerVersion(ver int, v any) {
func (m *manager) registerVersion(ver uint16, v any) {
m.m.Lock()
defer m.m.Unlock()
if ver >= len(m.versions) {
m.versions = slices.Grow(m.versions, ver+1)[:ver+1]
if int(ver) >= len(m.versions) {
m.versions = slices.Grow(m.versions, int(ver+1))[:ver+1]
}
if m.versions[ver] != nil {
panic(fmt.Errorf("%w: %d", errAlreadyRegistered, ver))
}
m.versions[ver] = v
}
// Version returns a version registered by init or nil if nothing has been registered with that version number
func (m *manager) Version(version uint16) any {
m.m.RLock()
defer m.m.RUnlock()
if int(version) < len(m.versions) {
return m.versions[version]
}
return nil
}
// latest returns the highest version number
func (m *manager) latest() (uint16, error) {
m.m.RLock()