Lesson 22 — File & OS

3 module tương tác minh hoạ 3 chủ đề trọng tâm của lesson: (1) Permission Unix dạng octal — click rwx, xem cách 9 bit gói thành 3 digit; (2) filepath.Walk — animate DFS qua một cây thư mục, biết Skip vào dir; (3) Atomic write — so sánh trực tiếp pattern an toàn (write tmp + rename) với pattern non-atomic, demo điều gì xảy ra khi process bị kill giữa lúc đang ghi.

1. Permission grid — octal là gì?

Click vào từng ô r / w / x để toggle. 3 hàng tương ứng owner / group / other. Mỗi hàng có 3 bit → tạo 1 digit octal (0–7). 3 digit gộp lại = perm dạng 0644, 0755... Lệnh chmod ở dưới luôn được sync với trạng thái grid.

r
w
x
owner
r
w
x
group
r
w
x
other
r
w
x
0000
---------
$ chmod 0000 file.txt
Đang chọn: chưa cấp quyền nào (perm 0000 = không ai làm gì được).

2. filepath.Walk — DFS qua cây thư mục

Walk mặc định là DFS pre-order: visit node hiện tại trước, rồi đi sâu vào children bên trái. Khi callback trả filepath.SkipDir → nhánh đó bị bỏ qua. Ấn ▶ để chạy step-by-step.

// Sẵn sàng. Ấn "Run walk" để bắt đầu.
Hành vi SkipDir: trả filepath.SkipDir từ callback khi visit một dir → Walk bỏ qua toàn bộ subtree dưới dir đó. Ứng dụng thực tế: skip vendor/, node_modules/, .git/ trong project lớn — tiết kiệm hàng nghìn syscall.

3. Atomic write vs Non-atomic — điều gì khi crash?

Hai cột song song mô phỏng việc cập nhật config.json. Cột trái dùng pattern atomic (write tmp → fsync → rename). Cột phải ghi trực tiếp đè lên file. Ấn ▶ chạy. Ấn Kill mid-write để mô phỏng crash giữa lúc đang ghi — quan sát cột nào còn data nguyên vẹn.

✓ Atomic (tmp + rename)

1. Create tmp
2. Write data
3. fsync
4. Rename
5. Done
📄 config.json {"port":8080,"env":"v1"}

✗ Non-atomic (write thẳng)

1. Open + truncate
2. Write data
3. Close
4. Done
📄 config.json {"port":8080,"env":"v1"}
Cách hoạt động: Atomic pattern build data vào tmp file riêng. File đích chỉ bị thay đổi ở 1 syscall duy nhất (rename) — kernel đảm bảo người đọc thấy hoặc file cũ, hoặc file mới, không có trạng thái giữa.
Lưu ý quan trọng: tmp file phải cùng filesystem với target. Nếu tmp ở /tmp (tmpfs) còn target ở /var/data (ext4 mount riêng), os.Rename sẽ rơi vào fallback copy+delete — KHÔNG còn atomic. Pattern đúng: os.CreateTemp(filepath.Dir(target), "...").