Skip to content

Commit 3fd0c60

Browse files
committed
docs(delta): session-5b — A.1 upstream apache#4700, A.2 carved + reviewed clean (fork #4)
1 parent 24cc1e9 commit 3fd0c60

2 files changed

Lines changed: 80 additions & 0 deletions

File tree

DELTA_PR_SPLIT_PLAN.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,10 @@ Two file classes:
220220
**A.5 — CDF**
221221
- `CometDeltaCdfScanExec.scala`, the `CometExecRule` CDF hook hunk (deferred from A.2),
222222
CDF wiring in the contrib (the Rust `TableChanges` path already landed in A.3x).
223+
- **Also deferred from A.2 (review round 2):** `DeltaIntegration`'s CDF members
224+
(`isCdfRelation`, `transformCdf`, `convertCdfBinding` + its cache, and the
225+
`RowDataSourceScanExec` import) — A.2 stripped them as dead code (no caller until the CDF
226+
hook lands). Re-add them here alongside the CometExecRule CDF arm.
223227
- Tests: `CometDeltaCdcSuite`, `CometDeltaCdfReflectionReproSuite`.
224228

225229
**A.6a — Test battery** *(gated on all extraction PRs + %-path fix being merged)*
@@ -544,6 +548,31 @@ Append-only. Newest entry at the top. Entry template:
544548
- Next action:
545549
```
546550

551+
### 2026-06-20 (session 5b — Opus 4.8) — A.1 opened upstream (#4700); A.2 carved + reviewed clean
552+
- **A.1:** opened upstream as **#4700** (with AI-disclosure footer; new standing rule: every PR body
553+
ends with it). Apache CI is `action_required` (awaiting a maintainer to approve workflow runs for a
554+
non-committer PR — NOT a failure). Fork review-draft #3 closed as superseded.
555+
- **Loose end fixed:** fork PR #2 (monolith, `feat/delta-kernel-read`) was stranded on the pre-main-sync
556+
commit `f442361c3` (I'd pushed the merge to `contrib-delta-direct`/#4366 but not `feat/delta-kernel-read`).
557+
Pushed `9f29732a8` (FF) → #2 MERGEABLE again. Its stale `delta-contrib/*` CI failures were from the old
558+
commit; A.1/#4700 is unaffected (zero Delta surface).
559+
- **A.2 carved** onto `pr/delta-A1-spi` → branch `pr/delta-A2-buildgate` @ **`f2ad00c29`**, fork review
560+
draft **#4** (base = A.1 branch, A.2-only diff). 20 files +4020/-14. An Explore agent produced the
561+
precise carve map (whole-checkout vs partial-carve vs stub vs copy); see `.delta-split/review-log-A2.md`.
562+
Proto `delta_scan = 118`. Stub contrib crate authored (real impl deferred). pom.xml carries
563+
`delta.version` only (NO 4.1.1 pin, §10.1). CometExecRule = marker hook only (CDF → A.5).
564+
- **§5 (all green):** default + gated native build, clippy ×2 feature states, gate-verify script (all
565+
layers), gated + default JVM compile, spotless/scalastyle (both profiles), cargo fmt.
566+
- **Review round (manual + /code-review high, 28 agents, 9 refuted / 6 survived) — 5 fixed, 2 accepted:**
567+
fixed a VACUOUS cargo-tree gate check (no anti-vacuous guard → false pass on cargo failure), a
568+
pipefail+`grep -q` SIGPIPE misfire in the gate script (→ here-strings), dead CDF block in
569+
DeltaIntegration (→ stripped to A.5, see A.5 note), scanHandler per-call MODULE$ re-resolve
570+
(→ @volatile cache), raw Class.forName (→ ClassLoaders.loadClass). Accepted+documented: a Spark-3.4
571+
diagnostic-only fallback-reason string change (rare metadata-col + AQE overlap, matches monolith) and
572+
DeltaConf's unread-in-A.2 config entries (the contrib's config leaf).
573+
- **Next action:** carve **A.3a** (Rust driver side: error/engine/predicate/scan/jni) onto
574+
`pr/delta-A2-buildgate`, OR wait for #4700 review. Open A.2 upstream once A.1 is approved/merged (§8).
575+
547576
### 2026-06-20 (session 5 — Opus 4.8) — maintainers OK'd the plan; #4366 re-synced; A.1 refreshed onto current main + review round 2 clean
548577
- **Phase/unit:** A.1 (Core SPI) refreshed onto post-#4535 main, re-reviewed clean. Maintainers
549578
comfortable with the split plan — execution greenlit. A.1 still fork-local (PR #3); upstream open

review-log-A2.md

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# Unit A.2 — Build gate + inert wiring — review log
2+
3+
Branch: `pr/delta-A2-buildgate` (based on `pr/delta-A1-spi`).
4+
Commit: `f2ad00c29` (single commit; review fixes amended in).
5+
6+
## Carve (from `feat/delta-kernel-read` @ 9f29732a8 against A.1 base)
7+
20 files, +4020/-14. Wholesale-A.2 checkouts (spark/pom.xml, native Cargo.toml ×2,
8+
operator.proto [delta_scan=118], planner.rs, operator_registry.rs, jni_api.rs, CometScanRule.scala);
9+
whole-file copies (delta_scan.rs shim, DeltaIntegration.scala, DeltaConf.scala, gate script);
10+
authored STUB contrib crate (contrib/delta/native/{Cargo.toml,lib.rs,planner.rs} -> plan_delta_scan
11+
returns DataFusionError::NotImplemented); partial carves (pom.xml = delta.version only, NOT the
12+
4.1.1 pin; CometExecRule = marker hook only, CDF hook -> A.5); authored minimal delta_build_gate.yml.
13+
14+
## §5 verification (all green)
15+
default + gated native build; clippy both feature states; gate-verify script (all layers);
16+
gated + default JVM test-compile; spotless + scalastyle (both profiles); cargo fmt (native + contrib).
17+
18+
## Review round (manual /review-comet-pr + /code-review high, 28-agent workflow: 9 refuted, 6 survived)
19+
20+
**Found+fixed (folded into the commit):**
21+
- **[gate script] cargo-tree check was vacuous** (CONFIRMED): a failing `cargo tree` -> empty output
22+
-> leak grep finds nothing -> false PASS (the Maven gate had an anti-vacuous guard, the cargo one
23+
didn't). Added a `datafusion-comet ` anchor assertion. Unit-tested: empty input now fails, real
24+
tree passes.
25+
- **[gate script] pipefail + `grep -q` SIGPIPE** (found during verification): `echo "$BIG" | grep -q`
26+
under `set -o pipefail` returns 141 (grep exits early -> echo SIGPIPE), misfiring the `if !` guard
27+
on the 1842-line effective-pom. Converted the three guards to here-strings and replaced
28+
`head -1` (same early-close hazard) with `sed -n '1s//p'`.
29+
- **[DeltaIntegration] dead CDF block** (CONFIRMED): `isCdfRelation`/`transformCdf`/`convertCdfBinding`
30+
(~65 lines) had no caller in A.2 (the CDF hook is A.5). Stripped to A.5 (plan §4 A.5 updated).
31+
- **[DeltaIntegration] scanHandler re-resolved MODULE$ per call** (CONFIRMED): violated the repo's
32+
cache-reflection convention. Added a @volatile `scanHandlerCache` (memoised once per JVM).
33+
- **[DeltaIntegration] raw Class.forName** (PLAUSIBLE): swapped to `ClassLoaders.loadClass`
34+
(thread-context-classloader-first), matching IcebergReflection's convention.
35+
36+
**Accepted / documented (not fixed — match the green monolith, default behavior unchanged):**
37+
- **metadata-col fallback REASON string on Spark<3.5** (CONFIRMED, diagnostic-only): a V1 scan with
38+
BOTH a metadata column AND an AQE DPP filter now reports "AQE Dynamic Partition Pruning requires
39+
Spark 3.5+" instead of "Metadata column is not supported". Both still fall back to Spark (no
40+
behavior change); the string differs only in this rare Spark-3.4 overlap. Inherent to letting Delta
41+
claim metadata-col scans (the reorder is required); the metadata-col guard is re-applied inside
42+
transformV1Scan so non-overlap cases are identical. Matches the monolith.
43+
- **DeltaConf's 4 entries are unread in A.2** (PLAUSIBLE): they're the contrib's config surface,
44+
consumed by later units. DeltaConf is the leaf the plan deliberately ships so the contrib
45+
add-source dir compiles; trimming would fragment the config object or need an artificial placeholder.
46+
47+
**Refuted (9):** style dups (parameterize the two near-identical reflection caches), `isAvailable`
48+
no-caller (public util), `isDeltaScanMarker` getClass.getName per node (inherent to marker matching),
49+
compiled-class gate "vacuous on compile failure" (the find-based check is fine), et al.
50+
51+
**State:** A.2 review clean. Ready to open upstream once A.1 (#4700) is approved/merged (per §8).

0 commit comments

Comments
 (0)