diff --git a/etcdserver/raft.go b/etcdserver/raft.go index f6d2da30d..4f11a23ee 100644 --- a/etcdserver/raft.go +++ b/etcdserver/raft.go @@ -79,6 +79,13 @@ type apply struct { } type raftNode struct { + // Cache of the latest raft index and raft term the server has seen. + // These three unit64 fields must be the first elements to keep 64-bit + // alignment for atomic access to the fields. + index uint64 + term uint64 + lead uint64 + raft.Node // a chan to send out apply @@ -99,11 +106,6 @@ type raftNode struct { // If transport is nil, server will panic. transport rafthttp.Transporter - // Cache of the latest raft index and raft term the server has seen - index uint64 - term uint64 - lead uint64 - stopped chan struct{} done chan struct{} } diff --git a/etcdserver/server.go b/etcdserver/server.go index 149f65724..c8ad680da 100644 --- a/etcdserver/server.go +++ b/etcdserver/server.go @@ -141,11 +141,13 @@ type Server interface { // EtcdServer is the production implementation of the Server interface type EtcdServer struct { + // r must be the first element to keep 64-bit alignment for atomic + // access to fields + r raftNode + cfg *ServerConfig snapCount uint64 - r raftNode - w wait.Wait stop chan struct{} done chan struct{} diff --git a/store/watcher_hub.go b/store/watcher_hub.go index d27ace06b..d573eb331 100644 --- a/store/watcher_hub.go +++ b/store/watcher_hub.go @@ -31,9 +31,13 @@ import ( // event happens between the end of the first watch command and the start // of the second command. type watcherHub struct { + // count must be the first element to keep 64-bit alignment for atomic + // access + + count int64 // current number of watchers. + mutex sync.Mutex watchers map[string]*list.List - count int64 // current number of watchers. EventHistory *EventHistory }