From 80f692f12391fc3d7a4d73858f4da106faca5548 Mon Sep 17 00:00:00 2001 From: BurtonQin Date: Thu, 13 Feb 2020 23:25:38 +0800 Subject: [PATCH 1/2] cmd/faucet: add Rlock to protect f.reqs in apiHandler --- cmd/faucet/faucet.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cmd/faucet/faucet.go b/cmd/faucet/faucet.go index 77938efabd90..09968f8e385e 100644 --- a/cmd/faucet/faucet.go +++ b/cmd/faucet/faucet.go @@ -360,6 +360,7 @@ func (f *faucet) apiHandler(w http.ResponseWriter, r *http.Request) { } } // Send over the initial stats and the latest header + f.lock.RLock() if err = send(conn, map[string]interface{}{ "funds": new(big.Int).Div(balance, ether), "funded": nonce, @@ -367,8 +368,10 @@ func (f *faucet) apiHandler(w http.ResponseWriter, r *http.Request) { "requests": f.reqs, }, 3*time.Second); err != nil { log.Warn("Failed to send initial stats to client", "err", err) + f.lock.RUnlock() return } + f.lock.RUnlock() if err = send(conn, head, 3*time.Second); err != nil { log.Warn("Failed to send initial header to client", "err", err) return From bad4dc2c99f5ba8f60f5a32fb7d75dd809fd6b15 Mon Sep 17 00:00:00 2001 From: BurtonQin Date: Fri, 14 Feb 2020 17:22:07 +0800 Subject: [PATCH 2/2] cmd/faucet: make a locked copy of f.reqs --- cmd/faucet/faucet.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/faucet/faucet.go b/cmd/faucet/faucet.go index 09968f8e385e..e86f8533d02c 100644 --- a/cmd/faucet/faucet.go +++ b/cmd/faucet/faucet.go @@ -361,17 +361,17 @@ func (f *faucet) apiHandler(w http.ResponseWriter, r *http.Request) { } // Send over the initial stats and the latest header f.lock.RLock() + reqs := f.reqs + f.lock.RUnlock() if err = send(conn, map[string]interface{}{ "funds": new(big.Int).Div(balance, ether), "funded": nonce, "peers": f.stack.Server().PeerCount(), - "requests": f.reqs, + "requests": reqs, }, 3*time.Second); err != nil { log.Warn("Failed to send initial stats to client", "err", err) - f.lock.RUnlock() return } - f.lock.RUnlock() if err = send(conn, head, 3*time.Second); err != nil { log.Warn("Failed to send initial header to client", "err", err) return