From 233e940410b87a6893181705a4794df24be04d5d Mon Sep 17 00:00:00 2001 From: Jonathan Boulle Date: Thu, 16 Oct 2014 19:49:35 -0700 Subject: [PATCH] etcdserver: copy stats instead of marshaling with lock --- etcdserver/stats/server.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/etcdserver/stats/server.go b/etcdserver/stats/server.go index 4233ddbbb..2b9e2a3d9 100644 --- a/etcdserver/stats/server.go +++ b/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)