Skip to content

Session.Execute 결과 메시지 수집에 메모리 상한 추가 #21

Description

@leehyowon14

요약

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에 따라 달라집니다.

재현 및 검증 방법

  1. helper가 Execute marker 사이에 100,000줄을 출력하도록 합니다.
  2. 실행 중 session.Lines()를 drain하지 않습니다.
  3. Session.Execute 전후 runtime.ReadMemStats를 기록합니다.
  4. len(result.Messages)와 retained memory가 출력량에 따라 증가하는지 확인합니다.

기대 동작

retained memory가 문서화된 상한을 넘지 않아야 합니다. 최대 개수/바이트와 Truncated, tail buffer 또는 streaming API 같은 명시적 정책이 필요합니다.

완료 조건

  • CommandResult.Messages에 문서화된 개수 또는 바이트 상한을 적용한다.
  • 잘림 여부를 호출자가 확인할 수 있다.
  • public Lines() queue도 소비자 부재로 무제한 증가하지 않는다.
  • 100,000줄 이상 테스트에서 retained memory가 선형 증가하지 않는다.
  • 소규모 명령의 출력과 result parsing은 유지된다.
  • 전체 test, vet, 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