panic during close #45

Closed
davecheney opened this Issue Nov 25, 2015 · 3 comments

Comments

Projects
None yet
3 participants

Hello,

One of my coworkers using this package to interface with systemd hit a panic recently. The reproduction is hard to provide as you need our insane unit test rig, however the panic is straight forward.

panic: send on closed channel

goroutine 39 [running]:
github.com/godbus/dbus.(*Conn).inWorker(0xc820082ea0)
    /home/jesse/go/src/github.com/godbus/dbus/conn.go:327 +0x1048
created by github.com/godbus/dbus.(*Conn).Auth
    /home/jesse/go/src/github.com/godbus/dbus/auth.go:118 +0xf43

goroutine 1 [runnable]:
syscall.Syscall(0x3, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/lib/go/src/syscall/asm_linux_amd64.s:18 +0x5
syscall.Close(0x8, 0x0, 0x0)
    /usr/lib/go/src/syscall/zsyscall_linux_amd64.go:296 +0x4a
syscall.forkExec(0x2352860, 0xd, 0xc820430fc0, 0x3, 0x3, 0xc8203cc998, 0x4a4, 0x0, 0x0)
    /usr/lib/go/src/syscall/exec_unix.go:201 +0x540
syscall.StartProcess(0x2352860, 0xd, 0xc820430fc0, 0x3, 0x3, 0xc8203cc998, 0x2, 0x4, 0x0, 0x0)
    /usr/lib/go/src/syscall/exec_unix.go:240 +0x6b
os.startProcess(0x2352860, 0xd, 0xc820430fc0, 0x3, 0x3, 0xc8203ccbd0, 0xc82012c3c0, 0x0, 0x0)
    /usr/lib/go/src/os/exec_posix.go:45 +0x33c
os.StartProcess(0x2352860, 0xd, 0xc820430fc0, 0x3, 0x3, 0xc8203ccbd0, 0x0, 0x0, 0x0)
    /usr/lib/go/src/os/doc.go:24 +0x69
os/exec.(*Cmd).Start(0xc82012c280, 0x0, 0x0)
    /usr/lib/go/src/os/exec/exec.go:328 +0x767
os/exec.(*Cmd).Run(0xc82012c280, 0x0, 0x0)
    /usr/lib/go/src/os/exec/exec.go:255 +0x2d
os/exec.(*Cmd).CombinedOutput(0xc82012c280, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/lib/go/src/os/exec/exec.go:424 +0x310
github.com/juju/juju/service/upstart.IsRunning(0xc8202d65b0, 0x0, 0x0)
    /home/jesse/go/src/github.com/juju/juju/service/upstart/upstart.go:46 +0xc3
github.com/juju/juju/service.discoverLocalInitSystem(0x0, 0x0, 0x0, 0x0)
    /home/jesse/go/src/github.com/juju/juju/service/discovery.go:103 +0x121
github.com/juju/juju/service.discoverInitSystem(0x0, 0x0, 0x0, 0x0)
    /home/jesse/go/src/github.com/juju/juju/service/discovery.go:36 +0x43
github.com/juju/juju/service.DiscoverService(0xc820241600, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
    /home/jesse/go/src/github.com/juju/juju/service/discovery.go:23 +0x4b
github.com/juju/juju/mongo.glob.func2(0xc820241600, 0x13, 0x0, 0x0, 0x0, 0x0)
    /home/jesse/go/src/github.com/juju/juju/mongo/service.go:67 +0x89
github.com/juju/juju/mongo.RemoveService(0xc820433420, 0xb, 0x0, 0x0)
    /home/jesse/go/src/github.com/juju/juju/mongo/service.go:84 +0x73
github.com/juju/juju/provider/local.glob.func5(0xc820433420, 0xb, 0x0, 0x0)
    /home/jesse/go/src/github.com/juju/juju/provider/local/environ.go:586 +0x37
github.com/juju/juju/provider/local.(*localEnviron).Destroy(0xc8204c2840, 0x0, 0x0)
    /home/jesse/go/src/github.com/juju/juju/provider/local/environ.go:550 +0x122e
github.com/juju/juju/environs.Destroy(0x7fbb65d0e840, 0xc8204c2840, 0x7fbb644d08f8, 0xc820432740, 0x0, 0x0)
    /home/jesse/go/src/github.com/juju/juju/environs/open.go:296 +0x70
github.com/juju/juju/cmd/juju/commands.(*destroyEnvironmentCommand).Run(0xc8203d5f40, 0xc82027d450, 0x0, 0x0)
    /home/jesse/go/src/github.com/juju/juju/cmd/juju/commands/destroyenvironment.go:109 +0x2dd
github.com/juju/juju/cmd/envcmd.(*environCommandWrapper).Run(0xc8203dd6e0, 0xc82027d450, 0x0, 0x0)
    <autogenerated>:62 +0x65
github.com/juju/juju/cmd/envcmd.(*baseCommandWrapper).Run(0xc8203e2000, 0xc82027d450, 0x0, 0x0)
    /home/jesse/go/src/github.com/juju/juju/cmd/envcmd/base.go:109 +0x9c
github.com/juju/cmd.(*SuperCommand).Run(0xc8201d3600, 0xc82027d450, 0x0, 0x0)
    /home/jesse/go/src/github.com/juju/cmd/supercommand.go:442 +0x697
github.com/juju/cmd.Main(0x7fbb644cb6a8, 0xc8201d3600, 0xc82027d450, 0xc82000a100, 0x4, 0x4, 0x1)
    /home/jesse/go/src/github.com/juju/cmd/cmd.go:279 +0x2fc
github.com/juju/juju/cmd/juju/commands.Main(0xc82000a0f0, 0x5, 0x5)
    /home/jesse/go/src/github.com/juju/juju/cmd/juju/commands/main.go:72 +0x4fa
main.main()
    /home/jesse/go/src/github.com/juju/juju/cmd/juju/main.go:15 +0x3b

goroutine 17 [syscall, locked to thread]:
runtime.goexit()
    /usr/lib/go/src/runtime/asm_amd64.s:1696 +0x1

goroutine 5 [syscall]:
os/signal.loop()
    /usr/lib/go/src/os/signal/signal_unix.go:22 +0x18
created by os/signal.init.1
    /usr/lib/go/src/os/signal/signal_unix.go:28 +0x37
ERROR exit status 2

This occured because his code had called conn.Close while there were Signal messages still being delivered to the inWorker goroutine. Close should wait until inWorker has exited before closing the signal channels.

mnaboka commented Mar 4, 2016

Anyone has a fix for it? I have got exactly the same error

panic: send on closed channel

goroutine 1149 [running]:
panic(0x7512e0, 0xc8202e5260)
    /usr/local/go/src/runtime/panic.go:464 +0x3e6
github.com/godbus/dbus.(*Conn).inWorker(0xc820070a20)
    /Users/mnaboka/projects/go/src/github.com/godbus/dbus/conn.go:342 +0x11c3
created by github.com/godbus/dbus.(*Conn).Auth
    /Users/mnaboka/projects/go/src/github.com/godbus/dbus/auth.go:118 +0xf3d

mnaboka commented Mar 4, 2016

Here is my function, i call it a number of times every 60 seconds to get properties

func (sd *Systemd) GetUnitProperties(pname string) (result map[string]interface{}, err error) {
    dcon, err := dbus.New()
    if err != nil {
        log.Error(err)
        return result, err
    }
    result, err = dcon.GetUnitProperties(pname)
    dcon.Close()
    if err != nil {
        log.Error(err)
        return result, err
    }
    return result, err
}
Owner

philips commented Mar 4, 2016

I would accept a patch to fix this but our use cases all keep the connection open until crash.

@natefinch natefinch referenced this issue May 6, 2016

Merged

fix bug #45 #64

@philips philips closed this in #64 May 6, 2016

philips added a commit that referenced this issue May 6, 2016

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment