OSSCA Chromium

기여 목록 / 8484715

CacheStorage: Use cache-level deletion for CacheStorage origin data

ContentfixMerged

CacheStorage의 출처 데이터를 삭제할 때 버킷 전체를 제거하는 대신 각 캐시를 삭제 대상으로 표시하도록 변경했습니다. 이미 전달된 캐시 핸들은 계속 사용할 수 있고, 실제 데이터 정리와 할당량 갱신은 캐시 수명에 맞춰 이루어집니다.

문제 설명

기존 출처 데이터 삭제는 버킷 삭제 경로를 사용하거나 이전 형식의 저장소 디렉터리를 직접 제거했습니다. 이 방식은 렌더러 등이 이미 보유한 캐시 핸들의 수명을 고려하지 못했습니다. 출처의 캐시 목록에서 제거하는 것과 사용 중인 캐시의 데이터를 실제로 정리하는 시점을 구분할 필요가 있었습니다.

버킷 디렉터리와 인덱스를 유지하면 캐시가 없는 출처까지 목록에 표시될 수 있습니다. 또한 인덱스 읽기·파싱·마이그레이션 실패를 빈 인덱스로만 처리하면, 삭제할 캐시를 확인하지 못했는데도 삭제 성공으로 보고할 수 있었습니다.

해결 내용

  1. 캐시 단위로 삭제 처리

    CacheStorageManager::DeleteOriginsDataGotAllBucketInfo()에서 대상 버킷의 캐시 이름을 열거하고 각각 DoomCache()를 호출합니다. 캐시를 새 조회에서 숨기되 기존 핸들은 유지하며, 실제 정리는 캐시 수명이 끝날 때 수행합니다. 버킷 디렉터리와 인덱스를 남겨 같은 저장소에서 후속 작업도 할 수 있도록 합니다.

  2. 빈 저장소를 출처 목록에서 제외

    메모리 저장소는 HasCaches()로 현재 조회 가능한 캐시가 있는지 확인합니다. 디스크 저장소는 인덱스의 캐시 개수가 0이면 버킷을 출처 목록에 추가하지 않습니다.

  3. 인덱스 오류를 삭제 결과까지 전달

    인덱스 로딩 결과에 오류 정보를 추가하고 index_load_error_에 보관해 EnumerateCaches() 콜백으로 전달합니다. 로더는 인덱스 파일이 없는 경우와 읽기·파싱·마이그레이션 실패를 구분합니다. 이후 인덱스를 성공적으로 기록하면 보관한 오류를 해제합니다.

    디스크 버킷 열거 중 오류가 나도 읽을 수 있는 버킷은 계속 처리합니다. 전체 데이터를 확인하지 못했거나 캐시 삭제가 실패하면 최종 결과를 kErrorAbort로 반환해, 불완전한 삭제를 성공으로 처리하지 않습니다.

테스트 방법

cache_storage_manager_unittest.cc에 다음 회귀 테스트를 추가했습니다.

테스트 검증 내용
DeleteOriginDataKeepsOpenCacheUsable 삭제 후에도 기존 핸들로 응답을 읽을 수 있지만 새 조회에서는 캐시가 보이지 않는지 확인합니다. 같은 이름으로 새 캐시를 만든 뒤 이전 핸들을 해제해도 새 캐시의 데이터가 유지되는지 검사합니다.
DeleteOriginDataUpdatesQuotaOnce 핸들을 유지하는 동안에는 삭제에 따른 할당량 알림이 없고, 해제 후 한 번만 알림이 발생하며 사용량이 0이 되는지 확인합니다.
EmptyIndexDoesNotListOrigin 캐시가 없는 유효한 인덱스를 디스크에 남겨도 출처 목록에 표시되지 않는지 확인합니다.
DeleteOriginDataReportsCorruptIndex 손상된 인덱스가 있으면 kErrorAbort를 반환하면서도 정상적인 다른 버킷의 캐시는 삭제하는지 확인합니다.
DeleteOriginDataReportsIndexLoadError 이전 형식 캐시의 디렉터리가 없어 마이그레이션에 실패하면 오류가 전달되고, 새 캐시의 인덱스 기록이 성공하면 오류 상태에서 복구되는지 확인합니다.

기존 출처 삭제 테스트에는 이름 있는 버킷도 삭제되는지 확인하는 검증을 추가했습니다. Gerrit 기록상 Patch Set 5는 2026년 9월 30일 UTC에 CQ dry run을 통과했습니다. 위 내용은 패치와 Gerrit 기록을 기준으로 정리했으며, 보고서 작성 과정에서 Chromium 테스트를 별도로 실행하지는 않았습니다.

배운 점

  • 캐시를 새 조회에서 제거하는 시점과 실제 데이터를 정리하는 시점은 다를 수 있습니다. 이미 전달한 핸들의 수명과 할당량 알림을 함께 검증해야 합니다.
  • 삭제 후 인덱스를 유지하는 설계에서는 빈 인덱스가 출처 목록에 다시 나타나지 않도록 해야 합니다.
  • 빈 결과와 읽기 실패를 같은 값으로 처리하면 삭제 성공 여부를 잘못 판단할 수 있습니다. 오류를 열거 콜백과 최종 삭제 결과까지 전달해야 합니다.

참고 자료