OSSCA Chromium

기여 목록 / 8470088

FileSystem: Wait for quota updates before completing sandbox file writes

StoragefixIn Review

파일 크기를 늘리는 샌드박스 쓰기가 quota observer의 메모리 내 사용량 갱신까지 기다린 뒤 완료되도록 변경했습니다. 쓰기 완료 직후에도 이전 사용량이 조회되던 순서 문제를 다룹니다.

문제 설명

기존 writer는 observer에 크기 변경을 알린 뒤 quota 갱신 완료를 기다리지 않고 쓰기 콜백을 끝낼 수 있었습니다. 별도 시퀀스에서 사용량을 갱신하는 동안 호출자는 쓰기가 끝났다고 판단해 오래된 quota 사용량을 읽을 수 있습니다.

해결 내용

  1. FileUpdateObserver::OnUpdateWithCompletion()과 TaskRunnerBoundObserverList::NotifyWithCompletion()을 추가합니다. 모든 observer가 완료한 뒤 원래 시퀀스로 완료 콜백을 게시하며, 동기 완료에서도 게시 단계를 유지합니다.
  2. SandboxQuotaObserver는 NotifyBucketModified()의 완료 콜백으로 메모리 내 사용량 갱신 완료를 전달합니다. observer가 비활성화됐거나 proxy가 없는 경로도 완료 콜백을 실행합니다.
  3. writer는 파일 크기 증가 알림이 끝날 때까지 pending 상태를 유지하고 DidUpdateObservers()에서 쓰기·취소 처리를 마칩니다. 하위 쓰기가 동기로 끝나도 observer 완료가 남으면 ERR_IO_PENDING을 반환합니다.
  4. writer가 사라진 뒤 콜백이 실행되지 않도록 WeakPtr를 사용합니다. 이 변경은 메모리 내 quota 반영 순서를 보장하며, 디스크상의 사용량 캐시까지 동기적으로 기록한다는 의미는 아닙니다.

테스트 방법

  • WriteCompletesAfterQuotaModificationIsApplied는 quota 알림을 보류한 동안 쓰기가 끝나지 않고, 해제 후 5바이트 사용량 증가와 한 번의 완료를 확인합니다.
  • WriteWaitsForEveryUpdateObserver는 다른 스레드의 추가 observer도 끝나야 완료되는지 검사합니다.
  • FailedWriteDoesNotWaitForQuotaModification과 SynchronousQuotaCompletionCompletesWriteOnce는 실패 시 불필요하게 대기하지 않고 동기 완료도 한 번만 처리하는지 확인합니다.
  • CancelWhileQuotaModificationIsPending과 DestroyWriterWhileQuotaModificationIsPending은 대기 중 취소·파괴에서 쓰기 콜백이 잘못 호출되지 않는지 검사합니다.

Gerrit 기록상 Patch Set 4는 2026-10-01 UTC에 CQ 실행을 통과했습니다. 보고서 작성 과정에서 Chromium 테스트를 별도로 실행하지는 않았습니다.

관련 이슈와 외부 PR

배운 점

  • 변경 알림을 보냈다는 사실과 그 변경이 관찰자의 상태에 반영됐다는 사실은 다릅니다.
  • 완료 시점을 늦출 때는 여러 observer, 동기 콜백, 취소와 객체 파괴까지 함께 검증해야 합니다.

참고 자료