Browse Source

Merge pull request #1317 from unihorn/169

etcdserver: fix data race in leaderStats.Followers
Yicheng Qin 11 years ago
parent
commit
7ef375efbd
2 changed files with 15 additions and 6 deletions
  1. 1 6
      etcdserver/cluster_store.go
  2. 14 0
      etcdserver/stats/leader.go

+ 1 - 6
etcdserver/cluster_store.go

@@ -149,12 +149,7 @@ func send(c *http.Client, cls ClusterStore, m raftpb.Message, ss *stats.ServerSt
 			ss.SendAppendReq(len(data))
 			ss.SendAppendReq(len(data))
 		}
 		}
 		to := strconv.FormatUint(m.To, 16)
 		to := strconv.FormatUint(m.To, 16)
-		fs, ok := ls.Followers[to]
-		if !ok {
-			fs = &stats.FollowerStats{}
-			fs.Latency.Minimum = 1 << 63
-			ls.Followers[to] = fs
-		}
+		fs := ls.Follower(to)
 
 
 		start := time.Now()
 		start := time.Now()
 		sent := httpPost(c, u, data)
 		sent := httpPost(c, u, data)

+ 14 - 0
etcdserver/stats/leader.go

@@ -12,6 +12,8 @@ type LeaderStats struct {
 	// TODO(jonboulle): clarify that these are IDs, not names
 	// TODO(jonboulle): clarify that these are IDs, not names
 	Leader    string                    `json:"leader"`
 	Leader    string                    `json:"leader"`
 	Followers map[string]*FollowerStats `json:"followers"`
 	Followers map[string]*FollowerStats `json:"followers"`
+
+	sync.Mutex
 }
 }
 
 
 // NewLeaderStats generates a new LeaderStats with the given id as leader
 // NewLeaderStats generates a new LeaderStats with the given id as leader
@@ -22,6 +24,18 @@ func NewLeaderStats(id string) *LeaderStats {
 	}
 	}
 }
 }
 
 
+func (ls *LeaderStats) Follower(name string) *FollowerStats {
+	ls.Lock()
+	defer ls.Unlock()
+	fs, ok := ls.Followers[name]
+	if !ok {
+		fs = &FollowerStats{}
+		fs.Latency.Minimum = 1 << 63
+		ls.Followers[name] = fs
+	}
+	return fs
+}
+
 // FollowerStats encapsulates various statistics about a follower in an etcd cluster
 // FollowerStats encapsulates various statistics about a follower in an etcd cluster
 type FollowerStats struct {
 type FollowerStats struct {
 	Latency struct {
 	Latency struct {