[WIP] Implement architectural fixes for EADDRINUSE retry loop#273
Closed
Copilot wants to merge 1 commit into
Closed
[WIP] Implement architectural fixes for EADDRINUSE retry loop#273Copilot wants to merge 1 commit into
Copilot wants to merge 1 commit into
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
build-src/dev-launcher.gopassiv machen:checkServerHealth()über Ports 3000-3009,autoFixPort()ohne TCP-Portchecksbuild-src/launcher-gui.gopassiv machen:checkServerHealth()über Ports 3000-3009,autoFixPort()ohne TCP-Portchecksapp/modules/port-manager.jsanpassen:resolvePort(excludePorts = [])und Exclusion für preferred + fallback Portsapp/server.jsanpassen:failedPorts-Set und EADDRINUSE-Retry mitportManager.resolvePort(Array.from(failedPorts))app/CHANGELOG.txtmit den durchgeführten Fixes aktualisierenparallel_validationdurchführenOriginal prompt
Setze die architektonischen Fixes für das Port-Race-Condition-Problem (EADDRINUSE Retry Loop) um, die wir zuvor besprochen haben:
Go-Launcher passiv machen (
build-src/dev-launcher.go&build-src/launcher-gui.go):checkServerHealth(), sodass es eine Schleife über die Ports 3000 bis 3009 macht und via HTTP (checkServerHealthOnPort(port)) prüft, ob Node.js antwortet. Wenn ein Port antwortet, setzel.alternativePort = portund gibtruezurück.autoFixPort(), sodass KEINE TCP-Verbindungen (checkPortAvailable) mehr aufgebaut werden, umTIME_WAITRace-Conditions mit Node.js zu vermeiden. Die Funktion soll nur noch loggen, dass das Port-Management an Node.js delegiert wird.PortManager Blacklisting (
app/modules/port-manager.js):resolvePort(excludePorts = [])um den ParameterexcludePorts.excludePortsenthalten sind, sowohl beimpreferredPortals auch bei denfallbackPorts.EADDRINUSE Retry-Loop im Server (
app/server.js):server.on('error')Handler ganz unten.SetnamensfailedPortsaußerhalb des Handlers.err.code === 'EADDRINUSE'auftritt, füge den aktuellenPORTzufailedPortshinzu.portManager.resolvePort(Array.from(failedPorts))auf, um garantiert den nächsten freien Port zu erhalten und eine Endlosschleife zu verhindern.Setze das präzise und ohne Verlust von Features um.
The following is the prior conversation context from the user's chat exploration (may be truncated):
User: ⏳ Warte auf Port-Freigabe nach Shutdown... macht massive probleme. startet software nicht oder software crashed. warum, und wie fix?
Assistant: Die Ursache für die massiven Probleme und Abstürze liegt in einem architektonischen Konflikt zwischen dem Go-Launcher und dem Node.js-Backend sowie einem kritischen Bug in der Health-Check-Logik des Launchers.
Tiefenanalyse: Warum es kracht
Fataler Bug: Hardcoded Health-Check-Port im Go-Launcher
Wenn der Go-Launcher nach 15 Sekunden feststellt, dass Port 3000 im
TIME_WAIThängt, wechselt er zu einem alternativen Port (z. B. 3001) und startet Node.js mitPORT=3001.Die Funktion
checkServerHealth()inbuild-src/dev-launcher.goundbuild-src/launcher-gui.goruft aber weiterhin hartcodiertl.checkServerHealthOnPort(3000)auf.Folge: Node.js läuft erfolgreich auf 3001, der Launcher pingt endlos Port 3000, läuft in einen Timeout und tötet/bricht den Startvorgang ab.
Race Condition durch doppeltes Port-Management
Der Node.js
PortManager(app/modules/port-manager.js) ist hochintelligent (sucht nach PIDs, killt alte Instanzen). Der Go-Launcher prüft nur plump vianet.Listen("tcp", address), was bei einem Socket im StatusTIME_WAIT(nach einem sauberen Shutdown) sofort blockiert. Die 15 Sekunden Wartezeit im Launcher hebeln den intelligenten Node-Manager aus und erzwingen einen unnnötigen Fallback, der dann durch Bug Consolidate documentation for AI assistants and clean repository structure #1 zum Crash führt.Die Fixes (Produktionsreif)
Du musst sowohl den Go-Launcher als auch die Überlappung der Port-Logik korrigieren. Keine Pseudocode-Lücken, hier sind die vollständigen, bereinigten Blöcke.
1. Fix: Dynamischer Health-Check im Launcher
Ersetze die hartcodierte Methode in beiden Launcher-Dateien (
build-src/dev-launcher.goundbuild-src/launcher-gui.go).2. Fix: TIME_WAIT Handling & PortManager-Delegation
Wir reduzieren die blockierende Wartezeit im Go-Launcher drastisch auf 3 Sekunden. Da das Node.js-Backend mit seinem
PortManagerfähig ist, den Port selbst aufzuräumen (action: 'killed_old_instance') oderSO_REUSEADDRVerhalten zu emulieren, übergeben wir Node die Verantwortung, anstatt im Go-Launcher alles aufzuhalten.Ersetze die Logik in
autoFixPort()(ebenfalls in beiden.goDateien):