기여 목록 / 8479611
[sql] Use ColumnTime() in the activity log and opt-out blocklist stores
확장 프로그램 활동 로그와 opt-out 차단 목록 DB가 시간 값을 읽을 때 손으로 하던 변환을 sql::Statement::ColumnTime()으로 바꿨습니다. sql::Statement 시간 접근자 이행 시리즈(crbug.com/40176243, OSSCA #416)의 네 번째 CL입니다. 2파일 +4/−6, 저장 형식은 바뀌지 않습니다. jkarlin@와 andreaorru@의 +1을 받았고, 첫 CQ가 인프라 문제(tryjob 대기열 만료)로 실패한 뒤 andreaorru@가 다시 돌려 2026-10-02에 머지됐습니다(7dd8d0f134d4c).
문제 설명
- issue url: https://crbug.com/40176243
sql/statement.h는 시간 컬럼을ColumnTime()·BindTime()으로 다루고 손 변환을 옮기라는 TODO를 남겨 두었습니다. CL 1(history, 8382856), CL 2(net NEL, 8410045), CL 3(password_manager, 8474691)에 이어 남은 곳을 옮기고 있습니다.- 이번 두 파일은 쓰기는 이미
BindTime()을 쓰는데 읽기만 옛 방식이었습니다. 활동 로그는base::Time::FromInternalValue(), 차단 목록은base::Time() + base::Microseconds()로 읽고 있었습니다.
해결 내용
fullstream_ui_policy.cc의DoReadFilteredData(): 시간 컬럼 읽기를query.ColumnTime(1)로opt_out_store_sql.cc의LoadBlockListFromDataBase(): 시간 컬럼 읽기를statement.ColumnTime(1)로
- query.ColumnString(0),
- base::Time::FromInternalValue(query.ColumnInt64(1)),
+ query.ColumnString(0), query.ColumnTime(1),
...
- base::Time() + base::Microseconds(statement.ColumnInt64(1)), true);
+ statement.ColumnTime(1), true);활동 로그의 기간 조건(BindInt64(early_bound) 등)은 별도 유틸이 계산한 정수 경계값이라 이번 범위에서 뺐습니다.
발굴 과정
#416 등록 때 세운 시리즈 계획의 네 번째 묶음입니다. 계획에는 declarative_performance_observer도 있었지만, 최신 트리(09-24 main)를 다시 검색해 보니 그쪽은 이미 바뀌어 있어 두 파일로 줄었습니다. 두 파일의 OWNER가 달라 blocklist OWNER jkarlin@에게 먼저 받았습니다. activity_log의 단독 OWNER rdevlin.cronin@는 «Exceptionally swamped» 상태여서, 상위 extensions OWNERS에 있는 andreaorru@에게 두 번째 리뷰를 받았습니다.
테스트 방법
동작 불변 리팩토링이라 새 테스트는 없고 기존 테스트 통과가 검증입니다.
- 등가성:
base::Time구현에서Time() + Microseconds(x)와FromDeltaSinceWindowsEpoch(Microseconds(x))가 모두Time(x)가 되고,FromInternalValue(x)도Time(x)임을 확인했습니다.ColumnTime()은FromDeltaSinceWindowsEpoch(Microseconds(...))입니다. components_unittests·unit_tests증분 빌드 12스텝 20초components_unittests --gtest_filter='OptOutStoreSQLTest*:*OptOutBlocklist*'23/23,unit_tests --gtest_filter='FullStreamUIPolicyTest*:*ActivityLog*:CountingPolicyTest*'70/70 통과- presubmit 0 경고
배운 점
- 같은 값을 만드는 옛 코드가 여러 모양(
FromInternalValue,Time() + Microseconds,FromDeltaSinceWindowsEpoch)으로 흩어져 있어, 한 가지 패턴으로만 검색하면 놓칩니다. 등가성은base::Time구현을 직접 읽어 확인합니다. - 시리즈 계획은 착수 직전에 다시 검색해 범위를 줄이거나 늘립니다.
- code owner 승인은 파일마다 따로 채워집니다. jkarlin@의 +1은 blocklist 파일만 승인했고, activity_log 파일은 상위 디렉터리 OWNERS를 통해 채웠습니다. 하위 OWNERS에
set noparent가 없으면 상위 OWNER도 승인할 수 있습니다.