diff --git a/embed/etcd.go b/embed/etcd.go index f77dee0e0656..668e27bd2fc2 100644 --- a/embed/etcd.go +++ b/embed/etcd.go @@ -119,7 +119,7 @@ func StartEtcd(inCfg *Config) (e *Etcd, err error) { } } - srvcfg := &etcdserver.ServerConfig{ + srvcfg := etcdserver.ServerConfig{ Name: cfg.Name, ClientURLs: cfg.ACUrls, PeerURLs: cfg.APUrls, diff --git a/etcdserver/raft.go b/etcdserver/raft.go index dcb894f82fb1..8e9070149bf0 100644 --- a/etcdserver/raft.go +++ b/etcdserver/raft.go @@ -378,7 +378,7 @@ func advanceTicksForElection(n raft.Node, electionTicks int) { } } -func startNode(cfg *ServerConfig, cl *membership.RaftCluster, ids []types.ID) (id types.ID, n raft.Node, s *raft.MemoryStorage, w *wal.WAL) { +func startNode(cfg ServerConfig, cl *membership.RaftCluster, ids []types.ID) (id types.ID, n raft.Node, s *raft.MemoryStorage, w *wal.WAL) { var err error member := cl.MemberByName(cfg.Name) metadata := pbutil.MustMarshal( @@ -419,7 +419,7 @@ func startNode(cfg *ServerConfig, cl *membership.RaftCluster, ids []types.ID) (i return } -func restartNode(cfg *ServerConfig, snapshot *raftpb.Snapshot) (types.ID, *membership.RaftCluster, raft.Node, *raft.MemoryStorage, *wal.WAL) { +func restartNode(cfg ServerConfig, snapshot *raftpb.Snapshot) (types.ID, *membership.RaftCluster, raft.Node, *raft.MemoryStorage, *wal.WAL) { var walsnap walpb.Snapshot if snapshot != nil { walsnap.Index, walsnap.Term = snapshot.Metadata.Index, snapshot.Metadata.Term @@ -453,7 +453,7 @@ func restartNode(cfg *ServerConfig, snapshot *raftpb.Snapshot) (types.ID, *membe return id, cl, n, s, w } -func restartAsStandaloneNode(cfg *ServerConfig, snapshot *raftpb.Snapshot) (types.ID, *membership.RaftCluster, raft.Node, *raft.MemoryStorage, *wal.WAL) { +func restartAsStandaloneNode(cfg ServerConfig, snapshot *raftpb.Snapshot) (types.ID, *membership.RaftCluster, raft.Node, *raft.MemoryStorage, *wal.WAL) { var walsnap walpb.Snapshot if snapshot != nil { walsnap.Index, walsnap.Term = snapshot.Metadata.Index, snapshot.Metadata.Term diff --git a/etcdserver/server.go b/etcdserver/server.go index 1c2a95c05b58..e8d736e1e709 100644 --- a/etcdserver/server.go +++ b/etcdserver/server.go @@ -170,12 +170,10 @@ type EtcdServer struct { // consistIndex used to hold the offset of current executing entry // It is initialized to 0 before executing any entry. consistIndex consistentIndex // must use atomic operations to access; keep 64-bit aligned. - Cfg *ServerConfig + r raftNode // uses 64-bit atomics; keep 64-bit aligned. readych chan struct{} - r raftNode - - snapCount uint64 + Cfg ServerConfig w wait.Wait @@ -249,7 +247,7 @@ type EtcdServer struct { // NewServer creates a new EtcdServer from the supplied configuration. The // configuration is considered static for the lifetime of the EtcdServer. -func NewServer(cfg *ServerConfig) (srv *EtcdServer, err error) { +func NewServer(cfg ServerConfig) (srv *EtcdServer, err error) { st := store.New(StoreClusterPrefix, StoreKeysPrefix) var ( @@ -408,11 +406,10 @@ func NewServer(cfg *ServerConfig) (srv *EtcdServer, err error) { heartbeat := time.Duration(cfg.TickMs) * time.Millisecond srv = &EtcdServer{ - readych: make(chan struct{}), - Cfg: cfg, - snapCount: cfg.SnapCount, - errorc: make(chan error, 1), - store: st, + readych: make(chan struct{}), + Cfg: cfg, + errorc: make(chan error, 1), + store: st, r: *newRaftNode( raftNodeConfig{ isIDRemoved: func(id uint64) bool { return cl.IsIDRemoved(types.ID(id)) }, @@ -522,9 +519,9 @@ func (s *EtcdServer) Start() { // modify a server's fields after it has been sent to Start. // This function is just used for testing. func (s *EtcdServer) start() { - if s.snapCount == 0 { + if s.Cfg.SnapCount == 0 { plog.Infof("set snapshot count to default %d", DefaultSnapCount) - s.snapCount = DefaultSnapCount + s.Cfg.SnapCount = DefaultSnapCount } s.w = wait.New() s.applyWait = wait.NewTimeList() @@ -909,7 +906,7 @@ func (s *EtcdServer) applyEntries(ep *etcdProgress, apply *apply) { } func (s *EtcdServer) triggerSnapshot(ep *etcdProgress) { - if ep.appliedi-ep.snapi <= s.snapCount { + if ep.appliedi-ep.snapi <= s.Cfg.SnapCount { return } diff --git a/etcdserver/server_test.go b/etcdserver/server_test.go index 0f2b0edf7e6f..0086a84c7574 100644 --- a/etcdserver/server_test.go +++ b/etcdserver/server_test.go @@ -175,7 +175,6 @@ func TestApplyRepeat(t *testing.T) { }) s := &EtcdServer{ r: *r, - Cfg: &ServerConfig{}, store: st, cluster: cl, reqIDGen: idutil.NewGenerator(0, time.Time{}), @@ -527,7 +526,6 @@ func TestApplyConfChangeError(t *testing.T) { srv := &EtcdServer{ r: *newRaftNode(raftNodeConfig{Node: n}), cluster: cl, - Cfg: &ServerConfig{}, } _, err := srv.applyConfChange(tt.cc, nil) if err != tt.werr { @@ -682,7 +680,7 @@ func TestDoProposal(t *testing.T) { transport: rafthttp.NewNopTransporter(), }) srv := &EtcdServer{ - Cfg: &ServerConfig{TickMs: 1}, + Cfg: ServerConfig{TickMs: 1}, r: *r, store: st, reqIDGen: idutil.NewGenerator(0, time.Time{}), @@ -710,7 +708,7 @@ func TestDoProposal(t *testing.T) { func TestDoProposalCancelled(t *testing.T) { wt := mockwait.NewRecorder() srv := &EtcdServer{ - Cfg: &ServerConfig{TickMs: 1}, + Cfg: ServerConfig{TickMs: 1}, r: *newRaftNode(raftNodeConfig{Node: newNodeNop()}), w: wt, reqIDGen: idutil.NewGenerator(0, time.Time{}), @@ -732,7 +730,7 @@ func TestDoProposalCancelled(t *testing.T) { func TestDoProposalTimeout(t *testing.T) { srv := &EtcdServer{ - Cfg: &ServerConfig{TickMs: 1}, + Cfg: ServerConfig{TickMs: 1}, r: *newRaftNode(raftNodeConfig{Node: newNodeNop()}), w: mockwait.NewNop(), reqIDGen: idutil.NewGenerator(0, time.Time{}), @@ -748,7 +746,7 @@ func TestDoProposalTimeout(t *testing.T) { func TestDoProposalStopped(t *testing.T) { srv := &EtcdServer{ - Cfg: &ServerConfig{TickMs: 1}, + Cfg: ServerConfig{TickMs: 1}, r: *newRaftNode(raftNodeConfig{Node: newNodeNop()}), w: mockwait.NewNop(), reqIDGen: idutil.NewGenerator(0, time.Time{}), @@ -852,7 +850,7 @@ func TestSyncTrigger(t *testing.T) { }) srv := &EtcdServer{ - Cfg: &ServerConfig{TickMs: 1}, + Cfg: ServerConfig{TickMs: 1}, r: *r, store: mockstore.NewNop(), SyncTicker: tk, @@ -910,7 +908,6 @@ func TestSnapshot(t *testing.T) { storage: p, }) srv := &EtcdServer{ - Cfg: &ServerConfig{}, r: *r, store: st, } @@ -979,9 +976,7 @@ func TestSnapshotOrdering(t *testing.T) { raftStorage: rs, }) s := &EtcdServer{ - Cfg: &ServerConfig{ - DataDir: testdir, - }, + Cfg: ServerConfig{DataDir: testdir}, r: *r, store: st, cluster: cl, @@ -1051,8 +1046,7 @@ func TestTriggerSnap(t *testing.T) { transport: rafthttp.NewNopTransporter(), }) srv := &EtcdServer{ - Cfg: &ServerConfig{TickMs: 1}, - snapCount: uint64(snapc), + Cfg: ServerConfig{TickMs: 1, SnapCount: uint64(snapc)}, r: *r, store: st, reqIDGen: idutil.NewGenerator(0, time.Time{}), @@ -1116,9 +1110,7 @@ func TestConcurrentApplyAndSnapshotV3(t *testing.T) { raftStorage: rs, }) s := &EtcdServer{ - Cfg: &ServerConfig{ - DataDir: testdir, - }, + Cfg: ServerConfig{DataDir: testdir}, r: *r, store: st, cluster: cl, @@ -1202,7 +1194,6 @@ func TestAddMember(t *testing.T) { }) s := &EtcdServer{ r: *r, - Cfg: &ServerConfig{}, store: st, cluster: cl, reqIDGen: idutil.NewGenerator(0, time.Time{}), @@ -1244,7 +1235,6 @@ func TestRemoveMember(t *testing.T) { }) s := &EtcdServer{ r: *r, - Cfg: &ServerConfig{}, store: st, cluster: cl, reqIDGen: idutil.NewGenerator(0, time.Time{}), @@ -1319,7 +1309,7 @@ func TestPublish(t *testing.T) { ctx, cancel := context.WithCancel(context.TODO()) srv := &EtcdServer{ readych: make(chan struct{}), - Cfg: &ServerConfig{TickMs: 1}, + Cfg: ServerConfig{TickMs: 1}, id: 1, r: *newRaftNode(raftNodeConfig{Node: n}), attributes: membership.Attributes{Name: "node1", ClientURLs: []string{"http://a", "http://b"}}, @@ -1369,7 +1359,7 @@ func TestPublishStopped(t *testing.T) { transport: rafthttp.NewNopTransporter(), }) srv := &EtcdServer{ - Cfg: &ServerConfig{TickMs: 1}, + Cfg: ServerConfig{TickMs: 1}, r: *r, cluster: &membership.RaftCluster{}, w: mockwait.NewNop(), @@ -1391,7 +1381,7 @@ func TestPublishRetry(t *testing.T) { ctx, cancel := context.WithCancel(context.TODO()) n := newNodeRecorderStream() srv := &EtcdServer{ - Cfg: &ServerConfig{TickMs: 1}, + Cfg: ServerConfig{TickMs: 1}, r: *newRaftNode(raftNodeConfig{Node: n}), w: mockwait.NewNop(), stopping: make(chan struct{}), @@ -1432,7 +1422,7 @@ func TestUpdateVersion(t *testing.T) { ctx, cancel := context.WithCancel(context.TODO()) srv := &EtcdServer{ id: 1, - Cfg: &ServerConfig{TickMs: 1}, + Cfg: ServerConfig{TickMs: 1}, r: *newRaftNode(raftNodeConfig{Node: n}), attributes: membership.Attributes{Name: "node1", ClientURLs: []string{"http://node1.com"}}, cluster: &membership.RaftCluster{}, diff --git a/integration/cluster.go b/integration/cluster.go index 7af9d77a1a3a..d108309e13c6 100644 --- a/integration/cluster.go +++ b/integration/cluster.go @@ -625,7 +625,7 @@ func (m *member) Clone(t *testing.T) *member { func (m *member) Launch() error { plog.Printf("launching %s (%s)", m.Name, m.grpcAddr) var err error - if m.s, err = etcdserver.NewServer(&m.ServerConfig); err != nil { + if m.s, err = etcdserver.NewServer(m.ServerConfig); err != nil { return fmt.Errorf("failed to initialize the etcd server: %v", err) } m.s.SyncTicker = time.NewTicker(500 * time.Millisecond)