aboutsummaryrefslogtreecommitdiffstats
path: root/docs/research/062-paged-store-rollback.md
blob: 1f734dca2f1f7c4b5fb557a3760fb6d6766271f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 062 — 선택형 페이지 저장소를 기본 불변 형식으로 되돌리기

[061](061-durable-document-edit-latency.md)의 페이지 저장소는 실제 큰 문서
수정에서 짧은 중앙값을 보였지만, 기본 저장기가 `PUREP001`을 읽지 못했다.
이 형식 경계를 줄이기 위해 [문서 앱 전용 내보내기](../../prototypes/connections/export_flat_store.py)를
만들었다. 도구는 **새 디렉터리**에 현재 본문과 리비전을 `PUREB001`로 기록하고,
기본 고정 CLI로 전부 재읽은 후에 디렉터리를 공개한다. 원본을 변경하지 않는다.
런타임 코어와 기본 앱의 C 소스·링크 경로에는 코드가 추가되지 않았다.

변환 동안 원본 `.writer.lock`의 공유 POSIX 잠금을 유지한다. 협력하는 쓰기
프로세스는 `busy`를 받으며, 키 목록과 각 읽기는 한 시점의 일관된 상태를 본다.
각 대상 파일과 대상 디렉터리를 동기화하고, 임시 디렉터리를 최종 경로로
이름 변경한 뒤 상위 디렉터리도 동기화한다. 중간 읽기가 실패하면 임시
디렉터리를 지우고 최종 경로를 공개하지 않는다. 대상 경로는 실행 전에
존재하지 않아야 하며, 그 경로를 다른 프로세스가 동시에 생성하지 않아야 한다.
서비스 쓰기가 `busy`를 받지 않도록 유지보수 중 실행하는 경로다.

[실제 앱 검사](../../prototypes/connections/results/2026-09-24-flat-export/export-check.json)는
빈 값·1바이트·16 KiB 경계·16 KiB 초과·1 MiB 문서를 생성하고, 큰 문서를
65회 수정한 후 내보냈다. 모든 본문과 리비전이 새 기본 저장기에서 일치했고,
기본 저장기로 이어서 수정하자 리비전이 66→67로 증가했다. 원본은 66을
유지했다. 변환 중 별도 쓰기는 `busy`, 종료 뒤 같은 쓰기는 성공했다.
기존 대상·심볼릭 링크 객체·주입한 중간 읽기 실패도 거절하고 미완성
대상을 남기지 않았다.

[1,024개 추가 문서 검사](../../prototypes/connections/results/2026-09-24-flat-export/export-scale-1024.json)는
총 1,029개 객체, 1,212,418 논리 바이트를 변환하고 각 객체를 기본 CLI로
재읽었다. 이는 `/tmp` 파일시스템의 기능 검사이며 처리량 자료가 아니다.
[ext4 경로 검사](../../prototypes/connections/results/2026-09-24-flat-export/export-ext4.json)는
같은 다섯 문서와 동기화·공개·복원을 작업트리의 ext4에서 실행했다.
재현 명령은 `make -C prototypes/connections check-flat-export`다. 현재
`check-hybrid`에도 이 검사가 포함된다.

[새 소스 묶음](../../prototypes/connections/results/2026-09-24-flat-export-source/pure-source-preview.tar.gz)은
168개 파일, 압축 329,118 B이며 [별도 디렉터리 검사](../../prototypes/connections/results/2026-09-24-flat-export-source/source-check-linux-aarch64.json)에서
이 변환, C·TUI·CLI 동작과 Linux 릴리스 상한을 통과했다. 앞선 묶음과
해시를 비교하면 실행용 C·헤더는 모두 같다. 새 코드는 선택형 Python
변환기·검사와 사용 안내에만 있다.

도구는 번들된 `editor.pure` 문서 앱의 고정 CLI를 사용하며 범용 저장소
마이그레이터는 아니다. 소스가 16 KiB 페이지를 요구하고 Apple Silicon에서는
아직 컴파일·실행하지 않았다. 원본을 제자리에서 바꾸거나 실행 중 쓰기를
투명하게 이전하지 않으며, 파일 손상 복구나 모든 전원 장애를 증명하지 않는다.
기본 저장기는 여전히 페이지 파일을 직접 읽지 못한다. 이 경로는 선택형
페이지 실험을 되돌릴 실제 수단이지, 기본 저장 경로 승격의 근거 전체는 아니다.