기여 목록 / 8470088
FileSystem: Wait for quota updates before completing sandbox file writes
StoragefixIn Review
파일 크기를 늘리는 샌드박스 쓰기가 quota observer의 메모리 내 사용량 갱신까지 기다린 뒤 완료되도록 변경했습니다. 쓰기 완료 직후에도 이전 사용량이 조회되던 순서 문제를 다룹니다.
문제 설명
기존 writer는 observer에 크기 변경을 알린 뒤 quota 갱신 완료를 기다리지 않고 쓰기 콜백을 끝낼 수 있었습니다. 별도 시퀀스에서 사용량을 갱신하는 동안 호출자는 쓰기가 끝났다고 판단해 오래된 quota 사용량을 읽을 수 있습니다.
해결 내용
FileUpdateObserver::OnUpdateWithCompletion()과TaskRunnerBoundObserverList::NotifyWithCompletion()을 추가합니다. 모든 observer가 완료한 뒤 원래 시퀀스로 완료 콜백을 게시하며, 동기 완료에서도 게시 단계를 유지합니다.SandboxQuotaObserver는NotifyBucketModified()의 완료 콜백으로 메모리 내 사용량 갱신 완료를 전달합니다. observer가 비활성화됐거나 proxy가 없는 경로도 완료 콜백을 실행합니다.- writer는 파일 크기 증가 알림이 끝날 때까지 pending 상태를 유지하고
DidUpdateObservers()에서 쓰기·취소 처리를 마칩니다. 하위 쓰기가 동기로 끝나도 observer 완료가 남으면ERR_IO_PENDING을 반환합니다. - writer가 사라진 뒤 콜백이 실행되지 않도록 WeakPtr를 사용합니다. 이 변경은 메모리 내 quota 반영 순서를 보장하며, 디스크상의 사용량 캐시까지 동기적으로 기록한다는 의미는 아닙니다.
테스트 방법
WriteCompletesAfterQuotaModificationIsApplied는 quota 알림을 보류한 동안 쓰기가 끝나지 않고, 해제 후 5바이트 사용량 증가와 한 번의 완료를 확인합니다.WriteWaitsForEveryUpdateObserver는 다른 스레드의 추가 observer도 끝나야 완료되는지 검사합니다.FailedWriteDoesNotWaitForQuotaModification과SynchronousQuotaCompletionCompletesWriteOnce는 실패 시 불필요하게 대기하지 않고 동기 완료도 한 번만 처리하는지 확인합니다.CancelWhileQuotaModificationIsPending과DestroyWriterWhileQuotaModificationIsPending은 대기 중 취소·파괴에서 쓰기 콜백이 잘못 호출되지 않는지 검사합니다.
Gerrit 기록상 Patch Set 4는 2026-10-01 UTC에 CQ 실행을 통과했습니다. 보고서 작성 과정에서 Chromium 테스트를 별도로 실행하지는 않았습니다.
관련 이슈와 외부 PR
배운 점
- 변경 알림을 보냈다는 사실과 그 변경이 관찰자의 상태에 반영됐다는 사실은 다릅니다.
- 완료 시점을 늦출 때는 여러 observer, 동기 콜백, 취소와 객체 파괴까지 함께 검증해야 합니다.