Open TETYYS opened 6 years ago
Library versions:
"botan": "1.12.9",
"botan-math": "1.0.3",
"diet-ng": "1.4.5",
"eventcore": "0.8.35",
"libasync": "0.8.3",
"libevent": "2.0.2+2.0.16",
"memutils": "0.4.10",
"mir-linux-kernel": "1.0.0",
"openssl": "1.1.6+1.0.1g",
"stdx-allocator": "2.77.2",
"taggedalgebraic": "0.10.11",
"vibe-core": "1.4.0",
"vibe-d": "0.8.4"
~I think this issue happens because each worker thread have their own event loops and each event loop has their own FD pool. When connect and close are combined with runWorkerTaskH
, sometimes close
is called on different event loop the connection was created on.~
This code snippet reproduces this issue (runTask
instead of runWorkerTaskH
gives same result):
import vibe.vibe;
void fx()
{
TCPConnection conn;
setTimer(2.seconds, {
conn.close();
});
conn = connectTCP("google.com", 80);
}
void main()
{
foreach (x; 0 .. 100) {
runWorkerTaskH(&fx);
}
runApplication();
}
When this runs fine:
import vibe.vibe;
void fx()
{
TCPConnection conn;
runTask((TCPConnection c), {
sleep(2.seconds);
c.close();
}, conn);
conn = connectTCP("google.com", 80);
}
void main()
{
foreach (x; 0 .. 100) {
runWorkerTaskH(&fx);
}
runApplication();
}
Now this points that this is reference count issue.
On unknown circumstances, when trying to close a
TCPConnection
an assert occurs:TCPConnection
is not closed from anywhere else in the code.