@@ -253,7 +253,7 @@ is replaced.
253253
254254---
255255
256- ### Progress Summary (updated 2026-03-30 )
256+ ### Progress Summary (updated 2026-04-01 )
257257
258258| Step | Status | PR |
259259| ---| ---| ---|
@@ -269,16 +269,20 @@ is replaced.
269269| Step 7b — Replicate getFileTransferMetadatas | ✅ MERGED | #1119 |
270270| Step 8a — Replicate StageInfo, RemoteStoreFileEncryptionMaterial | ✅ MERGED | #1120 |
271271| Step 8b — Replicate MetadataV1, ObjectMapperFactory, SqlState | ✅ MERGED | #1121 |
272- | Step 8c — Replicate storage helpers + interface | ✅ Open | #1123 |
273- | Step 8d — Replicate storage client implementations | ✅ Open | #1124 |
274- | Step 8e — Swap ALL imports at once | ✅ Open | #1127 |
275- | Step 9a — Mechanical import swaps in replicated classes | ✅ Open | #1128 |
276- | Step 9b — Replicate OOB telemetry infrastructure | ⬜ TODO | — |
277- | Step 9c — Swap telemetry imports in SnowflakeSQLLoggedException + TelemetryClient | ⬜ TODO | — |
278- | Step 10 — Remove JDBC dependency | ⬜ TODO | — |
272+ | Step 8c — Replicate storage helpers + interface | ✅ MERGED | #1123 |
273+ | Step 8d — Replicate storage client implementations | ✅ MERGED | #1124 |
274+ | Step 8e — Swap ALL imports (pure import swaps) | ✅ MERGED | #1127 |
275+ | Step 9a — Mechanical import swaps in replicated classes | ✅ MERGED | #1128 |
276+ | Step 9b-prep — Replicate OOB telemetry deps | ✅ MERGED | #1129 |
277+ | Step 9b — Replicate TelemetryEvent + TelemetryService | ✅ Open | #1130 |
278+ | Step 9c — Swap telemetry imports | ✅ Open | #1131 |
279+ | Step 10a — Replicate SFException, ExecTimeTelemetryData, etc. | ✅ Open | #1132 |
280+ | Step 10b — Swap SFException imports | ✅ Open | #1134 |
281+ | Step 10c — Remove SFSession/SFBaseSession | ⬜ TODO | — |
282+ | Step 10d — Demote JDBC to test scope | ⬜ TODO | — |
279283
280284** Closed PRs:** #1117 (reverted 7b approach), #1122 (reverted 8c approach)
281- ** Other PRs:** #1118 (error/exception tests on master)
285+ ** Other PRs:** #1118 (error/exception tests on master), # 1133 (Maven retry config)
282286
283287---
284288
@@ -561,73 +565,85 @@ imports.**
561565
562566---
563567
564- ### Step 9b — Replicate OOB telemetry infrastructure ⬜ TODO
568+ ### Step 9b — Replicate OOB telemetry infrastructure ✅ (PRs # 1129 , # 1130 )
565569
566- Replicate the OOB (out-of-band) telemetry classes that
567- ` SnowflakeSQLLoggedException ` depends on. Verbatim replication — no stubs,
568- no logic changes.
570+ ** Done (PR #1129 — prep, MERGED):**
571+ - ` TelemetryThreadPool ` (61 lines) — singleton thread pool
572+ - ` SFTimestamp ` (20 lines) — UTC timestamp formatter
573+ - ` SnowflakeConnectString ` (256 lines) — connection string parser
574+ - ` SnowflakeDriverConstants ` — constants from LoginInfoDTO/SnowflakeDriver
569575
570- ** Classes to replicate (~ 1170 lines total):**
571- - ` TelemetryThreadPool ` (61 lines) — singleton thread pool for async telemetry.
572- No JDBC deps beyond package.
573- - ` SFTimestamp ` (20 lines) — UTC timestamp formatter. No JDBC deps.
574- - ` SnowflakeConnectString ` (256 lines) — connection string parser. Deps:
575- ` SFSessionProperty ` (already replicated), ` SecretDetector ` (already
576- replicated), ` SFLogger ` (already replicated).
577- - ` TelemetryEvent ` (182 lines) — telemetry event builder. Deps:
578- ` SFException ` (JDBC, kept temporarily), ` UUIDUtils ` (already replicated),
579- ` SFTimestamp ` (replicated above), ` SecretDetector ` (already replicated),
580- ` ResourceBundleManager ` (already replicated).
581- - ` TelemetryService ` (651 lines) — OOB telemetry singleton. Deps:
582- ` SnowflakeConnectString ` (replicated above), ` SecretDetector ` (already
583- replicated), ` Stopwatch ` (already replicated), ` TelemetryThreadPool `
584- (replicated above).
576+ ** Done (PR #1130 — main, Open):**
577+ - ` TelemetryEvent ` (182 lines) — telemetry event builder
578+ - ` TelemetryService ` (651 lines) — OOB telemetry singleton
579+ - ` version.properties ` — resource bundle for driver version
585580
586- ** Also add constants:**
587- - ` LoginInfoDTO.SF_JDBC_APP_ID ` = ` "JDBC" ` (from snowflake-common)
588- - ` SnowflakeDriver.implementVersion ` = ` "3.25.1" ` (version string)
581+ ---
582+
583+ ### Step 9c — Swap telemetry imports ✅ Open (PR #1131 )
584+
585+ ** Done:** Mechanical import swaps only:
586+ - ` SnowflakeSQLLoggedException ` : swapped 6 of 12 JDBC imports
587+ (ObjectMapperFactory, SqlState, TelemetryEvent, TelemetryService,
588+ LoginInfoDTO→SnowflakeDriverConstants, SnowflakeDriver→SnowflakeDriverConstants).
589+ Kept 6: SFBaseSession, SFSession (parameter types), Telemetry,
590+ TelemetryField, TelemetryUtil (interact with session.getTelemetryClient()).
591+ - ` TelemetryClient ` : swapped TelemetryThreadPool. Kept 4: HttpUtil,
592+ SFSession, SnowflakeConnectionV1, SnowflakeSQLException.
593+
594+ ---
589595
590- ** Suggested PR split (~ 200 lines production code per PR):**
591- - PR 1: ` TelemetryThreadPool ` , ` SFTimestamp ` , ` SnowflakeConnectString ` ,
592- constants (~ 340 lines)
593- - PR 2: ` TelemetryEvent ` , ` TelemetryService ` (~ 830 lines — single class
594- exceeds 200-line limit, OK per plan rules)
596+ ### Step 10a — Replicate remaining small JDBC classes ✅ Open (PR #1132 )
597+
598+ ** Done:** Verbatim replication of self-contained classes:
599+ - ` SFException ` (127 lines) — exception type
600+ - ` HttpResponseContextDto ` (54 lines) — HTTP response context
601+ - ` TimeMeasurement ` (53 lines) — epoch microsecond timer
602+ - ` ExecTimeTelemetryData ` (199 lines) — execution time telemetry
603+ - ` ThrowingCallable ` (9 lines) — functional interface
604+ - ` StorageClientUtil ` : added ` getEpochTimeInMicroSeconds `
595605
596606---
597607
598- ### Step 9c — Swap telemetry imports in SnowflakeSQLLoggedException + TelemetryClient ⬜ TODO
608+ ### Step 10b — Swap SFException imports ✅ Open (PR #1134 )
609+
610+ ** Done:** Removed ` SFException ` JDBC imports from 3 files where the
611+ replicated ` SFException ` is now in the same package:
612+ - ` SnowflakeSQLException ` , ` SnowflakeSQLLoggedException ` , ` TelemetryEvent `
599613
600- Mechanical import swaps only — no logic changes, no method removal:
601- - ` SnowflakeSQLLoggedException ` : swap all 12 JDBC telemetry imports to
602- ingest replicated versions (from Step 9b). Full ` sendTelemetryData() `
603- body preserved verbatim.
604- - ` TelemetryClient ` : swap ` TelemetryThreadPool ` to ingest version
605- (from Step 9b). Remaining JDBC imports (` HttpUtil ` , ` SFSession ` ,
606- ` SnowflakeConnectionV1 ` , ` SnowflakeSQLException ` ) kept until Step 10.
614+ ` ExecTimeTelemetryData ` /` HttpResponseContextDto ` in ` SnowflakeGCSClient `
615+ NOT swapped — they interact with JDBC's ` RestRequest.executeWithRetries() ` .
607616
608617---
609618
610- ### Step 10 — Remove JDBC Dependency ⬜ TODO
619+ ### Step 10c — Remove SFSession/SFBaseSession ⬜ TODO
620+
621+ SFSession/SFBaseSession are always null from ingest callers. Not feasible
622+ to replicate (1498+1404 lines, 156-class transitive closure = 40K lines).
623+ Need to remove these parameter types.
624+
625+ ---
611626
612- Remaining JDBC imports after Step 9c (all in ` fileTransferAgent/ ` ):
613- - ` SFSession ` /` SFBaseSession ` (15 imports) — always null from callers.
614- Need stubs or parameter type changes.
615- - ` SFException ` (2 imports) — used in one ` SnowflakeSQLException ` constructor
616- (never called) and caught in ` parseCommandInGS ` (calls JDBC's ` SFStatement ` ).
617- - ` SnowflakeConnectionV1 ` , ` SnowflakeSQLException ` in ` TelemetryClient `
618- — session-based code path, never used by ingest.
619- - ` HttpUtil ` in ` TelemetryClient ` — ` executeGeneralRequest ` for both
620- session and sessionless paths.
621- - GCS HTTP types (4 imports) — ` ExecTimeTelemetryData ` , ` HttpResponseContextDto ` ,
622- ` HttpUtil ` , ` RestRequest ` in ` SnowflakeGCSClient ` .
627+ ### Step 10d — Demote JDBC to test scope ⬜ TODO
628+
629+ Remaining 27 JDBC imports after Step 10b (all unreplicable due to massive
630+ dependency chains):
631+ - ` SFSession ` /` SFBaseSession ` (15) — parameter types, always null
632+ - ` HttpUtil ` (2) — GCS client + TelemetryClient
633+ - ` RestRequest ` (1) — GCS client
634+ - ` SnowflakeConnectionV1 ` (1) — TelemetryClient session path
635+ - ` SnowflakeSQLException ` (JDBC's, 1) — TelemetryClient
636+ - ` ExecTimeTelemetryData ` /` HttpResponseContextDto ` (2) — GCS client
637+ (replicated but interact with JDBC RestRequest)
638+ - IB ` Telemetry ` /` TelemetryField ` /` TelemetryUtil ` (3) —
639+ interact with session.getTelemetryClient()
640+ - ` SFSession ` in ` SnowflakeSQLLoggedException ` (2) — parameter types
623641
624642Then:
625- 1 . Create ` SFSession ` /` SFBaseSession ` stubs or change parameter types
626- 2 . Replace remaining JDBC HTTP utilities with direct Apache HttpClient
627- 3 . Change ` snowflake-jdbc-thin ` scope to ` test ` in ` pom.xml `
628- 4 . Remove JDBC shade relocation rules from Maven Shade plugin
629- 5 . Remove ` snowflake-jdbc-thin ` from ` public_pom.xml `
630- 6 . Run full test suite
643+ 1 . Demote ` snowflake-jdbc-thin ` to ` test ` scope in ` pom.xml `
644+ 2 . Remove JDBC shade relocation rules from Maven Shade plugin
645+ 3 . Remove ` snowflake-jdbc-thin ` from ` public_pom.xml `
646+ 4 . Run full test suite
631647
632648---
633649
0 commit comments