diff --git a/server/etcdserver/bootstrap.go b/server/etcdserver/bootstrap.go index d0f95f4c448..4251cf71bd6 100644 --- a/server/etcdserver/bootstrap.go +++ b/server/etcdserver/bootstrap.go @@ -100,6 +100,7 @@ func bootstrap(cfg config.ServerConfig) (b *bootstrappedServer, err error) { if terr := fileutil.TouchDirAll(cfg.MemberDir()); terr != nil { return nil, fmt.Errorf("cannot access member directory: %v", terr) } + boostrapStorageSchema(cfg.Logger, be) b.prt = prt b.ci = ci b.st = st @@ -340,6 +341,14 @@ func bootstrapWithWAL(cfg config.ServerConfig, st v2store.Store, be backend.Back return r, nil } +func boostrapStorageSchema(lg *zap.Logger, be backend.Backend) { + err := schema.UpdateStorageSchema(lg, be.BatchTx()) + if err != nil { + // Can fail as it requires all fields to be set. Fields introduced in v3.5 will be set only after snapshot. + lg.Warn("failed to update storage version, will try again after first wal snapshot", zap.Error(err)) + } +} + func bootstrapRaftFromCluster(cfg config.ServerConfig, cl *membership.RaftCluster, ids []types.ID) *bootstrappedRaft { member := cl.MemberByName(cfg.Name) id := member.ID diff --git a/server/etcdserver/server.go b/server/etcdserver/server.go index 2a595b45104..6c20e6dea09 100644 --- a/server/etcdserver/server.go +++ b/server/etcdserver/server.go @@ -2136,6 +2136,8 @@ func (s *EtcdServer) snapshot(snapi uint64, confState raftpb.ConfState) { "saved snapshot", zap.Uint64("snapshot-index", snap.Metadata.Index), ) + // Update storage schema after snapshot as fields introduced in v3.5 should be set. + // Remove in v3.7 s.updateStorageSchema.Do(func() { err := schema.UpdateStorageSchema(s.lg, s.be.BatchTx()) if err != nil {