fix(core): treat 503 Service Unavailable as retryable quota error (#19642)

This commit is contained in:
Sehoon Shon
2026-02-20 14:51:53 -05:00
committed by GitHub
parent 239aa0909c
commit 723f269df6
3 changed files with 34 additions and 2 deletions

View File

@@ -20,7 +20,8 @@ async function run(cmd) {
stdio: ['pipe', 'pipe', 'ignore'],
});
return stdout.trim();
} catch (_e) { // eslint-disable-line @typescript-eslint/no-unused-vars
} catch (_e) {
// eslint-disable-line @typescript-eslint/no-unused-vars
return null;
}
}

View File

@@ -65,7 +65,23 @@ describe('classifyGoogleError', () => {
expect((result as RetryableQuotaError).message).toBe(rawError.message);
});
it('should return original error if code is not 429', () => {
it('should return RetryableQuotaError for 503 Service Unavailable', () => {
const apiError: GoogleApiError = {
code: 503,
message: 'Service Unavailable',
details: [],
};
vi.spyOn(errorParser, 'parseGoogleApiError').mockReturnValue(apiError);
const originalError = new Error('Service Unavailable');
const result = classifyGoogleError(originalError);
expect(result).toBeInstanceOf(RetryableQuotaError);
if (result instanceof RetryableQuotaError) {
expect(result.cause).toBe(apiError);
expect(result.message).toBe('Service Unavailable');
}
});
it('should return original error if code is not 429 or 503', () => {
const apiError: GoogleApiError = {
code: 500,
message: 'Server error',

View File

@@ -202,6 +202,21 @@ export function classifyGoogleError(error: unknown): unknown {
}
}
// Check for 503 Service Unavailable errors
if (status === 503) {
const errorMessage =
googleApiError?.message ||
(error instanceof Error ? error.message : String(error));
return new RetryableQuotaError(
errorMessage,
googleApiError ?? {
code: 503,
message: errorMessage,
details: [],
},
);
}
if (
!googleApiError ||
googleApiError.code !== 429 ||