RobotsAndPencils / buford

A push notification delivery engine for the new HTTP/2 APNS service.
MIT License
475 stars 52 forks source link

panic error #35

Closed WanliTian closed 8 years ago

WanliTian commented 8 years ago

panic: close of closed channel

goroutine 46 [running]: panic(0x7c8aa0, 0xc8206dc8c0) /home/users/tianwanli01/Code/Go/go-go1.6/src/runtime/panic.go:464 +0x3e6 golang.org/x/net/http2.(_ClientConn).streamByID(0xc820082b00, 0x100000001, 0x0) /home/users/tianwanli01/Code/Go/gopath/src/golang.org/x/net/http2/transport.go:913 +0x101 golang.org/x/net/http2.(_ClientConn).forgetStreamID(0xc820082b00, 0xc800000001) /home/users/tianwanli01/Code/Go/gopath/src/golang.org/x/net/http2/transport.go:904 +0x2e golang.org/x/net/http2.(_ClientConn).RoundTrip(0xc820082b00, 0xc82060c000, 0xc8206ee480, 0x0, 0x0) /home/users/tianwanli01/Code/Go/gopath/src/golang.org/x/net/http2/transport.go:605 +0x600 golang.org/x/net/http2.(_Transport).RoundTripOpt(0xc8206308c0, 0xc82060c000, 0xc820045300, 0xc8204fc300, 0x0, 0x0) /home/users/tianwanli01/Code/Go/gopath/src/golang.org/x/net/http2/transport.go:263 +0x296 golang.org/x/net/http2.(_Transport).RoundTrip(0xc8206308c0, 0xc82060c000, 0x0, 0x0, 0x0) /home/users/tianwanli01/Code/Go/gopath/src/golang.org/x/net/http2/transport.go:238 +0x41 net/http.(_Transport).RoundTrip(0xc820748480, 0xc82060c000, 0xc820748480, 0x0, 0x0) /home/users/tianwanli01/Code/Go/go-go1.6/src/net/http/transport.go:318 +0x8e0 net/http.send(0xc82060c000, 0x7f87122d7528, 0xc820748480, 0x0, 0x0, 0x0, 0xc820634230, 0x0, 0x0) /home/users/tianwanli01/Code/Go/go-go1.6/src/net/http/client.go:260 +0x6b7 net/http.(_Client).send(0xc8206ef590, 0xc82060c000, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0) /home/users/tianwanli01/Code/Go/go-go1.6/src/net/http/client.go:155 +0x185 net/http.(_Client).doFollowingRedirects(0xc8206ef590, 0xc82060c000, 0x9ff768, 0x0, 0x0, 0x0) /home/users/tianwanli01/Code/Go/go-go1.6/src/net/http/client.go:475 +0x8a4 net/http.(_Client).Do(0xc8206ef590, 0xc82060c000, 0xc, 0x0, 0x0) /home/users/tianwanli01/Code/Go/go-go1.6/src/net/http/client.go:191 +0x1e4 github.com/WanliTian/apns/vendor/github.com/RobotsAndPencils/buford/push.(_Service).PushBytes(0xc82010f760, 0xc8206fc200, 0x40, 0xc820475e78, 0xc82070a090, 0x65, 0x83, 0x0, 0x0, 0x0, ...) /home/users/tianwanli01/Code/Go/gopath/src/github.com/WanliTian/apns/vendor/github.com/RobotsAndPencils/buford/push/service.go:173 +0x397 github.com/WanliTian/apns/vendor/github.com/RobotsAndPencils/buford/push.(_Service).Push(0xc82010f760, 0xc8206fc200, 0x40, 0xc820475e78, 0x7c7520, 0xc8207142a0, 0x0, 0x0, 0x0, 0x0) /home/users/tianwanli01/Code/Go/gopath/src/github.com/WanliTian/apns/vendor/github.com/RobotsAndPencils/buford/push/service.go:159 +0x105 main.(_Worker).start(0xc8206d6190)

WanliTian commented 8 years ago

When using this package, i got this error.

WanliTian commented 8 years ago

wrong certificate will cause this error. is there any readable way to indicate this?

groob commented 8 years ago

If using the wrong certificate triggers the error, it's possible that you're running into the same issue here #33

Can you run your program with GODEBUG=http2debug=2 and add the debug information in your bug report?

nathany commented 8 years ago

This is the first time I've seen it cause a panic.

Please also check that dependencies such as net/http2 are up-to-date.

WanliTian commented 8 years ago

this happends again with the right certificate

