fix(gateway): resolve model switch failure and websocket timeouts during rapid oauth restarts (#266)
This commit is contained in:
committed by
GitHub
Unverified
parent
9532400053
commit
bc47b455b5
@@ -337,7 +337,11 @@ export class GatewayManager extends EventEmitter {
|
|||||||
});
|
});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
let startAttempts = 0;
|
||||||
|
const MAX_START_ATTEMPTS = 3;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
|
startAttempts++;
|
||||||
this.assertLifecycleEpoch(startEpoch, 'start');
|
this.assertLifecycleEpoch(startEpoch, 'start');
|
||||||
this.recentStartupStderrLines = [];
|
this.recentStartupStderrLines = [];
|
||||||
try {
|
try {
|
||||||
@@ -390,6 +394,22 @@ export class GatewayManager extends EventEmitter {
|
|||||||
}
|
}
|
||||||
logger.error('OpenClaw doctor repair failed; not retrying Gateway startup');
|
logger.error('OpenClaw doctor repair failed; not retrying Gateway startup');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Retry on transient connect errors
|
||||||
|
const errMsg = String(error);
|
||||||
|
const isTransientError =
|
||||||
|
errMsg.includes('WebSocket closed before handshake') ||
|
||||||
|
errMsg.includes('ECONNREFUSED') ||
|
||||||
|
errMsg.includes('Gateway process exited before becoming ready') ||
|
||||||
|
errMsg.includes('Timed out waiting for connect.challenge') ||
|
||||||
|
errMsg.includes('Connect handshake timeout');
|
||||||
|
|
||||||
|
if (startAttempts < MAX_START_ATTEMPTS && isTransientError) {
|
||||||
|
logger.warn(`Transient start error: ${errMsg}. Retrying... (${startAttempts}/${MAX_START_ATTEMPTS})`);
|
||||||
|
await new Promise((r) => setTimeout(r, 1000));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1312,7 +1312,10 @@ function registerProviderHandlers(gatewayManager: GatewayManager): void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Debounced restart so the gateway picks up the new default provider.
|
// Debounced restart so the gateway picks up the new default provider.
|
||||||
if (gatewayManager.isConnected()) {
|
// Because OAuth success triggers a debounced restart, the gateway might not be
|
||||||
|
// currently connected ('starting' or 'reconnecting'). Checking if it is simply
|
||||||
|
// not 'stopped' ensures the restart request is correctly queued or coalesced.
|
||||||
|
if (gatewayManager.getStatus().state !== 'stopped') {
|
||||||
logger.info(`Scheduling Gateway restart after provider switch to "${ock}"`);
|
logger.info(`Scheduling Gateway restart after provider switch to "${ock}"`);
|
||||||
gatewayManager.debouncedRestart();
|
gatewayManager.debouncedRestart();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user