[P1][bug] /sdk/connect queue full 시 200 OK를 쓰기 전에 503 반환 #28

Closed
opened 2026-05-02 04:34:06 +00:00 by boxqkrtm · 1 comment

문제

/sdk/connect 처리에서 HTTP 200 OK를 먼저 쓴 뒤 stream.offer(io)를 호출하는 구조입니다. ready queue가 full이면 이미 200을 보낸 상태라 정상 error response를 반환할 수 없습니다.

관련 후보:

  • crates/portal-relay/src/api/mod.rs
  • crates/portal-relay/src/api/sdk.rs
  • crates/portal-relay/src/relay/stream.rs

영향

  • client는 연결이 수락된 것으로 오인할 수 있음
  • queue full 상황의 에러 처리가 프로토콜 경계 뒤에서 발생
  • 운영 중 capacity 문제를 client가 명확히 인지하지 못함

제안

  • queue capacity/reservation을 response write 전에 수행
  • offer()가 response write까지 책임지도록 boundary 재설계
  • full이면 503 또는 명확한 API error 반환

완료 기준

  • ready queue full 상황에서 /sdk/connect는 200을 쓰지 않고 실패 응답 반환
  • 정상 connect path는 기존 호환성 유지
  • queue full regression test 추가

검토 기준: 업로드된 Rust portal-relay 코드 정적 리뷰. 리뷰 환경에서는 cargo check/test/clippy를 실행하지 못했습니다.

## 문제 `/sdk/connect` 처리에서 HTTP 200 OK를 먼저 쓴 뒤 `stream.offer(io)`를 호출하는 구조입니다. ready queue가 full이면 이미 200을 보낸 상태라 정상 error response를 반환할 수 없습니다. 관련 후보: - `crates/portal-relay/src/api/mod.rs` - `crates/portal-relay/src/api/sdk.rs` - `crates/portal-relay/src/relay/stream.rs` ## 영향 - client는 연결이 수락된 것으로 오인할 수 있음 - queue full 상황의 에러 처리가 프로토콜 경계 뒤에서 발생 - 운영 중 capacity 문제를 client가 명확히 인지하지 못함 ## 제안 - queue capacity/reservation을 response write 전에 수행 - `offer()`가 response write까지 책임지도록 boundary 재설계 - full이면 503 또는 명확한 API error 반환 ## 완료 기준 - ready queue full 상황에서 `/sdk/connect`는 200을 쓰지 않고 실패 응답 반환 - 정상 connect path는 기존 호환성 유지 - queue full regression test 추가 --- 검토 기준: 업로드된 Rust `portal-relay` 코드 정적 리뷰. 리뷰 환경에서는 `cargo check/test/clippy`를 실행하지 못했습니다.
Owner

수용했습니다. PR #62에서 /sdk/connect가 200 OK를 쓰기 전에 reverse session queue reservation을 먼저 잡도록 변경했습니다. queue full이면 503 응답을 보냅니다. 검증: cargo test --locked, cargo clippy --locked --all-targets -- -D warnings.

수용했습니다. PR #62에서 /sdk/connect가 200 OK를 쓰기 전에 reverse session queue reservation을 먼저 잡도록 변경했습니다. queue full이면 503 응답을 보냅니다. 검증: cargo test --locked, cargo clippy --locked --all-targets -- -D warnings.
gofix closed this issue 2026-05-03 18:58:38 +00:00
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
gofix/portal-tunnel-rs#28
No description provided.