content: Preserve mmap notifications when observing inotify writes

IN REVIEW2026contentfile_system_accessfixtest
2026. 9. 13.zbnerd 프로필 이미지zbnerd

Linux 파일 변경 감시에서 일반 쓰기를 조기에 알리면서 writable mmap 변경에 대한
최선 노력 알림을 유지하는 패치입니다. 현재 Gerrit WIP 상태입니다.

문제 설명

inotify의 IN_MODIFY는 일반 쓰기를 파일이 닫히기 전에 알릴 수 있지만,
MAP_SHARED 매핑을 통한 변경에는 발생하지 않습니다.
IN_CLOSE_WRITE 구독을 제거하면 writable 매핑의 마지막 참조가 해제될 때
받을 수 있던 변경 알림도 사라집니다.

두 이벤트를 함께 구독하면 같은 쓰기에 여러 알림이 발생할 수 있습니다.
그러나 이전 IN_MODIFY를 근거로 이후 close를 무조건 무시하면,
앞선 알림 뒤에 이루어진 mmap 변경을 놓칠 수 있습니다.

해결 내용

  • IN_MODIFYIN_CLOSE_WRITE를 함께 구독하고 수정 알림으로 처리합니다.
  • 한 번 읽은 버퍼 안에서 동일 항목의 연속된 수정 이벤트만 합칩니다.
  • 서로 다른 읽기 버퍼 사이에는 중복 제거 상태를 유지하지 않습니다.
  • 이벤트 이름은 길이가 검사된 base::span으로 비교합니다.
  • mmap 변경과 이벤트 병합의 회귀 테스트를 추가하고,
    기존 쓰기 테스트는 새로 수신한 알림의 경로와 오류 여부를 검증하도록 보완합니다.

매핑을 유지하는 동안 모든 변경을 즉시 감지하거나 알림을 정확히 한 번만
전달하는 보장은 제공하지 않습니다.

테스트 방법

  • WSL Linux의 tmpfs와 ext4에서 일반 쓰기와 mmap의 inotify 이벤트를 비교했습니다.
  • Chromium 컴파일러와 기존 빌드 의존성을 재사용한 로컬 FilePathWatcher 하네스에서
    수정한 프로덕션 코드와 테스트를 컴파일하고 링크했습니다.
  • -Werror=unsafe-buffer-usage-in-libc-call을 적용한 컴파일에 성공했습니다.
  • 로컬 watcher 테스트 208개가 통과했습니다. mmap 및 버퍼 처리 관련 24개도
    별도로 실행해 통과했습니다.
  • clang-formatgit diff --check를 통과했습니다.
  • 패치셋 4의 CI 컴파일에서 발견된 memcmp 안전성 오류를 수정하고,
    패치셋 5에서 Dry Run을 다시 요청했습니다. 원격 CI 검증은 진행 중입니다.

전체 Chrome 빌드와 JavaScript FileSystemObserver 종단간 테스트 결과는 아닙니다.

배운 점

수정 시각이나 이전 알림만으로 같은 파일의 변경을 중복이라고 판단하면
추가 mmap 변경을 누락할 수 있습니다. 커널 이벤트가 제공하는 정보의 한계를
고려해 중복 제거 범위를 제한해야 합니다.

참고 자료