Skip to content

Commit

Permalink
Unlock Statsd when stopping to prevent deadlock (#3258)
Browse files Browse the repository at this point in the history
  • Loading branch information
danielnelson authored Sep 22, 2017
1 parent 4a40678 commit 82f760e
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 1 deletion.
6 changes: 5 additions & 1 deletion plugins/inputs/statsd/statsd.go
Original file line number Diff line number Diff line change
Expand Up @@ -814,7 +814,6 @@ func (s *Statsd) remember(id string, conn *net.TCPConn) {

func (s *Statsd) Stop() {
s.Lock()
defer s.Unlock()
log.Println("I! Stopping the statsd service")
close(s.done)
switch s.Protocol {
Expand All @@ -838,9 +837,14 @@ func (s *Statsd) Stop() {
default:
s.UDPlistener.Close()
}
s.Unlock()

s.wg.Wait()

s.Lock()
close(s.in)
log.Println("I! Stopped Statsd listener service on ", s.ServiceAddress)
s.Unlock()
}

func init() {
Expand Down
30 changes: 30 additions & 0 deletions plugins/inputs/statsd/statsd_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,36 @@ func TestCloseConcurrentConns(t *testing.T) {
listener.Stop()
}

// benchmark how long it takes to accept & process 100,000 metrics:
func BenchmarkUDP(b *testing.B) {
listener := Statsd{
Protocol: "udp",
ServiceAddress: ":8125",
AllowedPendingMessages: 250000,
}
acc := &testutil.Accumulator{Discard: true}

// send multiple messages to socket
for n := 0; n < b.N; n++ {
err := listener.Start(acc)
if err != nil {
panic(err)
}

time.Sleep(time.Millisecond * 25)
conn, err := net.Dial("udp", "127.0.0.1:8125")
if err != nil {
panic(err)
}
for i := 0; i < 250000; i++ {
fmt.Fprintf(conn, testMsg)
}
// wait for 250,000 metrics to get added to accumulator
time.Sleep(time.Millisecond)
listener.Stop()
}
}

// benchmark how long it takes to accept & process 100,000 metrics:
func BenchmarkTCP(b *testing.B) {
listener := Statsd{
Expand Down

0 comments on commit 82f760e

Please sign in to comment.