The back-end crashes if a shutdown is initiated while a provider is refreshing the catalog:
$ ~/facette/build/facette-linux-amd64/bin/facette -c ~/.facette/etc/facette.json -L info
2014/07/04 08:02:21 INFO: library: refresh started
2014/07/04 08:02:21 INFO: library: refresh completed
2014/07/04 08:02:21 INFO: provider: graphite: received refresh command
2014/07/04 08:02:21 INFO: provider: collectd: received refresh command
2014/07/04 08:02:21 INFO: serveWorker: listening on :9009
^C2014/07/04 08:02:21 NOTICE: server: shutting down server
2014/07/04 08:02:21 INFO: serveWorker: received shutdown command, stopping job
2014/07/04 08:02:21 INFO: serveWorker: server listener closed
panic: runtime error: send on closed channel
goroutine 30 [running]:
runtime.panic(0x7c4be0, 0xc333be)
/usr/lib/go/src/pkg/runtime/panic.c:279 +0xf5
github.com/facette/facette/pkg/connector.func·005(0xc20811b240, 0x3e, 0x7fb9a7289b48, 0xc208186cd0, 0x0, 0x0, 0x0, 0x0)
/home/marc/facette/tmp/src/github.com/facette/facette/pkg/connector/rrd.go:321 +0x94c
github.com/facette/facette/pkg/utils.func·002(0xc20811b240, 0x3e, 0x7fb9a7289b48, 0xc208186cd0, 0x0, 0x0, 0x0, 0x0)
/home/marc/facette/tmp/src/github.com/facette/facette/pkg/utils/os.go:27 +0x26f
path/filepath.walk(0xc20811b240, 0x3e, 0x7fb9a7289b48, 0xc208186cd0, 0x7fb9a70f4ce0, 0x0, 0x0)
/usr/lib/go/src/pkg/path/filepath/path.go:343 +0x8c
path/filepath.walk(0xc2081388a0, 0x2a, 0x7fb9a7289b48, 0xc208186c80, 0x7fb9a70f4ce0, 0x0, 0x0)
/usr/lib/go/src/pkg/path/filepath/path.go:368 +0x4f5
path/filepath.walk(0xc208138cc0, 0x23, 0x7fb9a7289b48, 0xc208130870, 0x7fb9a70f4ce0, 0x0, 0x0)
/usr/lib/go/src/pkg/path/filepath/path.go:368 +0x4f5
path/filepath.walk(0xc20803ec40, 0x15, 0x7fb9a7289b48, 0xc208130820, 0x7fb9a70f4ce0, 0x0, 0x0)
/usr/lib/go/src/pkg/path/filepath/path.go:368 +0x4f5
path/filepath.Walk(0xc20803ec40, 0x15, 0x7fb9a70f4ce0, 0x0, 0x0)
/usr/lib/go/src/pkg/path/filepath/path.go:390 +0xe5
github.com/facette/facette/pkg/utils.walkDir(0xc20803ec40, 0x15, 0x80adf0, 0x0, 0x7fb9a70f4e50, 0x0, 0x0)
/home/marc/facette/tmp/src/github.com/facette/facette/pkg/utils/os.go:29 +0xcb
github.com/facette/facette/pkg/utils.WalkDir(0xc20803ec40, 0x15, 0x7fb9a70f4e50, 0x0, 0x0)
/home/marc/facette/tmp/src/github.com/facette/facette/pkg/utils/os.go:34 +0x61
github.com/facette/facette/pkg/connector.(*RRDConnector).Refresh(0xc2080ca2c0, 0xc208023822, 0x8, 0xc2080043c0, 0x0, 0x0)
/home/marc/facette/tmp/src/github.com/facette/facette/pkg/connector/rrd.go:328 +0x2da
github.com/facette/facette/pkg/server.workerProviderRun(0xc20800fae0, 0xc2080ac9d0, 0x1, 0x1)
/home/marc/facette/tmp/src/github.com/facette/facette/pkg/server/worker_provider.go:127 +0x589
created by github.com/facette/facette/pkg/worker.func·001
/home/marc/facette/tmp/src/github.com/facette/facette/pkg/worker/worker.go:59 +0x11f
goroutine 16 [semacquire]:
sync.runtime_Semacquire(0xc2080019e0)
/usr/lib/go/src/pkg/runtime/sema.goc:199 +0x30
sync.(*WaitGroup).Wait(0xc20803e8a0)
/usr/lib/go/src/pkg/sync/waitgroup.go:129 +0x14b
github.com/facette/facette/pkg/server.(*Server).Run(0xc20804e080, 0x0, 0x0)
/home/marc/facette/tmp/src/github.com/facette/facette/pkg/server/server.go:156 +0xb29
main.main()
/home/marc/facette/cmd/facette/facette.go:79 +0x343
goroutine 19 [finalizer wait]:
runtime.park(0x415580, 0xc4bcb8, 0xc381c9)
/usr/lib/go/src/pkg/runtime/proc.c:1369 +0x89
runtime.parkunlock(0xc4bcb8, 0xc381c9)
/usr/lib/go/src/pkg/runtime/proc.c:1385 +0x3b
runfinq()
/usr/lib/go/src/pkg/runtime/mgc0.c:2644 +0xcf
runtime.goexit()
/usr/lib/go/src/pkg/runtime/proc.c:1445
goroutine 17 [syscall]:
runtime.goexit()
/usr/lib/go/src/pkg/runtime/proc.c:1445
goroutine 20 [syscall]:
os/signal.loop()
/usr/lib/go/src/pkg/os/signal/signal_unix.go:21 +0x1e
created by os/signal.init·1
/usr/lib/go/src/pkg/os/signal/signal_unix.go:27 +0x32
goroutine 21 [semacquire]:
sync.runtime_Semacquire(0xc2080019e4)
/usr/lib/go/src/pkg/runtime/sema.goc:199 +0x30
sync.(*WaitGroup).Wait(0xc20803f880)
/usr/lib/go/src/pkg/sync/waitgroup.go:129 +0x14b
github.com/facette/facette/pkg/server.(*Server).stopProviderWorkers(0xc20804e080)
/home/marc/facette/tmp/src/github.com/facette/facette/pkg/server/worker_provider.go:59 +0x133
github.com/facette/facette/pkg/server.(*Server).Stop(0xc20804e080)
/home/marc/facette/tmp/src/github.com/facette/facette/pkg/server/server.go:177 +0x1fb
main.func·002()
/home/marc/facette/cmd/facette/facette.go:72 +0x16e
created by main.main
/home/marc/facette/cmd/facette/facette.go:76 +0x32d
goroutine 22 [chan receive]:
github.com/facette/facette/pkg/worker.func·001(0xc20800f2c0)
/home/marc/facette/tmp/src/github.com/facette/facette/pkg/worker/worker.go:54 +0x5f
created by github.com/facette/facette/pkg/worker.NewWorker
/home/marc/facette/tmp/src/github.com/facette/facette/pkg/worker/worker.go:61 +0x135
goroutine 24 [runnable]:
github.com/facette/facette/pkg/provider.func·001(0xc2080043c0, 0xc2080040c0, 0xc20804e600, 0xe, 0x10)
/home/marc/facette/tmp/src/github.com/facette/facette/pkg/provider/filter.go:50 +0x61
created by github.com/facette/facette/pkg/provider.newFilterChain
/home/marc/facette/tmp/src/github.com/facette/facette/pkg/provider/filter.go:112 +0x4f0
goroutine 25 [runnable]:
github.com/facette/facette/pkg/provider.func·001(0xc208004e40, 0xc2080040c0, 0xc2080ac950, 0x2, 0x2)
/home/marc/facette/tmp/src/github.com/facette/facette/pkg/provider/filter.go:50 +0x61
created by github.com/facette/facette/pkg/provider.newFilterChain
/home/marc/facette/tmp/src/github.com/facette/facette/pkg/provider/filter.go:112 +0x4f0
goroutine 26 [runnable]:
github.com/facette/facette/pkg/worker.func·001(0xc20800fae0)
/home/marc/facette/tmp/src/github.com/facette/facette/pkg/worker/worker.go:54 +0x5f
created by github.com/facette/facette/pkg/worker.NewWorker
/home/marc/facette/tmp/src/github.com/facette/facette/pkg/worker/worker.go:61 +0x135
goroutine 27 [select]:
github.com/facette/facette/pkg/server.workerCatalogRun(0xc20800f2c0, 0xc208000f00, 0x1, 0x1)
/home/marc/facette/tmp/src/github.com/facette/facette/pkg/server/worker_catalog.go:39 +0x26a
created by github.com/facette/facette/pkg/worker.func·001
/home/marc/facette/tmp/src/github.com/facette/facette/pkg/worker/worker.go:59 +0x11f
goroutine 29 [chan receive]:
github.com/facette/facette/pkg/worker.func·001(0xc20800fb30)
/home/marc/facette/tmp/src/github.com/facette/facette/pkg/worker/worker.go:54 +0x5f
created by github.com/facette/facette/pkg/worker.NewWorker
/home/marc/facette/tmp/src/github.com/facette/facette/pkg/worker/worker.go:61 +0x135
goroutine 33 [select]:
net/http.(*persistConn).roundTrip(0xc208064a50, 0xc2080ad6a0, 0x0, 0x0, 0x0)
/usr/lib/go/src/pkg/net/http/transport.go:1015 +0x6db
net/http.(*Transport).RoundTrip(0xc20804e580, 0xc208027ee0, 0xd, 0x0, 0x0)
/usr/lib/go/src/pkg/net/http/transport.go:208 +0x49a
net/http.send(0xc208027ee0, 0x7fb9a72898f0, 0xc20804e580, 0xc2080294b4, 0x0, 0x0)
/usr/lib/go/src/pkg/net/http/client.go:195 +0x43d
net/http.(*Client).send(0xc208138a20, 0xc208027ee0, 0x36, 0x0, 0x0)
/usr/lib/go/src/pkg/net/http/client.go:118 +0x15b
net/http.(*Client).doFollowingRedirects(0xc208138a20, 0xc208027ee0, 0x8e7330, 0x0, 0x0, 0x0)
/usr/lib/go/src/pkg/net/http/client.go:343 +0x97f
net/http.(*Client).Do(0xc208138a20, 0xc208027ee0, 0x10, 0x0, 0x0)
/usr/lib/go/src/pkg/net/http/client.go:150 +0xa3
github.com/facette/facette/pkg/connector.(*GraphiteConnector).Refresh(0xc20803f8e0, 0xc208023dc2, 0x8, 0xc208004e40, 0x0, 0x0)
/home/marc/facette/tmp/src/github.com/facette/facette/pkg/connector/graphite.go:156 +0x40e
github.com/facette/facette/pkg/server.workerProviderRun(0xc20800fb30, 0xc2080aca60, 0x1, 0x1)
/home/marc/facette/tmp/src/github.com/facette/facette/pkg/server/worker_provider.go:127 +0x589
created by github.com/facette/facette/pkg/worker.func·001
/home/marc/facette/tmp/src/github.com/facette/facette/pkg/worker/worker.go:59 +0x11f
goroutine 47 [IO wait]:
net.runtime_pollWait(0x7fb9a728b208, 0x72, 0x0)
/usr/lib/go/src/pkg/runtime/netpoll.goc:146 +0x66
net.(*pollDesc).Wait(0xc208028060, 0x72, 0x0, 0x0)
/usr/lib/go/src/pkg/net/fd_poll_runtime.go:84 +0x46
net.(*pollDesc).WaitRead(0xc208028060, 0x0, 0x0)
/usr/lib/go/src/pkg/net/fd_poll_runtime.go:89 +0x42
net.(*netFD).Read(0xc208028000, 0xc208053000, 0x400, 0x400, 0x0, 0x7fb9a7289720, 0xb)
/usr/lib/go/src/pkg/net/fd_unix.go:232 +0x34c
net.(*conn).Read(0xc208038018, 0xc208053000, 0x400, 0x400, 0x0, 0x0, 0x0)
/usr/lib/go/src/pkg/net/net.go:122 +0xe7
crypto/tls.(*block).readFromUntil(0xc208087380, 0x7fb9a728b578, 0xc208038018, 0x5, 0x0, 0x0)
/usr/lib/go/src/pkg/crypto/tls/conn.go:451 +0xd9
crypto/tls.(*Conn).readRecord(0xc20804c580, 0x17, 0x0, 0x0)
/usr/lib/go/src/pkg/crypto/tls/conn.go:536 +0x1ff
crypto/tls.(*Conn).Read(0xc20804c580, 0xc208127000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
/usr/lib/go/src/pkg/crypto/tls/conn.go:901 +0x16a
net/http.noteEOFReader.Read(0x7fb9a728fe20, 0xc20804c580, 0xc208064aa8, 0xc208127000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
/usr/lib/go/src/pkg/net/http/transport.go:1203 +0x72
net/http.(*noteEOFReader).Read(0xc208191600, 0xc208127000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
<autogenerated>:124 +0xca
bufio.(*Reader).fill(0xc208132cc0)
/usr/lib/go/src/pkg/bufio/bufio.go:97 +0x1b3
bufio.(*Reader).Peek(0xc208132cc0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0)
/usr/lib/go/src/pkg/bufio/bufio.go:132 +0x101
net/http.(*persistConn).readLoop(0xc208064a50)
/usr/lib/go/src/pkg/net/http/transport.go:782 +0x95
created by net/http.(*Transport).dialConn
/usr/lib/go/src/pkg/net/http/transport.go:600 +0x93f
goroutine 50 [runnable]:
github.com/facette/facette/pkg/server.workerProviderShutdown(0xc20800fae0, 0xc2080019f0, 0x1, 0x1)
/home/marc/facette/tmp/src/github.com/facette/facette/pkg/server/worker_provider.go:86
created by github.com/facette/facette/pkg/worker.func·001
/home/marc/facette/tmp/src/github.com/facette/facette/pkg/worker/worker.go:59 +0x11f
goroutine 51 [runnable]:
github.com/facette/facette/pkg/server.workerProviderShutdown(0xc20800fb30, 0xc2080019f0, 0x1, 0x1)
/home/marc/facette/tmp/src/github.com/facette/facette/pkg/server/worker_provider.go:86
created by github.com/facette/facette/pkg/worker.func·001
/home/marc/facette/tmp/src/github.com/facette/facette/pkg/worker/worker.go:59 +0x11f
goroutine 48 [select]:
net/http.(*persistConn).writeLoop(0xc208064a50)
/usr/lib/go/src/pkg/net/http/transport.go:885 +0x38f
created by net/http.(*Transport).dialConn
/usr/lib/go/src/pkg/net/http/transport.go:601 +0x957