Files
document-haness/docs/virtualization/final/assets/diagrams/write-completion-boundaries/write-completion-boundaries.alt.md
T

2.4 KiB
Raw Blame History

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: L6742L6742, L6726L6734.
  • Guest Filesystem (service): fsync() 요구를 처음 받는 게스트 파일시스템. Evidence: L6746L6746.
  • Guest Block Layer (service): 요구를 FLUSH 등의 block 요청으로 바꾸는 계층. Evidence: L6749L6751.
  • virtio-blk (service): 그 요청을 VM 경계 너머로 옮기는 게스트 driver. Evidence: L6753L6753.
  • QEMU / Backend (service): 요청을 받아 호스트 쪽 파일 I/O 나 block I/O 로 잇는 자리. Evidence: L6756L6756, L6686L6686.
  • Host Storage Stack (service): 호스트 Page Cache 와 파일시스템, Block Layer 가 놓인 구간. Evidence: L6759L6759, L6688L6692.
  • Physical Storage (store): 요구가 여기까지 전달되어야 정전 이후 생존을 말할 수 있다. Evidence: L6762L6765, L6729L6729.

Relationships

  • PostgreSQL → Guest Filesystem: fsync(). Evidence: L6744L6746.
  • Guest Filesystem → Guest Block Layer: control. Evidence: L6746L6749.
  • Guest Block Layer → virtio-blk: FLUSH 등. Evidence: L6751L6753.
  • virtio-blk → QEMU / Backend: control. Evidence: L6753L6756.
  • QEMU / Backend → Host Storage Stack: control. Evidence: L6756L6759.
  • Host Storage Stack → Physical Storage: control. Evidence: L6759L6765.