기여 목록 / 8467263
Revert "content: Report inotify modifications before close"
ContentfixMerged
Linux 파일 변경 감시에서 IN_MODIFY로 전환했던 변경을 되돌려, writable mmap의 변경 알림이 누락되는 회귀를 막았습니다. 파일을 닫기 전에 일반 쓰기를 알리는 기능은 별도 해결이 필요하게 되었습니다.
문제 설명
CL 8345888은 FilePathWatcher가 파일 디스크립터를 닫기 전의 쓰기도 알리도록 inotify 구독을 IN_CLOSE_WRITE에서 IN_MODIFY로 바꿨습니다. 그러나 MAP_SHARED로 매핑한 파일의 변경에는 IN_MODIFY가 발생하지 않아, 기존에 닫기 시점의 IN_CLOSE_WRITE로 받던 writable mmap 변경 알림이 사라졌습니다.
두 이벤트를 함께 구독해 조기 알림과 mmap 알림을 모두 유지하는 방법도 CL 8402737에서 검토했습니다. 일반 쓰기 뒤 파일을 닫으면 두 이벤트가 각각 수정 알림을 만들고, 서로 다른 읽기 버퍼에 들어온 중복 알림을 실제 mmap 변경과 안전하게 구별할 수 없어 해당 접근을 중단했습니다.
해결 내용
원래 변경을 되돌려 Linux FilePathWatcher의 닫기 기반 알림 동작을 복원했습니다.
content/browser/file_system_access/file_path_watcher/file_path_watcher_inotify.cc에서 감시 마스크를IN_MODIFY대신IN_CLOSE_WRITE를 구독하던 상태로 되돌리고, 수정 이벤트 분류도 이전 조건으로 복원합니다.content/browser/file_system_access/file_path_watcher/file_path_watcher_unittest.cc에서 열린 디스크립터의 쓰기 직후 알림을 기대하던ModifiedFileWhileOpen테스트와 이를 위해 추가했던 헤더를 제거합니다. 되돌린 동작에서는 이 테스트의 기대가 더 이상 성립하지 않습니다.
이 선택으로 writable mmap의 기존 알림을 복구하지만, 파일 디스크립터를 오래 열어 둔 일반 쓰기는 다시 닫기 전까지 알림을 받지 못합니다.
테스트 방법
- Gerrit 알림에 따르면 Patch Set 1의 CQ 실행이 통과했습니다. 앞선
android_compile_dbg와linux-presubmit실행은 코드 실패가 아닌bot_update인프라 오류로 실패했습니다. - 리뷰에서 되돌리기 방향에 대한 동의를 받았고, Code-Review +1 및 Commit-Queue +2가 기록되었습니다.
- 원래 변경의 두 파일과 회귀 테스트를 기준으로 되돌린 범위를 확인했습니다. 보고서 작성 과정에서 Chromium 빌드나 watcher 테스트를 별도로 실행하지는 않았습니다.
배운 점
IN_MODIFY와IN_CLOSE_WRITE는 변경 알림 시점뿐 아니라 감지할 수 있는 쓰기 방식도 다릅니다. 일반적인write()를 검증하는 테스트만으로 writablemmap경로까지 보장할 수 없습니다.- 이벤트를 함께 구독하면 같은 일반 쓰기에서 중복 알림이 생길 수 있습니다. inotify 이벤트만으로는 그 알림과 별개의 mmap 변경을 항상 구분할 수 없습니다.
- 회귀가 확인됐을 때 기존 동작을 복원하고, 열린 파일의 조기 알림은 중복 제거 방안과 함께 다시 설계해야 합니다.