[P1][stability] RelayStream::claim()에 timeout 및 lease 만료 cancellation 추가 #26

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

문제

SNI ingress나 TCP port connection이 target lease를 찾은 뒤 RelayStream::claim()을 호출하면 reverse session이 올 때까지 무기한 대기할 수 있습니다.

관련 후보:

  • crates/portal-relay/src/relay/stream.rs
  • crates/portal-relay/src/relay/sni.rs
  • crates/portal-relay/src/relay/tcp_port.rs

위험

  • public connection task가 계속 쌓일 수 있음
  • lease가 unregister/expire되어도 이미 잡은 Arc<RelayStream> 때문에 대기 지속 가능
  • TCP port에 연결만 많이 걸어도 task 누적 가능

제안

  • claim() 호출부에 configurable timeout 적용
  • lease unregister/expire 시 pending claim을 깨우거나 cancellation token 사용
  • 실패 시 HTTP ingress는 503, raw TCP는 명확히 close

예시 방향:

let reverse = tokio::time::timeout(Duration::from_secs(10), stream.claim(marker)).await;

완료 기준

  • reverse session이 없는 target으로 연결해도 task가 timeout 후 정리됨
  • lease 만료/삭제 시 pending claim이 해제됨
  • claim timeout 테스트 추가

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

## 문제 SNI ingress나 TCP port connection이 target lease를 찾은 뒤 `RelayStream::claim()`을 호출하면 reverse session이 올 때까지 무기한 대기할 수 있습니다. 관련 후보: - `crates/portal-relay/src/relay/stream.rs` - `crates/portal-relay/src/relay/sni.rs` - `crates/portal-relay/src/relay/tcp_port.rs` ## 위험 - public connection task가 계속 쌓일 수 있음 - lease가 unregister/expire되어도 이미 잡은 `Arc<RelayStream>` 때문에 대기 지속 가능 - TCP port에 연결만 많이 걸어도 task 누적 가능 ## 제안 - `claim()` 호출부에 configurable timeout 적용 - lease unregister/expire 시 pending claim을 깨우거나 cancellation token 사용 - 실패 시 HTTP ingress는 503, raw TCP는 명확히 close 예시 방향: ```rust let reverse = tokio::time::timeout(Duration::from_secs(10), stream.claim(marker)).await; ``` ## 완료 기준 - reverse session이 없는 target으로 연결해도 task가 timeout 후 정리됨 - lease 만료/삭제 시 pending claim이 해제됨 - claim timeout 테스트 추가 --- 검토 기준: 업로드된 Rust `portal-relay` 코드 정적 리뷰. 리뷰 환경에서는 `cargo check/test/clippy`를 실행하지 못했습니다.
Owner

수용했습니다. PR #62에서 RelayStream::claim() timeout과 lease unregister/expire 시 stream close wakeup을 추가했습니다. reverse session이 없거나 lease가 제거된 연결 task가 무기한 대기하지 않습니다. 검증: cargo test --locked, cargo clippy --locked --all-targets -- -D warnings.

수용했습니다. PR #62에서 RelayStream::claim() timeout과 lease unregister/expire 시 stream close wakeup을 추가했습니다. reverse session이 없거나 lease가 제거된 연결 task가 무기한 대기하지 않습니다. 검증: cargo test --locked, cargo clippy --locked --all-targets -- -D warnings.
gofix closed this issue 2026-05-03 18:58:37 +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#26
No description provided.