Skip to content

Commit f8a9ffa

Browse files
committed
bootstrap etcd from consistent_index
Signed-off-by: Benjamin Wang <benjamin.ahrtr@gmail.com>
1 parent a8884c7 commit f8a9ffa

File tree

20 files changed

+218
-570
lines changed

20 files changed

+218
-570
lines changed

contrib/raftexample/raft.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -230,12 +230,8 @@ func (rc *raftNode) openWAL(snapshot *raftpb.Snapshot) *wal.WAL {
230230
w.Close()
231231
}
232232

233-
walsnap := walpb.Snapshot{}
234-
if snapshot != nil {
235-
walsnap.Index, walsnap.Term = snapshot.Metadata.Index, snapshot.Metadata.Term
236-
}
237-
log.Printf("loading WAL at term %d and index %d", walsnap.Term, walsnap.Index)
238-
w, err := wal.Open(zap.NewExample(), rc.waldir, walsnap)
233+
log.Printf("loading WAL at term %d and index %d", snapshot.Metadata.Term, snapshot.Metadata.Index)
234+
w, err := wal.Open(zap.NewExample(), rc.waldir, snapshot.Metadata.Index)
239235
if err != nil {
240236
log.Fatalf("raftexample: error loading wal (%v)", err)
241237
}

etcdutl/etcdutl/common.go

Lines changed: 7 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,16 @@
1515
package etcdutl
1616

1717
import (
18-
"errors"
1918
"time"
2019

2120
"go.uber.org/zap"
2221
"go.uber.org/zap/zapcore"
2322

2423
"go.etcd.io/etcd/client/pkg/v3/logutil"
2524
"go.etcd.io/etcd/pkg/v3/cobrautl"
26-
"go.etcd.io/etcd/server/v3/etcdserver/api/snap"
25+
"go.etcd.io/etcd/server/v3/storage/backend"
2726
"go.etcd.io/etcd/server/v3/storage/datadir"
28-
"go.etcd.io/etcd/server/v3/storage/wal"
29-
"go.etcd.io/etcd/server/v3/storage/wal/walpb"
30-
"go.etcd.io/raft/v3/raftpb"
27+
"go.etcd.io/etcd/server/v3/storage/schema"
3128
)
3229

3330
// FlockTimeout is the duration to wait to obtain a file lock on db file.
@@ -44,31 +41,10 @@ func GetLogger() *zap.Logger {
4441
return lg
4542
}
4643

