nodejs / node

Node.js JavaScript runtime ✨🐢🚀✨
https://nodejs.org
Other
108.05k stars 29.83k forks source link

ibmi: test.parallel.test-http-pipeline fails #48047

Open abmusse opened 1 year ago

abmusse commented 1 year ago

I ran this test BEFORE applying this patch on IBM i, AIX, and Linux. The following were my results:

IBM i

$ NODE_DEBUG=net,http,timers ./node test/parallel/test-http-pipeline-flood.js
...

HTTP 388536: write ret = true
HTTP 388536: outgoing message end.
HTTP 388536: SERVER socketOnParserExecute 65535
HTTP 388536: pause parser
NET 388536: _onTimeout
NET 388536: SERVER _emitCloseIfDrained
NET 388536: SERVER handle? false   connections? 1
NET 388536: _onTimeout

AIX

$ NODE_DEBUG=net,http,timers ../node-v18.15.0-aix-ppc64/bin/node test/parallel/test-http-pipeline-flood.js

...

HTTP 12779906: write ret = true
HTTP 12779906: outgoing message end.
HTTP 12779906: SERVER socketOnParserExecute 32768
HTTP 12779906: pause parser
NET 12779906: _onTimeout
NET 12779906: destroy
NET 12779906: close
NET 12779906: close handle
NET 12779906: has server
NET 12779906: SERVER _emitCloseIfDrained
NET 12779906: SERVER handle? true   connections? 0
NET 12779906: emit close
HTTP 12779906: server socket close
NET 12779906: SERVER _emitCloseIfDrained
NET 12779906: SERVER: emit close

Linux

$ NODE_DEBUG=net,http,timers node test/parallel/test-http-pipeline-flood.js
...

HTTP 35447: write ret = true
HTTP 35447: outgoing message end.
HTTP 35447: SERVER socketOnParserExecute 65464
HTTP 35447: pause parser
NET 35447: _onTimeout
NET 35447: destroy
NET 35447: close
NET 35447: close handle
NET 35447: has server
NET 35447: SERVER _emitCloseIfDrained
NET 35447: SERVER handle? true   connections? 0
NET 35447: emit close
HTTP 35447: server socket close
NET 35447: SERVER _emitCloseIfDrained
NET 35447: SERVER: emit close

The main difference is that on IBM i destroying and closing the client socket doen't happen after the timeout:

NET 35447: _onTimeout
NET 35447: destroy
NET 35447: close
NET 35447: close handle

Instead the timeout gets called a second time and the server just hangs until the test runner times out.

After Applying this patch the output on IBM i is:

HTTP 388626: write ret = true
HTTP 388626: outgoing message end.
HTTP 388626: SERVER socketOnParserExecute 65535
HTTP 388626: pause parser
NET 388626: _onTimeout
NET 388626: destroy
NET 388626: close
NET 388626: close handle
NET 388626: has server
NET 388626: SERVER _emitCloseIfDrained
NET 388626: SERVER handle? true   connections? 0
NET 388626: SERVER _emitCloseIfDrained
NET 388626: SERVER: emit close
NET 388626: emit close
HTTP 388626: server socket close

Any Ideas on how we can get this to work properly without having to call closeAllConnections?

Originally posted by @abmusse in https://github.com/nodejs/node/issues/47038#issuecomment-1464444028

abmusse commented 1 year ago

I've been in contact with the IBM i sockets team and this looks like a bug. For now its on the backlog with no ETA for a fix. I propose that we skip this test on IBM i until there is a resolution.

CC @richardlau @nodejs/platform-ibmi