OSSCA Chromium

기여 목록 / 8535926

[storage] Remove 18 expired Quota histograms

StoragecleanupMerged

브라우저가 사이트별 저장 공간(IndexedDB·Cache Storage 등)의 할당량을 관리하는 storage/browser/quota에서, 만료돼 더 이상 수집되지 않는 Quota.* 히스토그램 18개와 그것에만 쓰이던 코드를 지웠습니다. 13파일 +12/−458. evanstade@가 먼저 승인했고, 히스토그램 xml까지 13파일 모두의 OWNER인 leimy@를 두 번째 리뷰어로 더해 승인을 받았습니다. 직접 건 CQ는 이 변경과 무관한 Android 테스트(TabbedActivityLaunchCauseMetricsTest의 옴니박스 DCHECK 크래시)로 두 번 떨어졌습니다. 패치를 뺀 재실행이 통과해서 CQ가 이 CL 탓으로 판정했지만, 같은 시기 다른 CL 30여 개와 CL이 없는 CI 빌더도 같은 테스트로 떨어지고 있었습니다. 그 테스트가 비활성화된 뒤 세 번째 CQ로 2026-10-14(UTC)에 머지됐습니다(c767ad7e564f7).

문제 설명

  • 공식 정리 작업 메타 버그: https://crbug.com/499059525 (대상은 자체 발굴, OSSCA #749)
  • tools/metrics/histograms/metadata/quota/histograms.xml의 Quota 히스토그램 28개 중 19개가 2025-04-27 ~ 2026-06-21에 만료됐고, expired_intentionally 표시도 없었습니다. 히스토그램 문서는 만료된 히스토그램의 기록 코드를 죽은 코드로 보고 지우라고 안내합니다.
  • 기록 코드는 네 클래스에 흩어져 있었습니다. QuotaManagerImpl 11개, 저장 공간이 모자랄 때 데이터를 비우는 QuotaTemporaryStorageEvictor 5개, QuotaDatabase 1개, QuotaDeviceInfoHelper 1개입니다.

해결 내용

  • 18개의 기록 코드와 histograms.xml 항목을 지웠습니다.
  • 이 히스토그램에만 쓰이던 코드도 함께 지웠습니다.
    • 한 시간마다 버킷 테이블 전체를 읽던 덤프와 UsageTracker::GetCachedStorageKeysUsage()
    • 사이트별 할당량을 계산하는 UsageAndQuotaInfoGatherer의 is_incognito 인자
    • evictor의 매시간 히스토그램 타이머, 이전 통계 사본, 라운드별 사용량·디스크 부족 통계
    • DatabaseResetReason enum, 지표만 검사하던 EvictBucketDataHistogram 테스트, 다른 곳에서 쓰지 않게 된 enum 2개
  • 한 시간마다 전체 사용량을 계산하는 GetGlobalUsage() 호출은 남겼습니다. 계산 결과는 더 기록하지 않지만, 이 호출이 사용량 캐시를 채우고 저장 공간에 여유가 있을 때 eviction이 그 캐시를 읽습니다. 지우면 eviction 판단이 바뀔 수 있어서 남기고, 그 이유를 주석으로 적었습니다.
  • 만료된 Quota.DatabaseMigration{VersionUpgrades}도 남겼습니다. 마이그레이션 코드가 기록하는데, 10-05에 머지된 CL(8509906)이 «정리 작업에서 마이그레이션 코드를 지우지 말 것»이라는 주석을 남겼기 때문입니다.
   if (db_file_path_.empty()) {
-    if (db_->OpenInMemory()) {
-      return true;
-    }
-    RecordDatabaseResetHistogram(DatabaseResetReason::kOpenInMemoryDatabase);
-    return false;
+    return db_->OpenInMemory();
   }

발굴 과정

10-06 media·net·storage 집중 스캔에서 «Quota 만료 히스토그램 15개»를 후보로 잡았습니다. 착수 직전 xml의 만료일을 기준으로 다시 세어 보니 만료된 것은 19개였습니다. 코드에서 이름 문자열만 찾다 보니 상수(kEvictedBucket*Histogram), 다른 파일(quota_device_info_helper.cc), StrCat 조합으로 기록되는 4개를 놓쳤던 것입니다. 그중 마이그레이션 히스토그램을 뺀 18개로 범위를 정했습니다. 같은 팀이 9월 말 IndexedDB의 만료 히스토그램을 같은 방식으로 지운 CL(8452023)이 있어서, 이전 quota CL을 리뷰해 준 evanstade@에게 리뷰를 요청했습니다.

테스트 방법

  • 본 체크아웃의 빌드 결과를 그대로 쓰려고, 리뷰 중인 다른 브랜치 위에 임시 브랜치를 만들어 수정 전·후를 같은 명령으로 비교했습니다.
  • storage_unittests --gtest_filter='*Quota*:*UsageTracker*': 수정 전 309/309 → 수정 후 308/308. 줄어든 1개는 지운 지표 전용 테스트이고, 나머지 테스트 목록은 같습니다.
  • presubmit 0 경고, validate_format.py·pretty_print.py --presubmit 통과
  • CQ: dry run은 2026-10-12에 통과했습니다. CQ+2는 android-x64-rel의 chrome_public_test_apk에서 TabbedActivityLaunchCauseMetricsTest#testExternalSearchIntentNoResolvers 크래시로 두 번 떨어졌고(패치 적용 실패 → 재시도 실패 → 패치 제외 통과), 그 테스트가 비활성화된 뒤 세 번째에 통과했습니다.

배운 점

  • 만료 히스토그램 후보는 xml의 만료일에서 출발해 세고, 기록 위치는 이름 문자열·상수 이름·접두어 조합 세 가지로 찾습니다. 문자열 검색만으로는 상수나 StrCat으로 기록되는 것을 놓칩니다.
  • 지표 코드처럼 보이는 호출에도 다른 역할이 있을 수 있습니다. 여기서는 사용량 계산 호출이 eviction이 읽는 캐시를 채우고 있어서 남겼습니다.
  • 정리 작업 전에 그 디렉터리에 최근 머지된 CL을 확인합니다. 마이그레이션 코드를 지우지 말라는 주석이 사흘 전에 들어와 있었습니다.
  • CQ가 «패치를 빼면 통과하니 이 CL 탓»이라고 판정해도 무관한 실패일 수 있습니다. 실패한 테스트가 바꾼 파일과 닿는지 먼저 보고, LUCI Analysis에서 같은 테스트로 떨어진 다른 CL이 있는지 확인합니다. 그 테스트가 계속 깨져 있는 동안에는 재시도도 같은 이유로 떨어지므로, 고쳐지거나 비활성화된 것을 확인하고 다시 겁니다.

참고 자료