Commit 5c5ce50
authored
[#253] fix(index): PageStore::open에서 슈퍼블록 version 검증
* [#253] fix(index): PageStore::open에서 슈퍼블록 version 검증
open()이 magic은 검사하면서 version은 검사하지 않았습니다. VERSION
상수는 create() 쓰기 경로에서만 쓰이고 읽기 쪽에는 대응하는 검사가
없었습니다.
magic이 막아주는 것은 '아예 다른 파일'뿐입니다. 실제로 마주치게 될
상황은 '같은 종류지만 다른 버전인 파일'이고, 그쪽이 그대로 통과했습니다:
open(version=999) -> OK <- 조용히 통과
open(bad magic) -> ERR invalid magic bytes
page_size가 슈퍼블록에서 그대로 읽혀 모든 오프셋 계산에 쓰이기 때문에
이것이 조용한 파일 손상으로 이어집니다. page_size=4096으로 쓰인 파일을
8192이라고 적힌 슈퍼블록으로 열면:
read_page(0) -> ERR failed to fill whole buffer
write_page(1) -> Ok <- 성공해버림
page 1의 올바른 오프셋 = 4160
실제로 쓴 오프셋 = 8256
읽기는 에러로 드러나지만 쓰기는 성공해서, 이후 읽기가 엉뚱한 바이트를
페이지로 해석하게 됩니다.
테스트 3건을 함께 둡니다.
- open_rejects_an_unsupported_format_version: 거부 확인
- open_still_accepts_a_store_written_by_this_version: guard rail.
거부만 늘리는 것은 수정이 아니므로, 이 빌드가 쓴 파일이 내용까지
왕복하는지 확인합니다.
- a_foreign_version_would_write_pages_at_the_wrong_offset: 이 검사가
왜 필요한지를 고정 — page_size를 믿기 전에 걸러야 한다는 점
bite-test로 확인했습니다. 검사를 제거하면 거부 테스트 2건이 FAILED로
뒤집히고, guard rail은 양쪽 구현에서 모두 통과합니다.
파일 포맷 변경이 아니라 이미 기록 중인 필드를 읽기만 하므로 기존
파일과의 호환성 문제는 없습니다.
cargo test 675 passed / 0 failed (master 669 + 6).
clippy --all-targets 경고 73건으로 master와 동일.
* [#253] fix: 버전 검사를 지원 범위로 완화 (#241 머지 반영)
#241이 머지되면서 VERSION이 2로 올라가고, v1 파일을 free_list_head=None
으로 읽는 마이그레이션 경로가 들어왔습니다. 이 PR의 검사는
'정확히 현재 버전'을 요구하고 있어서, 리베이스하니 그 하위호환을
막았습니다:
opens_a_version_1_superblock_with_an_empty_free_list ... FAILED
index file version 1 is not supported (expected 2)
두 변경이 반대 방향으로 당기는 지점이라, 검사를 '지원 범위'로 바꿉니다.
거부해야 하는 것은 미래 버전입니다. 레이아웃을 모르는데 page_size를
그대로 읽어 모든 오프셋에 쓰기 때문입니다. 반대로 read_superblock이
읽을 수 있는 과거 버전은 통과시켜야 합니다.
MIN_SUPPORTED_VERSION을 도입하고 open_accepts_an_older_but_still_supported_version
으로 v1 허용이 의도된 것임을 고정했습니다. 두 변경이 서로를 지우지
않도록 테스트로 남겨둡니다.
bite-test: 검사를 제거하면 거부 테스트 2건만 FAILED로 뒤집히고,
호환성 테스트 3건(v1 읽기, 구버전 허용, 현재 버전 왕복)은 통과합니다.
cargo test 735 passed / 0 failed.
clippy --all-targets 73건으로 master와 동일.1 parent 958c1a1 commit 5c5ce50
1 file changed
Lines changed: 137 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
32 | 32 | | |
33 | 33 | | |
34 | 34 | | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
35 | 38 | | |
36 | 39 | | |
37 | 40 | | |
| |||
113 | 116 | | |
114 | 117 | | |
115 | 118 | | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
116 | 136 | | |
117 | 137 | | |
118 | 138 | | |
| |||
488 | 508 | | |
489 | 509 | | |
490 | 510 | | |
| 511 | + | |
| 512 | + | |
| 513 | + | |
| 514 | + | |
| 515 | + | |
| 516 | + | |
| 517 | + | |
| 518 | + | |
| 519 | + | |
| 520 | + | |
| 521 | + | |
| 522 | + | |
| 523 | + | |
| 524 | + | |
| 525 | + | |
| 526 | + | |
| 527 | + | |
| 528 | + | |
| 529 | + | |
| 530 | + | |
| 531 | + | |
| 532 | + | |
| 533 | + | |
| 534 | + | |
| 535 | + | |
| 536 | + | |
| 537 | + | |
| 538 | + | |
| 539 | + | |
| 540 | + | |
| 541 | + | |
| 542 | + | |
| 543 | + | |
| 544 | + | |
| 545 | + | |
| 546 | + | |
| 547 | + | |
| 548 | + | |
| 549 | + | |
| 550 | + | |
| 551 | + | |
| 552 | + | |
| 553 | + | |
| 554 | + | |
| 555 | + | |
| 556 | + | |
| 557 | + | |
| 558 | + | |
| 559 | + | |
| 560 | + | |
| 561 | + | |
| 562 | + | |
| 563 | + | |
| 564 | + | |
| 565 | + | |
| 566 | + | |
| 567 | + | |
| 568 | + | |
| 569 | + | |
| 570 | + | |
| 571 | + | |
| 572 | + | |
| 573 | + | |
| 574 | + | |
| 575 | + | |
| 576 | + | |
| 577 | + | |
| 578 | + | |
| 579 | + | |
| 580 | + | |
| 581 | + | |
| 582 | + | |
| 583 | + | |
| 584 | + | |
| 585 | + | |
| 586 | + | |
| 587 | + | |
| 588 | + | |
| 589 | + | |
| 590 | + | |
| 591 | + | |
| 592 | + | |
| 593 | + | |
| 594 | + | |
| 595 | + | |
| 596 | + | |
| 597 | + | |
| 598 | + | |
| 599 | + | |
| 600 | + | |
| 601 | + | |
| 602 | + | |
| 603 | + | |
| 604 | + | |
| 605 | + | |
| 606 | + | |
| 607 | + | |
| 608 | + | |
| 609 | + | |
| 610 | + | |
| 611 | + | |
| 612 | + | |
| 613 | + | |
| 614 | + | |
| 615 | + | |
| 616 | + | |
| 617 | + | |
| 618 | + | |
| 619 | + | |
| 620 | + | |
| 621 | + | |
| 622 | + | |
| 623 | + | |
| 624 | + | |
| 625 | + | |
| 626 | + | |
| 627 | + | |
491 | 628 | | |
0 commit comments