|
|
@@ -17,9 +17,6 @@ import (
|
|
|
"github.com/coreos/etcd/pkg/transport"
|
|
|
"github.com/coreos/etcd/proxy"
|
|
|
"github.com/coreos/etcd/raft"
|
|
|
- "github.com/coreos/etcd/snap"
|
|
|
- "github.com/coreos/etcd/store"
|
|
|
- "github.com/coreos/etcd/wal"
|
|
|
)
|
|
|
|
|
|
const (
|
|
|
@@ -33,7 +30,7 @@ var (
|
|
|
name = flag.String("name", "default", "Unique human-readable name for this node")
|
|
|
timeout = flag.Duration("timeout", 10*time.Second, "Request Timeout")
|
|
|
dir = flag.String("data-dir", "", "Path to the data directory")
|
|
|
- snapCount = flag.Int64("snapshot-count", etcdserver.DefaultSnapCount, "Number of committed transactions to trigger a snapshot")
|
|
|
+ snapCount = flag.Uint64("snapshot-count", etcdserver.DefaultSnapCount, "Number of committed transactions to trigger a snapshot")
|
|
|
printVersion = flag.Bool("version", false, "Print the version and exit")
|
|
|
|
|
|
cluster = &etcdserver.Cluster{}
|
|
|
@@ -125,93 +122,42 @@ func startEtcd() {
|
|
|
log.Fatalf("etcd: cannot use None(%d) as member id", raft.None)
|
|
|
}
|
|
|
|
|
|
- if *snapCount <= 0 {
|
|
|
- log.Fatalf("etcd: snapshot-count must be greater than 0: snapshot-count=%d", *snapCount)
|
|
|
- }
|
|
|
-
|
|
|
if *dir == "" {
|
|
|
*dir = fmt.Sprintf("%v_etcd_data", self.ID)
|
|
|
- log.Printf("main: no data-dir is given, using default data-dir ./%s", *dir)
|
|
|
+ log.Printf("main: no data-dir provided, using default data-dir ./%s", *dir)
|
|
|
}
|
|
|
if err := os.MkdirAll(*dir, privateDirMode); err != nil {
|
|
|
log.Fatalf("main: cannot create data directory: %v", err)
|
|
|
}
|
|
|
snapdir := path.Join(*dir, "snap")
|
|
|
if err := os.MkdirAll(snapdir, privateDirMode); err != nil {
|
|
|
- log.Fatalf("etcd: cannot create snapshot directory: %v", err)
|
|
|
+ log.Fatalf("main: cannot create snapshot directory: %v", err)
|
|
|
}
|
|
|
- snapshotter := snap.New(snapdir)
|
|
|
-
|
|
|
waldir := path.Join(*dir, "wal")
|
|
|
- var w *wal.WAL
|
|
|
- var n raft.Node
|
|
|
- var err error
|
|
|
- st := store.New()
|
|
|
-
|
|
|
- if !wal.Exist(waldir) {
|
|
|
- w, err = wal.Create(waldir)
|
|
|
- if err != nil {
|
|
|
- log.Fatal(err)
|
|
|
- }
|
|
|
- n = raft.StartNode(self.ID, cluster.IDs(), 10, 1)
|
|
|
- } else {
|
|
|
- var index int64
|
|
|
- snapshot, err := snapshotter.Load()
|
|
|
- if err != nil && err != snap.ErrNoSnapshot {
|
|
|
- log.Fatal(err)
|
|
|
- }
|
|
|
- if snapshot != nil {
|
|
|
- log.Printf("etcd: restart from snapshot at index %d", snapshot.Index)
|
|
|
- st.Recovery(snapshot.Data)
|
|
|
- index = snapshot.Index
|
|
|
- }
|
|
|
-
|
|
|
- // restart a node from previous wal
|
|
|
- if w, err = wal.OpenAtIndex(waldir, index); err != nil {
|
|
|
- log.Fatal(err)
|
|
|
- }
|
|
|
- wid, st, ents, err := w.ReadAll()
|
|
|
- if err != nil {
|
|
|
- log.Fatal(err)
|
|
|
- }
|
|
|
- // TODO(xiangli): save/recovery nodeID?
|
|
|
- if wid != 0 {
|
|
|
- log.Fatalf("unexpected nodeid %d: nodeid should always be zero until we save nodeid into wal", wid)
|
|
|
- }
|
|
|
- n = raft.RestartNode(self.ID, cluster.IDs(), 10, 1, snapshot, st, ents)
|
|
|
- }
|
|
|
|
|
|
pt, err := transport.NewTransport(peerTLSInfo)
|
|
|
if err != nil {
|
|
|
log.Fatal(err)
|
|
|
}
|
|
|
|
|
|
- cls := etcdserver.NewClusterStore(st, *cluster)
|
|
|
-
|
|
|
acurls, err := pkg.URLsFromFlags(flag.CommandLine, "advertise-client-urls", "addr", clientTLSInfo)
|
|
|
if err != nil {
|
|
|
log.Fatal(err.Error())
|
|
|
}
|
|
|
-
|
|
|
- s := &etcdserver.EtcdServer{
|
|
|
+ cfg := &etcdserver.ServerConfig{
|
|
|
Name: *name,
|
|
|
ClientURLs: acurls,
|
|
|
- Store: st,
|
|
|
- Node: n,
|
|
|
- Storage: struct {
|
|
|
- *wal.WAL
|
|
|
- *snap.Snapshotter
|
|
|
- }{w, snapshotter},
|
|
|
- Send: etcdserver.Sender(pt, cls),
|
|
|
- Ticker: time.Tick(100 * time.Millisecond),
|
|
|
- SyncTicker: time.Tick(500 * time.Millisecond),
|
|
|
- SnapCount: *snapCount,
|
|
|
- ClusterStore: cls,
|
|
|
+ SnapDir: snapdir,
|
|
|
+ SnapCount: int64(*snapCount),
|
|
|
+ WalDir: waldir,
|
|
|
+ Cluster: cluster,
|
|
|
+ Transport: pt,
|
|
|
}
|
|
|
+ s := etcdserver.NewServer(cfg)
|
|
|
s.Start()
|
|
|
|
|
|
ch := &pkg.CORSHandler{
|
|
|
- Handler: etcdhttp.NewClientHandler(s, cls, *timeout),
|
|
|
+ Handler: etcdhttp.NewClientHandler(s, *timeout),
|
|
|
Info: cors,
|
|
|
}
|
|
|
ph := etcdhttp.NewPeerHandler(s)
|