Fail Faster

Al geruime tijd hoor ik klachten dat Xdebug applicaties vertraagt wanneer de debugger is ingeschakeld, zelfs als er geen IDE luistert.

Ik heb dit nooit kunnen reproduceren, omdat TCP-verbindingen naar localhost-poorten op Linux (en macOS) onmiddellijk mislukken als die poort niet open is. Xdebug wacht tot maximaal 200 ms bij het maken van een debugverbinding; dit is configureerbaar via de instelling xdebug.connecttimeoutms.

Als er echter niets luistert, zou er geen vertraging mogen zijn, aangezien het een onmiddellijke fout zou moeten zijn. In een issue uit 2024 schreef ik hierover:

De foutmelding ERR: Time-out connecting to debugging client, waited: 200 ms geeft aan dat je netwerkstack de verbinding niet onmiddellijk weigert als deze niet tot stand kan worden gebracht. Dat komt meestal door een ( verkeerd geconfigureerde) firewall.

Het blijkt echter niet om een firewall te gaan, maar om het feit dat Windows zelf hier onjuist reageert. In plaats van direct te falen, probeert Windows opnieuw TCP SYN-pakketten te verzenden om een verbinding tot stand te brengen. Dit is zinloos op de lokale loopback-interface, aangezien netwerkpakketten daar niet verloren kunnen gaan.

Via een bericht van Daniel Stenberg op Mastodon kwam ik achter de oorzaak en een oplossing. In een blogpost uit 2024 legt hij uit hoe dit het 'Happy Eyeballs'-algoritme van curl beïnvloedt. Hoewel Xdebug geen gebruik maakt van Happy Eyeballs, is het onderliggende probleem hetzelfde.

Vorige week schreef Marcel Jamin naar de curl-mailinglijst met een oplossing. Deze oplossing schakelt het retry-mechanisme voor het tot stand brengen van een verbinding uit. Dit betekent dat er op Windows voortaan ook geen vertraging meer is.

Ik heb vandaag een pull request voor Xdebug samengevoegd waarin deze oplossing is geïmplementeerd. De patch maakt deel uit van de komende Xdebug 3.6-release.