On 06.09.2012 02:30, Alex Rousskov wrote:
On 09/05/2012 03:32 AM, Alexander Komyagin wrote:
On Tue, 2012-09-04 at 09:16 -0600, Alex Rousskov wrote:

Again, I hope that this trick is not needed to solve your problem, and I am worried that it will cause more/different problems elsewhere. I would recommend fixing CommOpener instead. If _that_ is not sufficient, we can
discuss appropriate low-level enhancements.

Both things shall be fixed, IMHO.

If double-connect is not needed, we should not introduce it. AFAICT,
double-connect is an attempt to cope with a bug in higher-level code. We
should fix that bug and see if that is sufficient. If it is not
sufficient, we should evaluate why and only then add appropriate
low-level code if needed.

It's there to fix an async race condition of Squid vs TCP:

1) the timeout occurs ... timeout AsyncCall is scheduled.
2) the socket TCP completes ... completed AsyncCall is scheduled.
3) timeout call is handled:
a) if FD is ready use it, terminate the job early as a success (side effect: cancel the pending completed Call)
  b) else, terminate the job early as a fail.
4) connection completed call is dropped is handled.


The 3a conditional test is what comm_connect_addr() is doing on timeout. The switch case in ConnOpener::connect() is handling the multi-state output of the 3a check.

If you can find a cleaner way to rewrite the ConnOpener::connect() and comm_connect_addr() call chain for the timeout case it should be duplicated and polished into the timeout() handler.

Amos

Reply via email to