瀏覽代碼

etcdserver: copy stats instead of marshaling with lock

Jonathan Boulle 12 年之前
父節點
當前提交
233e940410
共有 1 個文件被更改,包括 6 次插入 和 5 次删除
  1. 6 5
      etcdserver/stats/server.go

+ 6 - 5
etcdserver/stats/server.go

@@ -40,11 +40,12 @@ type ServerStats struct {
 
 func (ss *ServerStats) JSON() []byte {
 	ss.Lock()
-	defer ss.Unlock()
-	ss.LeaderInfo.Uptime = time.Now().Sub(ss.LeaderInfo.StartTime).String()
-	ss.SendingPkgRate, ss.SendingBandwidthRate = ss.SendRates()
-	ss.RecvingPkgRate, ss.RecvingBandwidthRate = ss.RecvRates()
-	b, err := json.Marshal(ss)
+	stats := *ss
+	ss.Unlock()
+	stats.LeaderInfo.Uptime = time.Now().Sub(stats.LeaderInfo.StartTime).String()
+	stats.SendingPkgRate, stats.SendingBandwidthRate = stats.SendRates()
+	stats.RecvingPkgRate, stats.RecvingBandwidthRate = stats.RecvRates()
+	b, err := json.Marshal(stats)
 	// TODO(jonboulle): appropriate error handling?
 	if err != nil {
 		log.Printf("error marshalling server stats: %v", err)