swift-nio: TCPConnection handlers never deallocated

Expected behavior

[what you expected to happen] deinit aways called

Actual behavior

[what actually happened] deinit called sametimes

Steps to reproduce

  1. Compile NIOEchoServer my implementation with close on idle timeout timer: NIOSrv.zip run it on separated Virtual Machine A (I use external server)

  2. Open 20000 TCP connects You may use this: NetLoadTest 2.zip run it on separated Virtual Machine B (I use external server)

  3. Press Ctrl+C on Virtual Machine B // result: not all connects on server side (Virtual Machine A: are closed even after timeout)

This scenario does not reproduce on 127.0.0.1 (only on differrent servers)

If possible, minimal yet complete reproducer code (or URL to code)

[anything to help us reproducing the issue]

SwiftNIO version/commit hash

      "revision": "87dbd0216c47ea2e7ddb1b545271b716e03b943e",
      "version": "1.13.1"

[the SwiftNIO tag/commit hash]

Swift & OS version (output of swift --version && uname -a)

Swift version 4.2.3 (swift-4.2.3-RELEASE) Target: x86_64-unknown-linux-gnu Linux us-san-gate0 4.4.0-142-generic #168-Ubuntu SMP Wed Jan 16 21:00:45 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux ubuntu 16.0.4

About this issue

  • Original URL
  • State: closed
  • Created 5 years ago
  • Reactions: 4
  • Comments: 31 (12 by maintainers)

Commits related to this issue

Most upvoted comments

@allright ok, I found the bug. If you can, it would be awesome if you could confirm the fix this way:

swift package edit swift-nio
( cd Packages/swift-nio; echo ZGlmZiAtLWdpdCBhL1NvdXJjZXMvTklPL1NlbGVjdG9yLnN3aWZ0IGIvU291cmNlcy9OSU8vU2VsZWN0b3Iuc3dpZnQKaW5kZXggZmQwYzgzZDkuLmI3YzJhODRjIDEwMDY0NAotLS0gYS9Tb3VyY2VzL05JTy9TZWxlY3Rvci5zd2lmdAorKysgYi9Tb3VyY2VzL05JTy9TZWxlY3Rvci5zd2lmdApAQCAtMjk4LDcgKzI5OCw3IEBAIGZpbmFsIGNsYXNzIFNlbGVjdG9yPFI6IFJlZ2lzdHJhdGlvbj4gewogICAgICAgICB0cnkgRXBvbGwuZXBvbGxfY3RsKGVwZmQ6IHNlbGYuZmQsIG9wOiBFcG9sbC5FUE9MTF9DVExfQURELCBmZDogZXZlbnRmZCwgZXZlbnQ6ICZldikKIAogICAgICAgICB2YXIgdGltZXJldiA9IEVwb2xsLmVwb2xsX2V2ZW50KCkKLSAgICAgICAgdGltZXJldi5ldmVudHMgPSBFcG9sbC5FUE9MTElOIHwgRXBvbGwuRVBPTExFUlIgfCBFcG9sbC5FUE9MTFJESFVQIHwgRXBvbGwuRVBPTExFVAorICAgICAgICB0aW1lcmV2LmV2ZW50cyA9IEVwb2xsLkVQT0xMSU4gfCBFcG9sbC5FUE9MTEVSUiB8IEVwb2xsLkVQT0xMUkRIVVAKICAgICAgICAgdGltZXJldi5kYXRhLmZkID0gdGltZXJmZAogICAgICAgICB0cnkgRXBvbGwuZXBvbGxfY3RsKGVwZmQ6IHNlbGYuZmQsIG9wOiBFcG9sbC5FUE9MTF9DVExfQURELCBmZDogdGltZXJmZCwgZXZlbnQ6ICZ0aW1lcmV2KQogI2Vsc2UK | base64 -$( if [[ "$(uname -s)" == Darwin ]]; then echo D; else echo d; fi)  | git apply; )

after that I believe it should be fixed. If you prefer, you can also manually apply the diff:

diff --git a/Sources/NIO/Selector.swift b/Sources/NIO/Selector.swift
index fd0c83d9..b7c2a84c 100644
--- a/Sources/NIO/Selector.swift
+++ b/Sources/NIO/Selector.swift
@@ -298,7 +298,7 @@ final class Selector<R: Registration> {
         try Epoll.epoll_ctl(epfd: self.fd, op: Epoll.EPOLL_CTL_ADD, fd: eventfd, event: &ev)
 
         var timerev = Epoll.epoll_event()
-        timerev.events = Epoll.EPOLLIN | Epoll.EPOLLERR | Epoll.EPOLLRDHUP | Epoll.EPOLLET
+        timerev.events = Epoll.EPOLLIN | Epoll.EPOLLERR | Epoll.EPOLLRDHUP
         timerev.data.fd = timerfd
         try Epoll.epoll_ctl(epfd: self.fd, op: Epoll.EPOLL_CTL_ADD, fd: timerfd, event: &timerev)
 #else

@allright we released 1.13.2 which contains this bug fix

I’have just retested again several times and I confirm. Epoll.EPOLLET - fix this issue.

With this flag, I observe freeze. Without - all ok! I think you may close issue:) Very big Thanks!

@allright ok, I’ll have a look again

Sorry, I removed my comment - it was false. There were 300 seconds timeout in my code (IdleStateHandler). Will test your diff exactly. After 300 seconds all handlers are closed success

Will confirm on Monday only