배경
카드 A 쓰기 처리량(ms) 실측(docs/decisions/covering-index-write-throughput.md) 착수 중 run_all.sh의 card_a_seed phase가 fresh EC2 인스턴스에서 즉시 실패했다.
현상 (근거, file:line)
loadtest/seed/seed_pose_data_bulk.sh:16:
스크립트가 loadtest/seed/에 있으므로 dirname "$0" = loadtest/seed, 그 부모(..)는 loadtest/ 다 — 저장소 루트(E:/init/ 또는 EC2의 /root/init/)가 아니다.
- 다음 줄(
:17)이 그 위치에서 .env를 찾는다:
.env는 저장소 루트에 있지 loadtest/에는 없어서 fresh EC2 체크아웃(로컬 개발 환경엔 우연히 다른 .env가 있을 수도 있어 안 걸릴 여지가 있다)에서 곧바로 실패한다.
재현 (실제 로그)
/root/init/loadtest/seed/seed_pose_data_bulk.sh: line 17: ./.env: No such file or directory
=== pose_data 벌크 시딩 — 목표 5120MB ===
/root/init/loadtest/seed/seed_pose_data_bulk.sh: line 21: MYSQL_ROOT_PASSWORD: unbound variable
(MYSQL_ROOT_PASSWORD는 .env가 정상 로드됐어야 채워지는 값이다.)
영향
run_all.sh의 phase_card_a_seed가 이 스크립트를 그대로 호출하므로, card_a_seed phase가 fresh EC2 라운드에서 항상 즉시 FAIL한다(rc=1).
- 더 심각한 것:
phase_card_a_seed가 실패해도 phase_card_a(measure_205_card_a_write_cost.sh)는 별도 phase라 계속 돌아간다 — 즉 pose_data가 시딩 실패로 **0MB(빈 테이블)**인 채로 카드 A 측정이 그대로 실행돼, "버퍼풀(2,048MB)을 넘는 규모에서 잰다"는 이 rig 자신의 전제(주석에 명시: "버퍼풀을 넘는가가 이 판의 전제다 — R8은 그러지 못해 «메모리 안»만 쟀다")가 깨진 채로 "측정 완료"처럼 보이는 무효 판이 나온다. 실제로 2026-09-06 착수 1차 시도(ec2-20260906-024820)에서 이렇게 재현됐고, 그 산출물의 숫자가 2026-08-20 로컬 카드 A 결과와 값까지 거의 동일해(같은 빈 테이블/소규모 조건이라 재현된 것으로 추정) 겉보기엔 "정상 측정된 것"처럼 보였다 — 결과 문서를 직접 열어보지 않으면 이 무효화를 못 알아챈다.
- 이 실패 자체도 #641의 AUTO_SHUTDOWN 오작동과 겹칠 수 있다(같은 라운드에서 다른 phase가 있어 이번엔 박스가 안 꺼졌지만,
card_a_seed만 단독으로 도는 라운드였다면 재현 가능).
재현
# EC2 fresh checkout에서
bash loadtest/seed/seed_pose_data_bulk.sh
# → line 17: ./.env: No such file or directory
제안
cd "$(dirname "$0")/.."를 cd "$(dirname "$0")/../.."로 고치거나(스크립트가 loadtest/seed/에 있으므로 저장소 루트까지 두 단계 올라가야 함), git rev-parse --show-toplevel 등으로 저장소 루트를 명시적으로 구하는 방식으로 바꾸면 해결된다. 이번 라운드는 워크어라운드로 .env를 loadtest/에 복사해서 우회했다(스크립트 자체는 안 고쳤다).
배경
카드 A 쓰기 처리량(ms) 실측(
docs/decisions/covering-index-write-throughput.md) 착수 중run_all.sh의card_a_seedphase가 fresh EC2 인스턴스에서 즉시 실패했다.현상 (근거, file:line)
loadtest/seed/seed_pose_data_bulk.sh:16:loadtest/seed/에 있으므로dirname "$0"=loadtest/seed, 그 부모(..)는loadtest/다 — 저장소 루트(E:/init/또는 EC2의/root/init/)가 아니다.:17)이 그 위치에서.env를 찾는다:.env는 저장소 루트에 있지loadtest/에는 없어서 fresh EC2 체크아웃(로컬 개발 환경엔 우연히 다른.env가 있을 수도 있어 안 걸릴 여지가 있다)에서 곧바로 실패한다.재현 (실제 로그)
(
MYSQL_ROOT_PASSWORD는.env가 정상 로드됐어야 채워지는 값이다.)영향
run_all.sh의phase_card_a_seed가 이 스크립트를 그대로 호출하므로,card_a_seedphase가 fresh EC2 라운드에서 항상 즉시 FAIL한다(rc=1).phase_card_a_seed가 실패해도phase_card_a(measure_205_card_a_write_cost.sh)는 별도 phase라 계속 돌아간다 — 즉pose_data가 시딩 실패로 **0MB(빈 테이블)**인 채로 카드 A 측정이 그대로 실행돼, "버퍼풀(2,048MB)을 넘는 규모에서 잰다"는 이 rig 자신의 전제(주석에 명시: "버퍼풀을 넘는가가 이 판의 전제다 — R8은 그러지 못해 «메모리 안»만 쟀다")가 깨진 채로 "측정 완료"처럼 보이는 무효 판이 나온다. 실제로 2026-09-06 착수 1차 시도(ec2-20260906-024820)에서 이렇게 재현됐고, 그 산출물의 숫자가 2026-08-20 로컬 카드 A 결과와 값까지 거의 동일해(같은 빈 테이블/소규모 조건이라 재현된 것으로 추정) 겉보기엔 "정상 측정된 것"처럼 보였다 — 결과 문서를 직접 열어보지 않으면 이 무효화를 못 알아챈다.card_a_seed만 단독으로 도는 라운드였다면 재현 가능).재현
제안
cd "$(dirname "$0")/.."를cd "$(dirname "$0")/../.."로 고치거나(스크립트가loadtest/seed/에 있으므로 저장소 루트까지 두 단계 올라가야 함),git rev-parse --show-toplevel등으로 저장소 루트를 명시적으로 구하는 방식으로 바꾸면 해결된다. 이번 라운드는 워크어라운드로.env를loadtest/에 복사해서 우회했다(스크립트 자체는 안 고쳤다).