补充 Agent HTTP 停止链路回归
验证客户端断开会 drop Axum handler 并释放会话锁 验证 Pingora 将下游断开传播到 api-server 上游
This commit is contained in:
@@ -383,6 +383,8 @@ async function startApiMock() {
|
||||
const state = {
|
||||
requests: [],
|
||||
releaseHold: undefined,
|
||||
releaseAbortHold: undefined,
|
||||
closedBeforeResponse: [],
|
||||
};
|
||||
const server = http.createServer(async (request, response) => {
|
||||
let body;
|
||||
@@ -406,11 +408,20 @@ async function startApiMock() {
|
||||
headers: request.headers,
|
||||
body,
|
||||
});
|
||||
response.on('close', () => {
|
||||
if (!response.writableEnded) {
|
||||
state.closedBeforeResponse.push(request.url || '');
|
||||
}
|
||||
});
|
||||
|
||||
if (request.url?.endsWith('/hold')) {
|
||||
await new Promise((resolve) => {
|
||||
state.releaseHold = resolve;
|
||||
});
|
||||
} else if (request.url?.endsWith('/abort-hold')) {
|
||||
await new Promise((resolve) => {
|
||||
state.releaseAbortHold = resolve;
|
||||
});
|
||||
} else if (request.url?.endsWith('/upstream-close')) {
|
||||
request.socket.destroy();
|
||||
return;
|
||||
@@ -1006,6 +1017,7 @@ async function runSmokeCases(
|
||||
await expectChunkedLimit(baseUrl, '/api/upload');
|
||||
|
||||
await expectConcurrencyLimit(baseUrl, api);
|
||||
await expectDownstreamAbortCancelsUpstream(baseUrl, api);
|
||||
|
||||
const rateLimitHeaders = { 'X-Forwarded-For': '203.0.113.13' };
|
||||
const beforeRateLimitRequestCount = api.state.requests.length;
|
||||
@@ -1695,6 +1707,27 @@ async function expectConcurrencyLimit(baseUrl, api) {
|
||||
}
|
||||
}
|
||||
|
||||
async function expectDownstreamAbortCancelsUpstream(baseUrl, api) {
|
||||
console.log('[pingora-gateway-smoke] 下游中断传播到 API 上游');
|
||||
const route = '/api/abort-hold';
|
||||
const hold = await openRawHttpRequest(`${baseUrl}${route}`, {
|
||||
'X-Forwarded-For': '203.0.113.16',
|
||||
});
|
||||
|
||||
try {
|
||||
await waitForCondition(
|
||||
() => typeof api.state.releaseAbortHold === 'function',
|
||||
);
|
||||
hold.socket.destroy();
|
||||
await hold.done.catch(() => undefined);
|
||||
await waitForCondition(() =>
|
||||
api.state.closedBeforeResponse.includes(route),
|
||||
);
|
||||
} finally {
|
||||
api.state.releaseAbortHold?.();
|
||||
}
|
||||
}
|
||||
|
||||
async function expectWebSocketUpgrade(baseUrl, route, spacetime) {
|
||||
console.log('[pingora-gateway-smoke] SpacetimeDB WebSocket Upgrade');
|
||||
const url = new URL(route, baseUrl);
|
||||
|
||||
Reference in New Issue
Block a user