Skip to content

Session.Done 종료 결과를 여러 호출자가 일관되게 관찰할 수 있도록 API 개선 #23

Description

@leehyowon14

요약

Session.Done()은 buffer 1의 chan error를 노출합니다. 프로세스 종료 오류를 한 번 전송한 뒤 채널을 닫기 때문에 첫 수신자만 실제 오류를 얻고, 이후 수신자는 닫힌 채널의 zero value인 nil을 받습니다.

  • 검토 기준: main@4e87765f95c106edb3c956cfad2abc1db64c0c39
  • 판정: API 동작 CONFIRMED
  • 우선순위: P3

영향

여러 goroutine 또는 lifecycle 함수가 종료를 기다리면 어느 호출자가 실제 오류를 받는지 스케줄링에 따라 달라집니다. 이는 현재 확인된 사용자 경로의 즉시 버그보다는 API 설계 위험입니다.

발생 조건 및 확인 범위

  • 같은 Done()을 둘 이상 순차 또는 동시 수신할 것
  • 프로세스가 non-nil 오류로 종료할 것
  • 첫 수신자가 오류 값을 소비할 것

직접 channel 테스트에서 첫 수신은 exit status 7, 두 번째는 nil을 반환했습니다. ready 이후 :exec 중 crash하는 runShell 경로는 80회 모두 실패를 반환해 false-success를 재현하지 못했습니다. 따라서 현재 shell이 성공을 잘못 반환한다고 주장하지 않습니다.

재현 및 검증 방법

  1. exit 7 helper session을 시작합니다.
  2. public lines를 drain합니다.
  3. Done()을 두 번 읽습니다.
  4. 현재 첫 결과만 오류이고 두 번째가 <nil>인지 확인합니다.
  5. concurrent waiter에서도 모든 호출자가 같은 결과를 보지 못하는지 확인합니다.

기대 동작

모든 waiter가 동일한 프로세스 종료 결과를 관찰할 수 있어야 합니다. close-only 알림과 저장된 오류, 또는 idempotent Wait() error를 고려할 수 있습니다.

완료 조건

  • 순차적으로 두 번 기다려도 같은 종료 결과를 얻는다.
  • concurrent waiter가 모두 같은 결과를 얻는다.
  • 성공 종료와 context cancel도 일관되게 표현한다.
  • WaitReady, killAndDrain, runShell, runExec을 새 API에 맞게 정리한다.
  • 현재 shell 종료·중단 동작에 회귀가 없다.
  • 다중 waiter 및 race 회귀 테스트를 추가한다.

관련 코드

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions