[net] Migrate the reporting/NEL store to sql::Statement time accessors

IN REVIEW2026net/extras/sqlitesql-statement-time
2026. 9. 15.jmsmg 프로필 이미지jmsmg

SQLitePersistentReportingAndNelStore가 시간 컬럼을 읽고 쓸 때 손으로 하던 int64 마이크로초 변환을 sql::Statement의 전용 접근자 ColumnTime()·BindTime()으로 바꿨습니다(crbug.com/40176243). 헤더가 "이 방식으로 옮기라"고 지시하는 마이그레이션 시리즈의 두 번째 CL이며, 온디스크 포맷은 바뀌지 않습니다.

문제 설명

  • issue url: https://crbug.com/40176243 (Time) · https://crbug.com/40251269 (TimeDelta)
  • sql::Statementbase::Time 컬럼용 ColumnTime()·BindTime()을 제공하고, sql/statement.hbase::Time::FromDeltaSinceWindowsEpoch(base::Microseconds(ColumnInt64(col))) 같은 수동 변환을 이 메서드로 교체하라는 TODO를 달고 있습니다.
  • net/extras/sqlite/sqlite_persistent_reporting_and_nel_store.cc는 양방향 모두 수동 변환이었습니다. 로드 경로는 FromDeltaSinceWindowsEpoch(Microseconds(ColumnInt64()))base::Time을 복원하고(4곳), 쓰기 경로는 NelPolicyInfo·ReportingEndpointGroupInfo 구조체가 만료·최근 접근 시각을 int64_t *_us_since_epoch 멤버로 들고 있다가 BindInt64()했습니다(6곳).

해결 내용

  • 두 구조체의 시간 멤버를 base::Time expires·last_access로 바꾸고 생성자에서 하던 변환 4줄을 없앴습니다.
  • 바인드 6곳(add·update_access·update_details 문)을 BindTime()으로, 읽기 4곳을 ColumnTime()으로 바꿨습니다. SQL 컬럼 이름(expires_us_since_epoch 등)은 스키마이므로 그대로입니다.
-    policy.expires = base::Time::FromDeltaSinceWindowsEpoch(
-        base::Microseconds(smt.ColumnInt64(6)));
+    policy.expires = smt.ColumnTime(6);

온디스크 포맷 불변: BindTime()ToDeltaSinceWindowsEpoch().InMicroseconds()를 저장하고 ColumnTime()은 그 역변환이라(sql/statement.cc), 수동 변환과 바이트 단위로 같습니다. 1파일 +27/−40.

발굴 과정

시리즈 CL 1(history, 8382856)을 올린 뒤 ToT를 다시 스캔했습니다. 원래 CL 1.5로 잡아 둔 journeys 5곳은 다른 분이 09-11에 먼저 옮겨 사라졌고, 남은 사이트 중 한 파일에 8곳이 몰려 OWNER가 한 명인 net/extras/sqlite를 다음 대상으로 골랐습니다. 첫 패스에서 그룹 update_details 문의 바인드 2곳을 놓쳤는데, 옛 멤버 이름을 grep해 잔여 0을 확인하는 단계에서 잡았습니다.

테스트 방법

동작 불변 리팩토링이라 새 테스트는 없고 기존 테스트 통과가 검증입니다.

  • gn check //net/extras/sqlite/* 통과
  • net_unittests --gtest_filter='SQLitePersistentReportingAndNelStore*' 27/27 통과 (Mac, Xcode 27/SDK 27 첫 빌드, 15분)

배운 점

  • 쓰기 쪽은 단순 치환이 아닐 수 있습니다. 시간이 구조체에 int64로 저장돼 있으면 멤버 타입부터 base::Time으로 바꿔야 BindTime()이 자연스럽고, 그래야 변환 코드가 사라집니다.
  • 멤버 이름을 바꾸는 변경은 커밋 전에 옛 이름을 grep해 잔여 0을 확인합니다. 컴파일러가 잡아 주지만 빌드 한 바퀴를 아낍니다.
  • 리뷰어는 처음부터 두 명입니다. 비커미터 CL은 커미터 두 명의 +1이 있어야 CQ가 돕니다.

참고 자료