47-
func getLatestWALSnap(lg *zap.Logger, dataDir string) (walpb.Snapshot, error) {
48-
snapshot, err := getLatestV2Snapshot(lg, dataDir)
49-
if err != nil {
50-
return walpb.Snapshot{}, err
51-
}
52-
53-
var walsnap walpb.Snapshot
54-
if snapshot != nil {
55-
walsnap.Index, walsnap.Term = snapshot.Metadata.Index, snapshot.Metadata.Term
56-
}
57-
return walsnap, nil
58-
}
59-
60-
func getLatestV2Snapshot(lg *zap.Logger, dataDir string) (*raftpb.Snapshot, error) {
61-
walPath := datadir.ToWALDir(dataDir)
62-
walSnaps, err := wal.ValidSnapshotEntries(lg, walPath)
63-
if err != nil {
64-
return nil, err
65-
}
66-
67-
ss := snap.New(lg, datadir.ToSnapDir(dataDir))
68-
snapshot, err := ss.LoadNewestAvailable(walSnaps)
69-
if err != nil && !errors.Is(err, snap.ErrNoSnapshot) {
70-
return nil, err
71-
}
44+
func getConsistentIndex(lg *zap.Logger, dataDir string) uint64 {
45+
be := backend.NewDefaultBackend(lg, datadir.ToBackendFileName(dataDir))
46+
defer be.Close()
7247

73-
return snapshot, nil
48+
consistentIdx, _ := schema.ReadConsistentIndex(be.ReadTx())
49+
return consistentIdx
7450
}

etcdutl/etcdutl/common_test.go

Lines changed: 0 additions & 143 deletions
This file was deleted.

etcdutl/etcdutl/migrate_command.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -104,11 +104,8 @@ type migrateConfig struct {
104104

105105
func (c *migrateConfig) finalize() error {
106106
walPath := datadir.ToWALDir(c.dataDir)
107-
walSnap, err := getLatestWALSnap(c.lg, c.dataDir)
108-
if err != nil {
109-
return fmt.Errorf("failed to get the lastest snapshot: %w", err)
110-
}
111-
w, err := wal.OpenForRead(c.lg, walPath, walSnap)
107+
consistentIdx := getConsistentIndex(c.lg, c.dataDir)
108+
w, err := wal.OpenForRead(c.lg, walPath, consistentIdx)
112109
if err != nil {
113110
return fmt.Errorf(`failed to open wal: %w`, err)
114111
}

server/etcdserver/api/membership/storev2.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ func mustSaveMemberToStore(lg *zap.Logger, s v2store.Store, m *Member) {
128128
}
129129
p := path.Join(MemberStoreKey(m.ID), raftAttributesSuffix)
130130
if _, err := s.Create(p, false, string(b), false, v2store.TTLOptionSet{ExpireTime: v2store.Permanent}); err != nil {
131-
lg.Panic(
131+
lg.Error(
132132
"failed to save member to store",
133133
zap.String("path", p),
134134
zap.Error(err),
@@ -138,7 +138,7 @@ func mustSaveMemberToStore(lg *zap.Logger, s v2store.Store, m *Member) {
138138

139139
func mustDeleteMemberFromStore(lg *zap.Logger, s v2store.Store, id types.ID) {
140140
if _, err := s.Delete(MemberStoreKey(id), true, true); err != nil {
141-
lg.Panic(
141+
lg.Error(
142142
"failed to delete member from store",
143143
zap.String("path", MemberStoreKey(id)),
144144
zap.Error(err),
@@ -150,7 +150,7 @@ func mustDeleteMemberFromStore(lg *zap.Logger, s v2store.Store, id types.ID) {
150150

151151
func mustAddToRemovedMembersInStore(lg *zap.Logger, s v2store.Store, id types.ID) {
152152
if _, err := s.Create(RemovedMemberStoreKey(id), false, "", false, v2store.TTLOptionSet{ExpireTime: v2store.Permanent}); err != nil {
153-
lg.Panic(
153+
lg.Error(
154154
"failed to create removedMember",
155155
zap.String("path", RemovedMemberStoreKey(id)),
156156
zap.Error(err),
@@ -165,7 +165,7 @@ func mustUpdateMemberInStore(lg *zap.Logger, s v2store.Store, m *Member) {
165165
}
166166
p := path.Join(MemberStoreKey(m.ID), raftAttributesSuffix)
167167
if _, err := s.Update(p, string(b), v2store.TTLOptionSet{ExpireTime: v2store.Permanent}); err != nil {
168-
lg.Panic(
168+
lg.Error(
169169
"failed to update raftAttributes",
170170
zap.String("path", p),
171171
zap.Error(err),
@@ -180,7 +180,7 @@ func mustUpdateMemberAttrInStore(lg *zap.Logger, s v2store.Store, m *Member) {
180180
}
181181
p := path.Join(MemberStoreKey(m.ID), attributesSuffix)
182182
if _, err := s.Set(p, false, string(b), v2store.TTLOptionSet{ExpireTime: v2store.Permanent}); err != nil {
183-
lg.Panic(
183+
lg.Error(
184184
"failed to update attributes",
185185
zap.String("path", p),
186186
zap.Error(err),
@@ -190,7 +190,7 @@ func mustUpdateMemberAttrInStore(lg *zap.Logger, s v2store.Store, m *Member) {
190190

191191
func mustSaveClusterVersionToStore(lg *zap.Logger, s v2store.Store, ver *semver.Version) {
192192
if _, err := s.Set(StoreClusterVersionKey(), false, ver.String(), v2store.TTLOptionSet{ExpireTime: v2store.Permanent}); err != nil {
193-
lg.Panic(
193+
lg.Error(
194194
"failed to save cluster version to store",
195195
zap.String("path", StoreClusterVersionKey()),
196196
zap.Error(err),

0 commit comments

Comments
 (0)