요약
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이 성공을 잘못 반환한다고 주장하지 않습니다.
재현 및 검증 방법
- exit 7 helper session을 시작합니다.
- public lines를 drain합니다.
Done()을 두 번 읽습니다.
- 현재 첫 결과만 오류이고 두 번째가
<nil>인지 확인합니다.
- concurrent waiter에서도 모든 호출자가 같은 결과를 보지 못하는지 확인합니다.
기대 동작
모든 waiter가 동일한 프로세스 종료 결과를 관찰할 수 있어야 합니다. close-only 알림과 저장된 오류, 또는 idempotent Wait() error를 고려할 수 있습니다.
완료 조건
관련 코드
요약
Session.Done()은 buffer 1의chan error를 노출합니다. 프로세스 종료 오류를 한 번 전송한 뒤 채널을 닫기 때문에 첫 수신자만 실제 오류를 얻고, 이후 수신자는 닫힌 채널의 zero value인nil을 받습니다.main@4e87765f95c106edb3c956cfad2abc1db64c0c39영향
여러 goroutine 또는 lifecycle 함수가 종료를 기다리면 어느 호출자가 실제 오류를 받는지 스케줄링에 따라 달라집니다. 이는 현재 확인된 사용자 경로의 즉시 버그보다는 API 설계 위험입니다.
발생 조건 및 확인 범위
Done()을 둘 이상 순차 또는 동시 수신할 것직접 channel 테스트에서 첫 수신은
exit status 7, 두 번째는nil을 반환했습니다. ready 이후:exec중 crash하는runShell경로는 80회 모두 실패를 반환해 false-success를 재현하지 못했습니다. 따라서 현재 shell이 성공을 잘못 반환한다고 주장하지 않습니다.재현 및 검증 방법
Done()을 두 번 읽습니다.<nil>인지 확인합니다.기대 동작
모든 waiter가 동일한 프로세스 종료 결과를 관찰할 수 있어야 합니다. close-only 알림과 저장된 오류, 또는 idempotent
Wait() error를 고려할 수 있습니다.완료 조건
WaitReady,killAndDrain,runShell,runExec을 새 API에 맞게 정리한다.관련 코드
Sessionfields와 Startdone전송WaitReady