[net] Migrate the reporting/NEL store to sql::Statement time accessors
IN REVIEW2026net/extras/sqlitesql-statement-time
2026. 9. 15.
jmsmg
SQLitePersistentReportingAndNelStore가 시간 컬럼을 읽고 쓸 때 손으로 하던 int64 마이크로초 변환을 sql::Statement의 전용 접근자 ColumnTime()·BindTime()으로 바꿨습니다(crbug.com/40176243). 헤더가 "이 방식으로 옮기라"고 지시하는 마이그레이션 시리즈의 두 번째 CL이며, 온디스크 포맷은 바뀌지 않습니다.
문제 설명
- issue url: https://crbug.com/40176243 (Time) · https://crbug.com/40251269 (TimeDelta)
sql::Statement는base::Time컬럼용ColumnTime()·BindTime()을 제공하고, sql/statement.h는base::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가 돕니다.