mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
functional/rpcpb: implement "RestoreSnapshot"
Signed-off-by: Gyuho Lee <gyuhox@gmail.com>
This commit is contained in:
parent
a44a88ce79
commit
b2b37928e3
@ -24,6 +24,7 @@ import (
|
|||||||
"github.com/coreos/etcd/clientv3"
|
"github.com/coreos/etcd/clientv3"
|
||||||
pb "github.com/coreos/etcd/etcdserver/etcdserverpb"
|
pb "github.com/coreos/etcd/etcdserver/etcdserverpb"
|
||||||
"github.com/coreos/etcd/pkg/transport"
|
"github.com/coreos/etcd/pkg/transport"
|
||||||
|
"github.com/coreos/etcd/pkg/types"
|
||||||
"github.com/coreos/etcd/snapshot"
|
"github.com/coreos/etcd/snapshot"
|
||||||
|
|
||||||
"github.com/dustin/go-humanize"
|
"github.com/dustin/go-humanize"
|
||||||
@ -232,8 +233,10 @@ func (m *Member) WriteHealthKey() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// FetchSnapshot downloads a snapshot file from this member.
|
// SaveSnapshot downloads a snapshot file from this member, locally.
|
||||||
func (m *Member) FetchSnapshot(lg *zap.Logger) (err error) {
|
// It's meant to requested remotely, so that local member can store
|
||||||
|
// snapshot file on local disk.
|
||||||
|
func (m *Member) SaveSnapshot(lg *zap.Logger) (err error) {
|
||||||
// remove existing snapshot first
|
// remove existing snapshot first
|
||||||
if err = os.Remove(m.SnapshotPath); err != nil {
|
if err = os.Remove(m.SnapshotPath); err != nil {
|
||||||
return err
|
return err
|
||||||
@ -246,6 +249,12 @@ func (m *Member) FetchSnapshot(lg *zap.Logger) (err error) {
|
|||||||
}
|
}
|
||||||
defer cli.Close()
|
defer cli.Close()
|
||||||
|
|
||||||
|
lg.Info(
|
||||||
|
"snapshot save START",
|
||||||
|
zap.String("member-name", m.Etcd.Name),
|
||||||
|
zap.Strings("member-client-urls", m.Etcd.AdvertiseClientURLs),
|
||||||
|
zap.String("snapshot-path", m.SnapshotPath),
|
||||||
|
)
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
mgr := snapshot.NewV3(cli, lg)
|
mgr := snapshot.NewV3(cli, lg)
|
||||||
if err = mgr.Save(context.Background(), m.SnapshotPath); err != nil {
|
if err = mgr.Save(context.Background(), m.SnapshotPath); err != nil {
|
||||||
@ -258,13 +267,11 @@ func (m *Member) FetchSnapshot(lg *zap.Logger) (err error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
var st snapshot.Status
|
var st snapshot.Status
|
||||||
st, err = mgr.Status(m.SnapshotPath)
|
st, err = mgr.Status(m.SnapshotPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
m.SnapshotInfo = &SnapshotInfo{
|
m.SnapshotInfo = &SnapshotInfo{
|
||||||
MemberName: m.Etcd.Name,
|
MemberName: m.Etcd.Name,
|
||||||
MemberClientURLs: m.Etcd.AdvertiseClientURLs,
|
MemberClientURLs: m.Etcd.AdvertiseClientURLs,
|
||||||
@ -277,7 +284,7 @@ func (m *Member) FetchSnapshot(lg *zap.Logger) (err error) {
|
|||||||
Took: fmt.Sprintf("%v", took),
|
Took: fmt.Sprintf("%v", took),
|
||||||
}
|
}
|
||||||
lg.Info(
|
lg.Info(
|
||||||
"snapshot saved",
|
"snapshot save END",
|
||||||
zap.String("member-name", m.SnapshotInfo.MemberName),
|
zap.String("member-name", m.SnapshotInfo.MemberName),
|
||||||
zap.Strings("member-client-urls", m.SnapshotInfo.MemberClientURLs),
|
zap.Strings("member-client-urls", m.SnapshotInfo.MemberClientURLs),
|
||||||
zap.String("snapshot-path", m.SnapshotPath),
|
zap.String("snapshot-path", m.SnapshotPath),
|
||||||
@ -290,3 +297,61 @@ func (m *Member) FetchSnapshot(lg *zap.Logger) (err error) {
|
|||||||
)
|
)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RestoreSnapshot restores a cluster from a given snapshot file on disk.
|
||||||
|
// It's meant to requested remotely, so that local member can load the
|
||||||
|
// snapshot file from local disk.
|
||||||
|
func (m *Member) RestoreSnapshot(lg *zap.Logger) (err error) {
|
||||||
|
if err = os.RemoveAll(m.EtcdOnSnapshotRestore.DataDir); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err = os.RemoveAll(m.EtcdOnSnapshotRestore.WALDir); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
var initialCluster types.URLsMap
|
||||||
|
initialCluster, err = types.NewURLsMap(m.EtcdOnSnapshotRestore.InitialCluster)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var peerURLs types.URLs
|
||||||
|
peerURLs, err = types.NewURLs(m.EtcdOnSnapshotRestore.AdvertisePeerURLs)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
lg.Info(
|
||||||
|
"snapshot restore START",
|
||||||
|
zap.String("member-name", m.Etcd.Name),
|
||||||
|
zap.Strings("member-client-urls", m.Etcd.AdvertiseClientURLs),
|
||||||
|
zap.String("snapshot-path", m.SnapshotPath),
|
||||||
|
)
|
||||||
|
now := time.Now()
|
||||||
|
mgr := snapshot.NewV3(nil, lg)
|
||||||
|
err = mgr.Restore(m.SnapshotInfo.SnapshotPath, snapshot.RestoreConfig{
|
||||||
|
Name: m.EtcdOnSnapshotRestore.Name,
|
||||||
|
OutputDataDir: m.EtcdOnSnapshotRestore.DataDir,
|
||||||
|
OutputWALDir: m.EtcdOnSnapshotRestore.WALDir,
|
||||||
|
InitialCluster: initialCluster,
|
||||||
|
InitialClusterToken: m.EtcdOnSnapshotRestore.InitialClusterToken,
|
||||||
|
PeerURLs: peerURLs,
|
||||||
|
SkipHashCheck: false,
|
||||||
|
|
||||||
|
// TODO: SkipHashCheck == true, for recover from existing db file
|
||||||
|
})
|
||||||
|
took := time.Since(now)
|
||||||
|
lg.Info(
|
||||||
|
"snapshot restore END",
|
||||||
|
zap.String("member-name", m.SnapshotInfo.MemberName),
|
||||||
|
zap.Strings("member-client-urls", m.SnapshotInfo.MemberClientURLs),
|
||||||
|
zap.String("snapshot-path", m.SnapshotPath),
|
||||||
|
zap.String("snapshot-file-size", m.SnapshotInfo.SnapshotFileSize),
|
||||||
|
zap.String("snapshot-total-size", m.SnapshotInfo.SnapshotTotalSize),
|
||||||
|
zap.Int64("snapshot-total-key", m.SnapshotInfo.SnapshotTotalKey),
|
||||||
|
zap.Int64("snapshot-hash", m.SnapshotInfo.SnapshotHash),
|
||||||
|
zap.Int64("snapshot-revision", m.SnapshotInfo.SnapshotRevision),
|
||||||
|
zap.String("took", took.String()),
|
||||||
|
zap.Error(err),
|
||||||
|
)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user