요약
Session.Execute는 BEGIN과 END marker 사이의 일반 로그를 제한 없이 CommandResult.Messages에 append합니다. public Lines()가 소비되지 않으면 fan-out queue도 제한 없이 증가합니다.
- 검토 기준:
main@4e87765f95c106edb3c956cfad2abc1db64c0c39
- 판정: 선형 메모리 증가 CONFIRMED, 실제 OOM은 CONDITIONAL
- 우선순위: P2
영향
한 명령이 매우 많은 로그를 출력하면 명령 완료 전까지 메모리가 출력량에 비례해 증가합니다. 충분한 출력에서 OOM 가능성이 있으나 실제 OOM 종료까지 유도하지는 않았습니다.
발생 조건 및 확인 범위
- BEGIN/END marker 사이에 대량 일반 로그가 출력될 것
- 호출자가 메시지를 streaming하지 않고 결과를 기다릴 것
- public
Lines()도 소비되지 않으면 fan-out queue까지 축적됨
100,000줄 fixture에서 len(result.Messages)==100000이고 한 관측에서 heap allocation이 약 14.5MB 증가했습니다. 수치는 runtime/GC에 따라 달라집니다.
재현 및 검증 방법
- helper가 Execute marker 사이에 100,000줄을 출력하도록 합니다.
- 실행 중
session.Lines()를 drain하지 않습니다.
Session.Execute 전후 runtime.ReadMemStats를 기록합니다.
len(result.Messages)와 retained memory가 출력량에 따라 증가하는지 확인합니다.
기대 동작
retained memory가 문서화된 상한을 넘지 않아야 합니다. 최대 개수/바이트와 Truncated, tail buffer 또는 streaming API 같은 명시적 정책이 필요합니다.
완료 조건
관련 코드
요약
Session.Execute는 BEGIN과 END marker 사이의 일반 로그를 제한 없이CommandResult.Messages에 append합니다. publicLines()가 소비되지 않으면 fan-out queue도 제한 없이 증가합니다.main@4e87765f95c106edb3c956cfad2abc1db64c0c39영향
한 명령이 매우 많은 로그를 출력하면 명령 완료 전까지 메모리가 출력량에 비례해 증가합니다. 충분한 출력에서 OOM 가능성이 있으나 실제 OOM 종료까지 유도하지는 않았습니다.
발생 조건 및 확인 범위
Lines()도 소비되지 않으면 fan-out queue까지 축적됨100,000줄 fixture에서
len(result.Messages)==100000이고 한 관측에서 heap allocation이 약 14.5MB 증가했습니다. 수치는 runtime/GC에 따라 달라집니다.재현 및 검증 방법
session.Lines()를 drain하지 않습니다.Session.Execute전후runtime.ReadMemStats를 기록합니다.len(result.Messages)와 retained memory가 출력량에 따라 증가하는지 확인합니다.기대 동작
retained memory가 문서화된 상한을 넘지 않아야 합니다. 최대 개수/바이트와
Truncated, tail buffer 또는 streaming API 같은 명시적 정책이 필요합니다.완료 조건
CommandResult.Messages에 문서화된 개수 또는 바이트 상한을 적용한다.Lines()queue도 소비자 부재로 무제한 증가하지 않는다.관련 코드
Sessionfan-outExecuterunExec