From 3c85b67f7bad14c77ab3b1db707a24a449271de8 Mon Sep 17 00:00:00 2001 From: tangcong Date: Sun, 12 Apr 2020 00:09:17 +0800 Subject: [PATCH 1/3] etcdserver: remove redundant storage restore operation --- etcdserver/backend.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/etcdserver/backend.go b/etcdserver/backend.go index a60a9d196..637edbfd2 100644 --- a/etcdserver/backend.go +++ b/etcdserver/backend.go @@ -21,8 +21,6 @@ import ( "go.etcd.io/etcd/etcdserver/api/snap" "go.etcd.io/etcd/etcdserver/cindex" - "go.etcd.io/etcd/lease" - "go.etcd.io/etcd/mvcc" "go.etcd.io/etcd/mvcc/backend" "go.etcd.io/etcd/raft/raftpb" @@ -96,9 +94,7 @@ func openBackend(cfg ServerConfig) backend.Backend { // case, replace the db with the snapshot db sent by the leader. func recoverSnapshotBackend(cfg ServerConfig, oldbe backend.Backend, snapshot raftpb.Snapshot) (backend.Backend, error) { ci := cindex.NewConsistentIndex(oldbe.BatchTx()) - kv := mvcc.New(cfg.Logger, oldbe, &lease.FakeLessor{}, ci, mvcc.StoreConfig{CompactionBatchLimit: cfg.CompactionBatchLimit}) - defer kv.Close() - if snapshot.Metadata.Index <= kv.ConsistentIndex() { + if snapshot.Metadata.Index <= ci.ConsistentIndex() { return oldbe, nil } oldbe.Close() From 3e6426198f6ca3e84ffd21c115d239677c07fcdc Mon Sep 17 00:00:00 2001 From: tangcong Date: Sun, 12 Apr 2020 00:35:12 +0800 Subject: [PATCH 2/3] CHANGELOG: update for 11779 --- CHANGELOG-3.5.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG-3.5.md b/CHANGELOG-3.5.md index de995339a..b258de30c 100644 --- a/CHANGELOG-3.5.md +++ b/CHANGELOG-3.5.md @@ -102,6 +102,8 @@ Note that any `etcd_debugging_*` metrics are experimental and subject to change. - [Refactor consistentindex](https://github.com/etcd-io/etcd/pull/11699). - [Add log when etcdserver failed to apply command](https://github.com/etcd-io/etcd/pull/11670). - Improve [count-only range performance](https://github.com/etcd-io/etcd/pull/11771). +- Remove [redundant storage restore operation to shorten the startup time](https://github.com/etcd-io/etcd/pull/11779). + - With 40 million key test data,it can shorten the startup time from 5 min to 2.5 min. ### Package `embed` From 6c41190bc592873dc842b4d4fd2ecef6358746a9 Mon Sep 17 00:00:00 2001 From: tangcong Date: Fri, 17 Apr 2020 09:30:22 +0800 Subject: [PATCH 3/3] etcdserver: make recoverSnapshotBackend more robust --- etcdserver/backend.go | 10 +++++++--- etcdserver/server.go | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/etcdserver/backend.go b/etcdserver/backend.go index 637edbfd2..50ed9bea7 100644 --- a/etcdserver/backend.go +++ b/etcdserver/backend.go @@ -92,9 +92,13 @@ func openBackend(cfg ServerConfig) backend.Backend { // before updating the backend db after persisting raft snapshot to disk, // violating the invariant snapshot.Metadata.Index < db.consistentIndex. In this // case, replace the db with the snapshot db sent by the leader. -func recoverSnapshotBackend(cfg ServerConfig, oldbe backend.Backend, snapshot raftpb.Snapshot) (backend.Backend, error) { - ci := cindex.NewConsistentIndex(oldbe.BatchTx()) - if snapshot.Metadata.Index <= ci.ConsistentIndex() { +func recoverSnapshotBackend(cfg ServerConfig, oldbe backend.Backend, snapshot raftpb.Snapshot, beExist bool) (backend.Backend, error) { + consistentIndex := uint64(0) + if beExist { + ci := cindex.NewConsistentIndex(oldbe.BatchTx()) + consistentIndex = ci.ConsistentIndex() + } + if snapshot.Metadata.Index <= consistentIndex { return oldbe, nil } oldbe.Close() diff --git a/etcdserver/server.go b/etcdserver/server.go index da7fd7fd3..bae7797b2 100644 --- a/etcdserver/server.go +++ b/etcdserver/server.go @@ -428,7 +428,7 @@ func NewServer(cfg ServerConfig) (srv *EtcdServer, err error) { zap.String("snapshot-size", humanize.Bytes(uint64(snapshot.Size()))), ) - if be, err = recoverSnapshotBackend(cfg, be, *snapshot); err != nil { + if be, err = recoverSnapshotBackend(cfg, be, *snapshot, beExist); err != nil { cfg.Logger.Panic("failed to recover v3 backend from snapshot", zap.Error(err)) } s1, s2 := be.Size(), be.SizeInUse()