Browse Source

etcdserver: copy stats instead of marshaling with lock

Jonathan Boulle 11 years ago
parent
commit
233e940410
1 changed files with 6 additions and 5 deletions
  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)