ERROR: 2016/03/10 11:47:05 panic error : close of closed channel ERROR: 2016/03/10 11:47:05 goroutine 47 [running]: main.TraceStack() /home/users/tianwanli01/Code/Go/gopath/src/github.com/WanliTian/apns/common_lib.go:84 +0x77 main.(_Worker).start.func1() /home/users/tianwanli01/Code/Go/gopath/src/github.com/WanliTian/apns/worker.go:65 +0xbc panic(0x7c8aa0, 0xc8206ab1a0) /home/users/tianwanli01/Code/Go/go-go1.6/src/runtime/panic.go:426 +0x4e9 golang.org/x/net/http2.(_ClientConn).streamByID(0xc8205aa6e0, 0x100000003, 0x0) /home/users/tianwanli01/Code/Go/gopath/src/golang.org/x/net/http2/transport.go:913 +0x101 golang.org/x/net/http2.(_ClientConn).forgetStreamID(0xc8205aa6e0, 0xc800000003) /home/users/tianwanli01/Code/Go/gopath/src/golang.org/x/net/http2/transport.go:904 +0x2e golang.org/x/net/http2.(_ClientConn).RoundTrip(0xc8205aa6e0, 0xc8208beee0, 0xc8209881e0, 0x0, 0x0) /home/users/tianwanli01/Code/Go/gopath/src/golang.org/x/net/http2/transport.go:605 +0x600 golang.org/x/net/http2.(_Transport).RoundTripOpt(0xc820675c00, 0xc8208beee0, 0xc820a21300, 0xc820aa1680, 0x0, 0x0) /home/users/tianwanli01/Code/Go/gopath/src/golang.org/x/net/http2/transport.go:263 +0x296 golang.org/x/net/http2.(_Transport).RoundTrip(0xc820675c00, 0xc8208beee0, 0xc8ffffffff, 0x0, 0x0) /home/users/tianwanli01/Code/Go/gopath/src/golang.org/x/net/http2/transport.go:238 +0x41 golang.org/x/net/http2.noDialH2RoundTripper.RoundTrip(0xc820675c00, 0xc8208beee0, 0xc820a99880, 0x0, 0x0) /home/users/tianwanli01/Code/Go/gopath/src/golang.org/x/net/http2/configure_transport.go:76 +0x3b net/http.(_Transport).RoundTrip(0xc820482540, 0xc8208beee0, 0xc820482540, 0x0, 0x0) /home/users/tianwanli01/Code/Go/go-go1.6/src/net/http/transport.go:278 +0x352 net/http.send(0xc8208beee0, 0x7f789f30a528, 0xc820482540, 0x0, 0x0, 0x0, 0xc820a99960, 0x0, 0x0) /home/users/tianwanli01/Code/Go/go-go1.6/src/net/http/client.go:260 +0x6b7 net/http.(_Client).send(0xc8206f3320, 0xc8208beee0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0) /home/users/tianwanli01/Code/Go/go-go1.6/src/net/http/client.go:155 +0x185 net/http.(_Client).doFollowingRedirects(0xc8206f3320, 0xc8208beee0, 0x9ff780, 0x0, 0x0, 0x0) /home/users/tianwanli01/Code/Go/go-go1.6/src/net/http/client.go:475 +0x8a4 net/http.(_Client).Do(0xc8206f3320, 0xc8208beee0, 0xc, 0x0, 0x0) /home/users/tianwanli01/Code/Go/go-go1.6/src/net/http/client.go:191 +0x1e4 github.com/WanliTian/apns/vendor/github.com/RobotsAndPencils/buford/push.(_Service).PushBytes(0xc8205a5f00, 0xc820a9d8c0, 0x40, 0xc820ab5e78, 0xc820a18120, 0x64, 0x83, 0x0, 0x0, 0x0, ...) /home/users/tianwanli01/Code/Go/gopath/src/github.com/WanliTian/apns/vendor/github.com/RobotsAndPencils/buford/push/service.go:173 +0x397 github.com/WanliTian/apns/vendor/github.com/RobotsAndPencils/buford/push.(_Service).Push(0xc8205a5f00, 0xc820a9d8c0, 0x40, 0xc820ab5e78, 0x7c7520, 0xc820aa17a0, 0x0, 0x0, 0x0, 0x0) /home/users/tianwanli01/Code/Go/gopath/src/github.com/WanliTian/apns/vendor/github.com/RobotsAndPencils/buford/push/service.go:159 +0x105 main.(*Worker).start(0xc8206e7b30)

nathany commented 8 years ago

Did you look on line 84 of github.com/WanliTian/apns/common_lib.go?

There are no channels or calls to close channels in Buford itself. Of course there are channels in the net/http2 libraries though, but first of all, are you using channels in your own code?

WanliTian commented 8 years ago

82 func TraceStack() { 83 buf := make([]byte, 1<<16) 84 runtime.Stack(buf, true) 85 Errorf("%s", buf) 86 }

WanliTian commented 8 years ago

i use this code to print stacktrace

nathany commented 8 years ago

and what's at github.com/WanliTian/apns/worker.go:65?

WanliTian commented 8 years ago

I found that my net/http2 is too old. i replace my net/http2 package and this error has not appeared for now.

i will watch it for a while.

nathany commented 8 years ago

awesome. please open a new issue if you run into any more problems

WanliTian commented 8 years ago

i find the wrong code for net/http2 package. in the transport.go

//the newest package:
1057 func (cc *ClientConn) streamByID(id uint32, andRemove bool) *clientStream {
1058     cc.mu.Lock()
1059     defer cc.mu.Unlock()
1060     cs := cc.streams[id]
1061     if andRemove && cs != nil && !cc.closed {
1062         delete(cc.streams, id)
1063         close(cs.done)
1064     }
1065     return cs
1066 }

the old version
 907 func (cc *ClientConn) streamByID(id uint32, andRemove bool) *clientStream {
 908     cc.mu.Lock()
 909     defer cc.mu.Unlock()
 910     cs := cc.streams[id]
 911     if andRemove && cs != nil {
 912         delete(cc.streams, id)
 913         close(cs.done)
 914     }
 915     return cs
 916 }