기여 목록 / 8403805
FSA: Preserve known Windows file path types
Windows FilePathWatcher가 삭제·이동 알림을 처리할 때 이미 확인한 파일·디렉터리 타입을 보존하도록 변경했습니다. 알림을 처리하기 전에 경로가 사라져도 알려진 타입을 보고하고, 새 항목의 타입을 이전 항목에서 잘못 물려받지 않도록 했습니다.
문제 설명
Windows 파일 변경 알림에는 변경된 경로의 파일·디렉터리 타입이 항상 담겨 있지 않습니다. 이전 구현은 삭제된 경로의 타입을 kUnknown으로 보고했습니다. 알림을 처리하기 전에 해당 경로가 다른 종류의 항목으로 교체되면, 현재 파일 시스템만 조회해서는 삭제된 항목의 타입을 알 수 없습니다.
상위 디렉터리의 이동이나 삭제도 하위 감시 대상의 타입에 영향을 줍니다. 한편 한 번도 관찰하지 못한 항목은 타입을 추측해서는 안 됩니다. 이전 타입을 무조건 재사용하면 같은 경로에 새로 생성된 파일이나 디렉터리를 잘못 분류할 수 있습니다.
해결 내용
이미 확인한 경로 타입 보관
FilePathWatcherChangeTracker에 최대 1024개 항목을 보관하는 LRU 캐시를 추가했습니다. 관찰한 파일·디렉터리의 타입을 먼저 조회하고, 정보가 없을 때만 현재 파일 시스템을 확인합니다. 삭제 알림에는 현재 경로가 아니라 삭제 전에 확인한 타입을 사용합니다. 캐시에서 밀려났거나 관찰된 적이 없는 경로는kUnknown일 수 있습니다.상위 경로와 이동·교체 처리
하위 항목의 알림이 도착하면 그 항목의 상위 경로는 디렉터리였음을 추론합니다. 디렉터리를 이름 변경하면 하위 항목의 저장된 타입도 새 경로로 옮기고, 감시 범위를 벗어난 경로의 정보는 버립니다. 생성·삭제 알림에서는 이전 항목의 정보를 무효화하여 같은 이름으로 만들어진 새 항목에 오래된 타입을 적용하지 않습니다.
알림 누락이 감지되면 저장된 타입과 대기 중인 이름 변경 출처를 모두 비웁니다. 짝이 없는 새 이름은 이전 출처를 임의로 연결하지 않고 보수적으로 처리합니다. 대상 경로의 존재 여부 확인은 현재 파일 시스템 조회를 유지합니다.
경로 비교 비용과 리뷰 의견 반영
캐시 키로 경로 구성 요소를 사용해 하위 트리 무효화 시 매번 경로 문자열을 다시 분리하지 않도록 했습니다. 리뷰를 반영해 이미 계산한 구성 요소를 경로 관계 판단에도 재사용하고, 이름 변경 쌍을 처리할 때
std::exchange()로 대기 중인 이전 이름을 명시적으로 비우도록 했습니다.
file_path_watcher_change_tracker.cc, .h와 기존 file_path_watcher_unittest.cc를 수정했습니다.
테스트 방법
file_path_watcher_unittest.cc에 Windows 전용 FilePathWatcherChangeTracker 테스트를 추가했습니다. 파일과 디렉터리를 모두 대상으로 다음 경우를 검증합니다.
| 경우 | 검증 내용 |
|---|---|
| 삭제와 교체 | 사라진 항목에는 이전 타입을 보고하고, 같은 경로에 들어온 새 항목에는 오래된 타입을 사용하지 않습니다. |
| 하위 항목 알림 | 하위 경로에서 발생한 이벤트로 사라진 상위 경로가 디렉터리였음을 추론합니다. |
| 디렉터리 이동 | 하위 파일의 타입을 새 경로로 옮기고, 감시 범위 밖의 저장 정보는 폐기합니다. |
| 알림 누락과 짝 없는 이름 변경 | 저장된 타입과 대기 중인 이동 출처를 초기화하고, 새 이름을 이전 이동과 잘못 결합하지 않습니다. |
| 덮어쓰기와 알림 병합 | 기존 이동 알림의 병합 동작을 유지합니다. |
Gerrit 기록상 Patch Set 8의 CQ dry run은 2026년 9월 25일 통과했습니다. 그 전에 기록된 일부 재시도는 빌드 인프라 오류로 실패했습니다. 9월 28일에는 코드 리뷰 승인을 받은 뒤 Commit-Queue +2로 full run이 시작되었습니다. 이 보고서 작성 과정에서 Chromium 테스트를 별도로 실행하지는 않았습니다.
배운 점
- 삭제된 파일의 타입을 나중에 파일 시스템에서 다시 조회하면 교체된 항목의 타입을 읽을 수 있으므로, 관찰 시점의 정보를 따로 보관해야 합니다.
- 타입 캐시는 정확한 전체 이력이 아니라 제한된 정보입니다. 알림 누락, 경로 교체, 감시 범위 밖으로의 이동에서는 저장 정보를 무효화해야 합니다.
- 경로 관계를 자주 판단하는 코드에서는 이미 계산한 경로 구성 요소를 재사용하면 반복 작업을 줄일 수 있습니다.
- 이름 변경 쌍의 첫 이벤트를 소비할 때 대기 상태를 명시적으로 비워야 뒤따르는 짝 없는 이벤트와 잘못 연결되지 않습니다.