문제 요약
ZMS(Zephyr Memory Storage)의 test_zms_free_space 테스트가 write_block_size > 1인 환경(섹터 크기 4KB 이상)에서 assertion 실패. 테스트가 sizeof(struct zms_ate)를 하드코딩하여 free space를 계산하지만, ZMS 내부는 write_block_size의 배수로 올림한 ate_size를 사용하기 때문에 값이 불일치.
원인 분석
zms_mount() 시 ATE 크기는 zms_al_size(fs, sizeof(struct zms_ate))로 결정되어 write_block_size의 배수로 올림됨. 테스트 코드는 이를 무시하고 컴파일 타임 sizeof(struct zms_ate)를 사용하여:
- free space 산술 계산이 실제 ZMS 동작과 불일치
zassert_equal(ZMS_DATA_IN_ATE_SIZE, ...)— 정렬 패딩으로 인해 정확히 8바이트로 떨어지지 않음- VLA 버퍼가 큰 섹터 크기에서 스택 오버플로 유발
ZMS 구현 자체는 정상. 테스트 로직 버그.
수정 내용
| 변경 항목 | Before | After |
|---|---|---|
| ATE 크기 | sizeof(struct zms_ate) | fixture->fs.ate_size |
| free space 검증 | zassert_equal(ZMS_DATA_IN_ATE_SIZE, ...) | >= ZMS_DATA_IN_ATE_SIZE && < ZMS_DATA_IN_ATE_SIZE + wbs |
| 버퍼 할당 | VLA (스택) | k_malloc/k_free (힙) |
| 설정 | — | CONFIG_HEAP_MEM_POOL_SIZE=65536 추가 |
활동 로그
- 2026-02-26: 이슈 분석 시작.
qemu_x86에서 8KB 섹터 오버레이로 assertion 실패 재현. - 2026-02-27: Option A(테스트 전용 수정) 적용.
qemu_x86기본 설정에서 8/8 configurations, 107/107 test cases 통과 확인. - 2026-02-27: PR #104644 제출.
- 2026-03-02: PR 리뷰 피드백 반영 (Magic number, 변수 선언 위치, 불필요한 매크로 등 코드 품질 정리).
- 2026-03-03: ZMS free space 테스트 코드 리뷰 및 개선 작성, ZMS
write_block_size정렬로 인한 테스트 성능(O(N²)) 개선 및 검증 완료. 20분 걸리던 테스트가 2분으로 단축됨. - 2026-03-03: delete check를 매번하지 않고 periodic하게 수행하도록 변경하여 2분에서 23초로 개선. @butok approved PR. 아직 approval이 한명 더 필요.