多数の TCP 接続を並行して確立しようとすると、潜在的なバグと思われる奇妙な動作が見られgen_tcp
ます。
シナリオは、複数の同時アクセプターを持つポートでリッスンするサーバーです。クライアントから を呼び出して接続を確立しgen_tcp:connect/3
、その後サーバーに「Ping」メッセージを送信し、パッシブ モードで「Pong」応答を待ちます。「get_tcp:connect/3」呼び出しを連続して実行すると、多数の接続 (最大 28000 までテストしました) を含め、すべて正常に動作します。
この問題は、多数の接続を並行して確立しようとすると発生します (マシンによっては、75 ~ 数百の間)。ほとんどの接続は引き続き確立されますが、一部の接続はclosed
エラーで失敗しますgen_tcp:recv/3
。奇妙なことに、これらの接続は以前は失敗せず、 と の呼び出しgen_tcp:connect/3
はgen_tcp:send/2
両方とも成功していました (つまり、 が返されましたok
)。サーバー側では、これらの「奇妙な」接続に一致する接続が表示されません。つまり、返されませんgen_tcp:accept/1
。私の理解では、「get_tcp:connect/3」が成功すると、サーバー側で一致する受け入れられた接続が得られるはずです。
私はすでにバグ レポートを提出しました。そこには、より詳細な説明と、問題を示す最小限のコード例があります。Linux と Mac OS X で問題を再現し、Erlang の異なるバージョンを使用することができました。
ここでの私の質問は次のとおりです。
- 誰でも問題を再現でき、これが誤った動作であることを確認できますか?
- 回避策のアイデアはありますか? この問題に対処するには、すべての接続を順番に開始する必要があります (これには永遠に時間がかかります)。