29 lines
2.4 KiB
Markdown
29 lines
2.4 KiB
Markdown
# fsync() 의 요구가 물리 storage 까지 내려가는 사슬
|
||
|
||
## Alternative text
|
||
|
||
PostgreSQL 의 fsync() 가 Guest Filesystem, Guest Block Layer, virtio-blk, QEMU / Backend, Host Storage Stack 을 차례로 지나 Physical Storage 에 닿는 위에서 아래로 읽는 흐름도.
|
||
|
||
## Long description
|
||
|
||
위에서 아래로 읽는다. 맨 위 PostgreSQL 이 fsync() 를 부르고 그 요구가 Guest Filesystem 으로 내려간다. Guest Block Layer 에서 FLUSH 등의 요청으로 바뀌고, virtio-blk 를 지나 VM 경계를 넘어 QEMU / Backend 로 간다. 거기서 Host Storage Stack 을 지나 맨 아래 Physical Storage 까지 그 의미가 전달되어야 완료가 성립한다. 여섯 번 손이 바뀌는 동안 한 곳이라도 그 의미를 지키지 않으면 게스트가 받은 완료 응답이 거짓이 된다. write() 완료와 writeback 완료, fsync/flush 완료, 전원 장애에도 안전한 durability 가 서로 다르다는 구분은 본문의 코드블록이 맡는다.
|
||
|
||
## Elements and evidence
|
||
|
||
- **PostgreSQL** (service): 필요한 시점에 fsync() 를 불러 영속성 경계까지 반영을 요청하는 게스트 프로세스. Evidence: L6742–L6742, L6726–L6734.
|
||
- **Guest Filesystem** (service): fsync() 요구를 처음 받는 게스트 파일시스템. Evidence: L6746–L6746.
|
||
- **Guest Block Layer** (service): 요구를 FLUSH 등의 block 요청으로 바꾸는 계층. Evidence: L6749–L6751.
|
||
- **virtio-blk** (service): 그 요청을 VM 경계 너머로 옮기는 게스트 driver. Evidence: L6753–L6753.
|
||
- **QEMU / Backend** (service): 요청을 받아 호스트 쪽 파일 I/O 나 block I/O 로 잇는 자리. Evidence: L6756–L6756, L6686–L6686.
|
||
- **Host Storage Stack** (service): 호스트 Page Cache 와 파일시스템, Block Layer 가 놓인 구간. Evidence: L6759–L6759, L6688–L6692.
|
||
- **Physical Storage** (store): 요구가 여기까지 전달되어야 정전 이후 생존을 말할 수 있다. Evidence: L6762–L6765, L6729–L6729.
|
||
|
||
## Relationships
|
||
|
||
- **PostgreSQL → Guest Filesystem:** fsync(). Evidence: L6744–L6746.
|
||
- **Guest Filesystem → Guest Block Layer:** control. Evidence: L6746–L6749.
|
||
- **Guest Block Layer → virtio-blk:** FLUSH 등. Evidence: L6751–L6753.
|
||
- **virtio-blk → QEMU / Backend:** control. Evidence: L6753–L6756.
|
||
- **QEMU / Backend → Host Storage Stack:** control. Evidence: L6756–L6759.
|
||
- **Host Storage Stack → Physical Storage:** control. Evidence: L6759–L6765.
|