Comments (4)
Edited out previous response as it was completely unhelpful even as an archive.
It turns out that the reason I had a closed channel, was because of this code
func SocketIO(...) {
...
go server.Serve()
defer server.Close()
return server
}
What this code does? It creates a server, calls server.Serve()
in a go routine, and then calls defer server.Close()
as soon as nothing else has to run in the function, and then it returns the server which is hosted on my respectful http handler.
socketio := SocketIO(...)
http.ServeAndListen(..., socketio)
Which means, that defer
will run as soon as the rest of the functions are done running in func SocketIO()
. Which means the channel will close. Which means that as soon as the server runs, or sends a message, the channel will be closed because defer server.Close()
is called.
Solution?
Dont call defer server.Close()
in a function that doesn't loop/runs a server. Because that will close SocketIO server, as its supposed to happen anyway.
from go-engine.io.
panic: close of closed channel
goroutine 500621 [running]:
panic(0x83ad60, 0xc82b1472f0)
/usr/local/go/src/runtime/panic.go:464 +0x3e6
github.com/googollee/go-engine%2eio.(*serverConn).OnClose(0xc82bd09790, 0x7f211aa30ee0, 0xc826105840)
/data/html/live_im_system/src/github.com/googollee/go-engine.io/server_conn.go:257 +0x1a2
github.com/googollee/go-engine.io/polling.(*Polling).Close(0xc826105840, 0x0, 0x0)
/data/html/live_im_system/src/github.com/googollee/go-engine.io/polling/server.go:67 +0x115
github.com/googollee/go-engine%2eio.(*serverConn).Close(0xc82bd09790, 0x0, 0x0)
/data/html/live_im_system/src/github.com/googollee/go-engine.io/server_conn.go:176 +0x217
github.com/googollee/go-engine%2eio.(*serverConn).pingLoop(0xc82bd09790)
/data/html/live_im_system/src/github.com/googollee/go-engine.io/server_conn.go:384 +0x416
created by github.com/googollee/go-engine%2eio.newServerConn
/data/html/live_im_system/src/github.com/googollee/go-engine.io/server_conn.go:112 +0x58e
from go-engine.io.
We're seeing the same thing right now.
github.com/feederco/spider/vendor/github.com/googollee/go-engine%2eio.(*serverConn).OnClose(0xc0f06acb60, 0xf95780, 0xc04268d640)
#011/Users/erik/golang/src/github.com/feederco/spider/vendor/github.com/googollee/go-engine.io/server_conn.go:261 +0xfb
github.com/feederco/spider/vendor/github.com/googollee/go-engine.io/polling.(*Polling).Close(0xc04268d640, 0xf95780, 0xc04268d640)
#011/Users/erik/golang/src/github.com/feederco/spider/vendor/github.com/googollee/go-engine.io/polling/server.go:67 +0xf5
github.com/feederco/spider/vendor/github.com/googollee/go-engine%2eio.(*serverConn).Close(0xc0f06acb60, 0xe23cbd, 0xa)
#011/Users/erik/golang/src/github.com/feederco/spider/vendor/github.com/googollee/go-engine.io/server_conn.go:175 +0xf5
github.com/feederco/spider/vendor/github.com/googollee/go-socket%2eio.(*socket).Emit(0xc037a03500, 0xe23cbd, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0)
#011/Users/erik/golang/src/github.com/feederco/spider/vendor/github.com/googollee/go-socket.io/socket.go:70 +0xc6
github.com/feederco/spider/cmd.startWebsockets.func1(0xf9a9e0, 0xc037a03500)
#011/Users/erik/golang/src/github.com/feederco/spider/cmd/pusher.go:332 +0x6fd
reflect.Value.call(0xc90a00, 0xeb2be8, 0x13, 0xe1cb20, 0x4, 0xc053cfa940, 0x1, 0x1, 0xe15ea0, 0x1, ...)
#011/usr/local/Cellar/go/1.11/libexec/src/reflect/value.go:447 +0x449
reflect.Value.Call(0xc90a00, 0xeb2be8, 0x13, 0xc053cfa940, 0x1, 0x1, 0xc06382bc50, 0xbd580e, 0xc0f06acb88)
#011/usr/local/Cellar/go/1.11/libexec/src/reflect/value.go:308 +0xa4
github.com/feederco/spider/vendor/github.com/googollee/go-socket%2eio.(*caller).Call(0xc028e5c000, 0xf9a9e0, 0xc037a03500, 0x1852528, 0x0, 0x0, 0x0, 0x0, 0x0)
#011/Users/erik/golang/src/github.com/feederco/spider/vendor/github.com/googollee/go-socket.io/caller.go:81 +0x355
github.com/feederco/spider/vendor/github.com/googollee/go-socket%2eio.(*socketHandler).onPacket(0xc072073da0, 0x0, 0xc06382bf28, 0x0, 0x0, 0x0, 0x0, 0x0)
#011/Users/erik/golang/src/github.com/feederco/spider/vendor/github.com/googollee/go-socket.io/handler.go:185 +0x2e8
github.com/feederco/spider/vendor/github.com/googollee/go-socket%2eio.(*socket).loop(0xc037a03500, 0x0, 0x0)
#011/Users/erik/golang/src/github.com/feederco/spider/vendor/github.com/googollee/go-socket.io/socket.go:140 +0x1e7
github.com/feederco/spider/vendor/github.com/googollee/go-socket%2eio.(*Server).loop.func1(0xc037a03500)
#011/Users/erik/golang/src/github.com/feederco/spider/vendor/github.com/googollee/go-socket.io/server.go:108 +0x2b
created by github.com/feederco/spider/vendor/github.com/googollee/go-socket%2eio.(*Server).loop
#011/Users/erik/golang/src/github.com/feederco/spider/vendor/github.com/googollee/go-socket.io/server.go:107 +0x93
systemd[1]: feeder.service: Main process exited, code=exited, status=2/INVALIDARGUMENT
Seems like the polling transport has some issues. I have not been able to reproduce this locally, it happens about once/twice per day on a server with 10k concurrent connections.
from go-engine.io.
Found a possible culprit in this discussion:
#63
from go-engine.io.
Related Issues (20)
- Stall in upgrade (race condition) HOT 7
- panic: close of closed channel HOT 6
- http: response.WriteHeader on hijacked connection HOT 1
- Polling p.sendChan may cause a great delay (20+ secs) HOT 1
- Panic on send to pingChan in OnPacket HOT 2
- Parser does not work with Batches of messages on a Packet HOT 1
- way to test engine.io? HOT 2
- Server.ServeHTTP: when newServerConn failed should decrease connection count HOT 1
- Goroutine leak HOT 1
- v1.4 现在是否已完工,能否线上使用,谢谢 HOT 2
- panic: concurrent write to websocket connection HOT 1
- panic: close of closed channel HOT 8
- Which socket io specification this go-engine.io implements? HOT 1
- Fix check origin gorilla web socket HOT 6
- PingChan can be closed outside of the pingLocker HOT 2
- read & write different goroutines concurrent HOT 4
- panic: concurrent write to websocket connection HOT 1
- Client read TCP timeout when pingTimeout is less than pingInterval
- PROJECT MOVED! To go-socket.io. Don't open new issues here!
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from go-engine.io.