OSSCA Chromium

기여 목록 / 8505617

[mac] Remove the expired Mac.AppCodeSignClone* histograms

BrowsercleanupMerged

macOS에서 Chrome이 자기 앱 번들의 copy-on-write clone을 만들 때 기록하던 히스토그램 5개(Mac.AppHardLinkError, Mac.AppClonefileError, Mac.AppCodeSignCloneCount, Mac.AppCodeSignCloneExists, Mac.AppCodeSignCloneCreationTime)와, 지표만을 위해 하던 작업을 제거했습니다. 다섯 개 모두 2025-08~10에 만료됐습니다. 4파일 +1/−226, clone 생성·정리 동작은 그대로입니다. 리뷰를 기다리는 동안 이 CL이 지우는 RecordCloneCount() 안의 DCHECK_GE를 CHECK_GE로 바꾼 8500682가 먼저 머지돼 병합 충돌이 났습니다. 삭제를 유지하는 쪽으로 리베이스한 PS2를 올리자 avi@의 승인이 초기화돼 다시 승인을 받았고, chrome/browser/mac OWNER인 mark@를 두 번째 리뷰어로 더해 승인 두 개를 모았습니다. 제출을 부탁한 뒤 avi@의 CQ로 2026-10-07(UTC)에 머지됐습니다(5cb84f800e128).

문제 설명

  • crbug 없음 (자체 발굴)
  • CodeSignCloneManager는 업데이트가 디스크에 놓였을 때 실행 중인 Chrome의 코드 서명 검증이 깨지지 않도록 앱 번들의 clone을 만들어 둡니다. 이 과정에서 하드 링크·clonefile 오류, clone 개수, clone 존재 여부, 생성 시간을 기록했습니다.
  • 다섯 히스토그램은 2025-08-03 ~ 2025-10-05에 만료됐고 expired_intentionally 표시도 없었습니다.

해결 내용

  • 오류 기록 helper 2개와 그 호출을 지웠습니다.
  • RecordCloneCount()를 지웠습니다. clone을 만들 때마다 clone 임시 디렉터리에 getattrlist()를 호출해 항목 수를 세던 함수입니다.
  • clone 존재 확인 타이머를 지웠습니다. 하루에 한 번 깨어나 clone의 main executable과 Info.plist가 남아 있는지 확인하고, 사라졌으면 기록한 뒤 멈추는 타이머로, 기록 외에 하는 일이 없었습니다. MacCloneExists enum·CloneExists()·타이머 메서드 3개와 멤버를 함께 지웠습니다.
  • clone 생성 시간 측정, 존재 확인에서만 쓰던 kContentsInfoPlist 상수, 안 쓰게 된 include 5개를 지웠습니다. 헤더는 base/timer/timer.h 대신 실제로 쓰는 base/task/sequenced_task_runner.h를 include합니다.
  • histograms.xml의 다섯 항목과 MacCloneExists enum을 지웠습니다. MacErrno enum은 다른 히스토그램이 써서 남겼습니다.

발굴 과정

10-02 «파일 전체 만료» 재스캔에서 이 파일의 히스토그램 다섯 개가 모두 만료된 것으로 나왔습니다. Mac 전용 코드라 Mac에서만 빌드·테스트할 수 있어, 리눅스 작업 환경과 나눠 맡기에 좋은 후보였습니다. 기록 코드를 읽어 보니 clone 개수와 존재 여부는 지표를 위해서만 시스템 호출과 타이머를 쓰고 있어서, 지우면 실제로 하는 일도 줄어듭니다. 리뷰어는 chrome/browser/mac 코드와 mac 히스토그램 양쪽 OWNER이자 히스토그램 owner인 avi@입니다. OSSCA #658.

테스트 방법

  • 최신 main(10-01) 위 unit_tests 증분 빌드 13스텝 24초
  • unit_tests --gtest_filter='CodeSignCloneManagerTest.*' 10/10 통과
  • presubmit 통과, 히스토그램 pretty_print.py·validate_format.py 통과

배운 점

  • 지표 코드를 지울 때는 그 코드만 쓰던 상수와 include까지 따라가야 합니다. 빌드하기 전에 직접 점검해서, 그대로 두면 -Wunused-const-variable로 빌드가 깨졌을 kContentsInfoPlist를 미리 찾았습니다.
  • 헤더에서 include를 지울 때는 그 include를 통해 간접적으로 받던 선언이 없는지 봐야 합니다. 여기서는 base/timer/timer.h가 base::SequencedTaskRunner 선언을 대신 가져오고 있었습니다.
  • 리뷰 중에 다른 CL이 같은 함수를 고쳐 먼저 머지되면 병합 충돌이 납니다. 충돌 난 줄이 이 CL이 통째로 지우는 코드 안에 있으면 삭제를 유지하는 쪽으로 풀고, 새 PS에 무엇이 달라졌는지 한 줄 적어 재승인을 부탁합니다.

참고 자료