Skip to content

Commit 0cd4046

Browse files
sfc-gh-ggengclaude
andcommitted
Update JDBC removal plan: Steps 9b-10b done, 10c-10d scoped
- Steps 1-9a, 9b-prep: MERGED - Steps 9b, 9c, 10a, 10b: Open with PRs - Step 10c: Remove SFSession/SFBaseSession (always null, not replicable) - Step 10d: Demote JDBC to test scope (27 remaining imports with massive dependency chains) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 6f672b2 commit 0cd4046

File tree

1 file changed

+78
-62
lines changed

1 file changed

+78
-62
lines changed

.plans/JDBC_REMOVAL_PLAN.md

Lines changed: 78 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -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

624642
Then:
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

Comments
 (0)