Minor refactor on the etcdutl migrate command

Signed-off-by: Benjamin Wang <benjamin.ahrtr@gmail.com>
This commit is contained in:
Benjamin Wang 2025-01-16 13:24:38 +00:00
parent 92673d196c
commit 39ccd99efb

View File

@ -75,6 +75,7 @@ func (o *migrateOptions) AddFlags(cmd *cobra.Command) {
func (o *migrateOptions) Config() (*migrateConfig, error) { func (o *migrateOptions) Config() (*migrateConfig, error) {
c := &migrateConfig{ c := &migrateConfig{
force: o.force, force: o.force,
dataDir: o.dataDir,
lg: GetLogger(), lg: GetLogger(),
} }
var err error var err error
@ -90,39 +91,43 @@ func (o *migrateOptions) Config() (*migrateConfig, error) {
return nil, fmt.Errorf(`target version %q not supported. Minimal "3.5"`, storageVersionToString(c.targetVersion)) return nil, fmt.Errorf(`target version %q not supported. Minimal "3.5"`, storageVersionToString(c.targetVersion))
} }
dbPath := datadir.ToBackendFileName(o.dataDir)
c.be = backend.NewDefaultBackend(GetLogger(), dbPath)
walPath := datadir.ToWALDir(o.dataDir)
walSnap, err := getLatestWALSnap(c.lg, o.dataDir)
if err != nil {
return nil, fmt.Errorf("failed to get the lastest snapshot: %w", err)
}
w, err := wal.OpenForRead(c.lg, walPath, walSnap)
if err != nil {
return nil, fmt.Errorf(`failed to open wal: %w`, err)
}
defer w.Close()
c.walVersion, err = wal.ReadWALVersion(w)
if err != nil {
return nil, fmt.Errorf(`failed to read wal: %w`, err)
}
return c, nil return c, nil
} }
type migrateConfig struct { type migrateConfig struct {
lg *zap.Logger lg *zap.Logger
be backend.Backend
targetVersion *semver.Version targetVersion *semver.Version
walVersion schema.WALVersion walVersion schema.WALVersion
dataDir string
force bool force bool
} }
func (c *migrateConfig) finalize() error {
walPath := datadir.ToWALDir(c.dataDir)
walSnap, err := getLatestWALSnap(c.lg, c.dataDir)
if err != nil {
return fmt.Errorf("failed to get the lastest snapshot: %w", err)
}
w, err := wal.OpenForRead(c.lg, walPath, walSnap)
if err != nil {
return fmt.Errorf(`failed to open wal: %w`, err)
}
defer w.Close()
c.walVersion, err = wal.ReadWALVersion(w)
if err != nil {
return fmt.Errorf(`failed to read wal: %w`, err)
}
return nil
}
func migrateCommandFunc(c *migrateConfig) error { func migrateCommandFunc(c *migrateConfig) error {
defer c.be.Close() dbPath := datadir.ToBackendFileName(c.dataDir)
tx := c.be.BatchTx() be := backend.NewDefaultBackend(GetLogger(), dbPath)
current, err := schema.DetectSchemaVersion(c.lg, c.be.ReadTx()) defer be.Close()
tx := be.BatchTx()
current, err := schema.DetectSchemaVersion(c.lg, be.ReadTx())
if err != nil { if err != nil {
c.lg.Error("failed to detect storage version. Please make sure you are using data dir from etcd v3.5 and older") c.lg.Error("failed to detect storage version. Please make sure you are using data dir from etcd v3.5 and older")
return err return err
@ -131,6 +136,12 @@ func migrateCommandFunc(c *migrateConfig) error {
c.lg.Info("storage version up-to-date", zap.String("storage-version", storageVersionToString(&current))) c.lg.Info("storage version up-to-date", zap.String("storage-version", storageVersionToString(&current)))
return nil return nil
} }
if err = c.finalize(); err != nil {
c.lg.Error("Failed to finalize config", zap.Error(err))
return err
}
err = schema.Migrate(c.lg, tx, c.walVersion, *c.targetVersion) err = schema.Migrate(c.lg, tx, c.walVersion, *c.targetVersion)
if err != nil { if err != nil {
if !c.force { if !c.force {
@ -139,7 +150,7 @@ func migrateCommandFunc(c *migrateConfig) error {
c.lg.Info("normal migrate failed, trying with force", zap.Error(err)) c.lg.Info("normal migrate failed, trying with force", zap.Error(err))
migrateForce(c.lg, tx, c.targetVersion) migrateForce(c.lg, tx, c.targetVersion)
} }
c.be.ForceCommit() be.ForceCommit()
return nil return nil
} }