From b6967db01e813eff1ccea29ca0535b8a19cacad4 Mon Sep 17 00:00:00 2001 From: fykaa Date: Sun, 19 May 2024 12:58:02 +0530 Subject: [PATCH 1/2] etcdutl: reading from last snapshot in migrate command To improve correctness of etcdutl migrate command Signed-off-by: fykaa --- etcdutl/etcdutl/migrate_command.go | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/etcdutl/etcdutl/migrate_command.go b/etcdutl/etcdutl/migrate_command.go index 154ba466a..2db726493 100644 --- a/etcdutl/etcdutl/migrate_command.go +++ b/etcdutl/etcdutl/migrate_command.go @@ -95,7 +95,11 @@ func (o *migrateOptions) Config() (*migrateConfig, error) { c.be = backend.NewDefaultBackend(GetLogger(), dbPath) walPath := datadir.ToWALDir(o.dataDir) - w, err := wal.OpenForRead(c.lg, walPath, walpb.Snapshot{}) + lastSnapshot, err := getLastSnapshotIndex(walPath) + if err != nil { + return nil, fmt.Errorf(`failed to find last snapshot: %v`, err) + } + w, err := wal.OpenForRead(c.lg, walPath, walpb.Snapshot{Index: lastSnapshot}) if err != nil { return nil, fmt.Errorf(`failed to open wal: %v`, err) } @@ -156,3 +160,16 @@ func migrateForce(lg *zap.Logger, tx backend.BatchTx, target *semver.Version) { func storageVersionToString(ver *semver.Version) string { return fmt.Sprintf("%d.%d", ver.Major, ver.Minor) } + +func getLastSnapshotIndex(walPath string) (uint64, error) { + walSnaps, err := wal.ValidSnapshotEntries(nil, walPath) + if err != nil { + return 0, err + } + if len(walSnaps) == 0 { + return 0, fmt.Errorf("no valid snapshot entries found") + } + + snapshot := walSnaps[len(walSnaps)-1] + return snapshot.Index, nil +} From 3815ab0ce9d760d6282607cf75b45685890d0859 Mon Sep 17 00:00:00 2001 From: fykaa Date: Wed, 29 May 2024 16:06:42 +0530 Subject: [PATCH 2/2] etcdutl: include for lastsnapshot Signed-off-by: fykaa --- etcdutl/etcdutl/migrate_command.go | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/etcdutl/etcdutl/migrate_command.go b/etcdutl/etcdutl/migrate_command.go index 2db726493..4880ae935 100644 --- a/etcdutl/etcdutl/migrate_command.go +++ b/etcdutl/etcdutl/migrate_command.go @@ -95,11 +95,11 @@ func (o *migrateOptions) Config() (*migrateConfig, error) { c.be = backend.NewDefaultBackend(GetLogger(), dbPath) walPath := datadir.ToWALDir(o.dataDir) - lastSnapshot, err := getLastSnapshotIndex(walPath) + lastSnapshot, err := getLastSnapshot(c.lg, walPath) if err != nil { - return nil, fmt.Errorf(`failed to find last snapshot: %v`, err) + c.lg.Warn("failed to find last snapshot, falling back to beginning of wal", zap.Error(err)) } - w, err := wal.OpenForRead(c.lg, walPath, walpb.Snapshot{Index: lastSnapshot}) + w, err := wal.OpenForRead(c.lg, walPath, lastSnapshot) if err != nil { return nil, fmt.Errorf(`failed to open wal: %v`, err) } @@ -161,15 +161,13 @@ func storageVersionToString(ver *semver.Version) string { return fmt.Sprintf("%d.%d", ver.Major, ver.Minor) } -func getLastSnapshotIndex(walPath string) (uint64, error) { - walSnaps, err := wal.ValidSnapshotEntries(nil, walPath) +func getLastSnapshot(lg *zap.Logger, walPath string) (walpb.Snapshot, error) { + walSnaps, err := wal.ValidSnapshotEntries(lg, walPath) if err != nil { - return 0, err + return walpb.Snapshot{}, err } if len(walSnaps) == 0 { - return 0, fmt.Errorf("no valid snapshot entries found") + return walpb.Snapshot{}, fmt.Errorf("no valid snapshot entries found") } - - snapshot := walSnaps[len(walSnaps)-1] - return snapshot.Index, nil + return walSnaps[len(walSnaps)-1], nil }