Conversation
…·daily_logs·피드백 FK - OutboxSkipLockedRaceTest: 발행기 A 가 잠근 동안 B 는 안 기다리고 다른 행만 받음, 만료 lease 만 회수 (SKIP LOCKED 를 빼면 실패함을 확인 — B 가 A 의 락에 막힘) - PoseDataPartitionMaintenanceRaceTest: 스크래치 스키마에 실제 pose_data 정의를 복사해 DROP/REORGANIZE 실행 — 만료 달 행만 사라짐, 패턴 밖 파티션 보존, 멱등, 새 파티션 경계 - DailyLogNativeQueryRaceTest: Mood 전 값이 MySQL ENUM 에 들어감, 덮어쓰기가 누적 통계 보존, recomputeStats 의 분 절삭·날짜 경계·COMPLETED 만·남의 세션 제외 - FeedbackLogFkRaceTest: 재작성 배치에서 1452 → SESSION_NOT_FOUND, 재전송 건수. 배치 안 중복은 1869 로 실패함을 발견(#816) — 고정하지 않고 주석으로 남김 - MySqlContainerSupport.MYSQL 을 protected 로(스크래치 스키마용 root 접속) 전체 ./gradlew test: 968 tests, 실패 0, 6 skipped. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
Warning Review limit reachedNext included review available in 11 minutes. View limit detailsLimit details: You’ve used the included review currently available. You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Review configuration: ⚙️ Run configurationConfiguration used: Repository: Shadowfit/init/.coderabbit.yaml Review profile: CHILL Plan: Advanced Run ID: 📒 Files selected for processing (5)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
@coderabbitai review |
|
요약
H2 기본 테스트로는 문법만 확인되던 네이티브 SQL·DDL 4종을 실 MySQL(Testcontainers
race프로파일)에서 동작까지 고정한다. main 코드 변경은 없다.OutboxSkipLockedRaceTestPoseDataPartitionMaintenanceRaceTestDROP PARTITION·REORGANIZE PARTITION pfuture실제 실행: 만료 달의 행만 사라짐, 이름 패턴 밖 파티션 보존, 두 번 돌려도 같음, 새 파티션 경계(1일 0시)DailyLogNativeQueryRaceTestupsertMemoAndMood: Mood 5개 값이 MySQLENUM에 모두 들어감, 덮어써도 누적 통계는 보존.recomputeStats:TIMESTAMPDIFF분 절삭, 날짜 경계, COMPLETED만, 남의 세션 제외, 0으로 덮기FeedbackLogFkRaceTestrewriteBatchedStatements=true)에서도 원인 체인에 1452가 실려SESSION_NOT_FOUND로 번역된다. 재전송·혼합 배치의 삽입 건수격리
CREATE TABLE ... LIKE로 Flyway가 만든 진짜pose_data를 복사하고, 파티션만 «오늘 기준 상대 월»로 다시 짜서 돌린다. 스케줄러는DATABASE()와 테이블명만으로 동작하므로 main 코드를 바꿀 필요가 없다. root 접속을 위해MySqlContainerSupport.MYSQL을protected로 바꿨다.OutboxPublisher가 이 테스트의 행을 먼저 집어 간 일이 실제로 있었다(첫 전체 실행 때 1건 실패). 그래서 행의 시각을 +1일로 밀고 선점 쿼리의:now에 그 미래 시각을 넘긴다. 실제 발행기는now()로 조회하므로 이 행들을 절대 집지 못한다.검증
./gradlew test전체: 968 tests, 실패 0, 6 skipped. 새 race 테스트 16개는 모두 실제로 돌았다(skip 아님, 로컬 Docker).SKIP LOCKED를 빼고 돌리면OutboxSkipLockedRaceTest가 실패한다(B가 A의 락에 막혀 30초 대기). 확인한 뒤 원복했다.발견 — #816
FeedbackLogFkRaceTest를 쓰다가 한 배치 안에 같은(rep, 유형)이 두 번 있으면 MySQL 에러 1869로 배치 전체가 실패하는 것을 찾았다. 이미 커밋된 행과의 중복(재전송)은 문제없다. 지금 AI는 배치를 항상 1건으로 보내므로 운영 경로에서는 나지 않는 잠복 결함이다. 수정 방식이 정해지지 않아 테스트로 고정하지 않고 주석으로 남겼다.🤖 Generated with Claude Code