Idempotent nghĩa là gì? Là tính chất “làm 1 lần hay 100 lần đều ra cùng kết quả”. Ví dụ ngoài đời:
- Bấm nút gọi thang máy 1 lần và bấm 100 lần → kết quả như nhau (thang đến tầng đó). Đây là idempotent.
- Bấm nút mua hàng 100 lần → trừ tiền 100 lần. Không idempotent.
--scan-on-start quét lại toàn bộ.Cơ chế
Trongrouter.process_file():
Decision
- Hash chưa có → analyze + embed + insert →
status: ok. - Hash đã có + mtime khớp → skip (giả định không có gì đổi) →
status: skipped. - Hash đã có + mtime khác → file metadata đổi (di chuyển, rename) → update
file_path,file_name,mtimenhưng giữ nguyên embedding →status: skipped(no LLM call). --forceflag → bỏ qua cả 3 case trên, force re-analyze.
Tại sao dùng SHA-256 thay vì path?
Path đổi thường xuyên:- User rename file:
old.jpg→new.jpg. - User di chuyển folder:
raw_assets/images/test.jpg→raw_assets/images/2026/test.jpg. - User copy file ra job:
raw_assets/...→jobs/.../input/raw_assets/....
Tương tác với watcher
Watcher đôi khi nhận nhiều event cho cùng 1 file (FSEvents/inotify quirk):- File copy lớn → nhiều
on_modifiedevent trong khi đang ghi. - Editor save →
on_created+on_deleted+on_createdlại (atomic save).
watcher.py xử lý bằng:
- Debounce: trễ 1.5s (mac) / 2.5s (win) sau event cuối cùng — đợi file ổn định.
- Size-stable check: đọc size 2 lần cách 100ms; nếu khác → file đang copy → đợi tiếp.
- Single-instance lock trong
state.json— không cho 2 watcher chạy song song.
process_file() — nếu file đã được index ở event trước, hash khớp → skip ngay.
Tương tác với scan-on-start
Khi khởi động với--scan-on-start, watcher walk recursive các root đang watch và gọi process_file() cho mỗi file. Nhờ idempotency:
- File đã có trong DB → skip (no LLM call).
- File mới drop khi watcher offline → index.
--scan-on-start vào service config — không tốn gì khi watcher đã đồng bộ.
Process log
Mọi lầnprocess_file() chạy đều ghi vào process_log (xem File runtime). Audit trail hữu ích khi debug:
- Lần process đầu tiên thành công ở đâu.
- Có bao nhiêu lần skip (idempotent).
- Lỗi gần nhất.
Force re-index
Nếu Gemini đã update model hoặc bạn muốn refresh summary:Bước tiếp theo
Cross-platform
FSEvents fallback, cp65001, apsw.
Mở rộng
Thêm format, đổi embed model.