jackylee-ch opened a new issue, #12694:
URL: https://github.com/apache/gluten/issues/12694

   ### Description
   
   Which configurations get delivered from JVM to native side is currently 
decided by hard-coded
   string lists inside `GlutenConfig.getNativeSessionConf` / 
`getNativeBackendConf`:
   
   - a `nativeKeys` set of 40+ raw key strings;
   - two "configs having default values" `Seq`s that restate each conf's key 
**and** its default;
   - per-key special cases inlined into the selection methods (byte-unit 
conversion for
     `spark.shuffle.file.buffer`, upper-casing for 
`spark.sql.legacy.timeParserPolicy`, …);
   - `BackendSettingsApi.extraNativeSessionConfKeys` / 
`extraNativeBackendConfKeys` as the escape
     hatch for backends.
   
   #### Why it matters
   
   **The declaration lives far from the definition.** Adding a native conf 
means editing a central
   list in `gluten-substrait`, not the conf's own definition. Nothing links the 
two, so the usual
   failure mode is a conf that looks wired up but never reaches native — or the 
reverse, a key that
   keeps being delivered long after its native reader was removed. 
`spark.gluten.velox.fs.s3a.retry.mode`
   is an instance of the latter: it has had no native reader since #8123 moved 
the S3 config path to
   Velox's `S3Config`, yet it is still on the list.
   
   **Defaults are duplicated and can drift.** The default-value `Seq`s repeat 
what the `ConfigEntry`
   already declares. Two copies of the same default, updated by hand.
   
   **Backend-specific keys live in common code.** `gluten-substrait` enumerates 
Velox S3 keys, so a
   ClickHouse-only deployment carries Velox key names, and vice versa. There is 
no module boundary.
   
   **Delivery scope is invisible at the definition.** A conf is delivered on 
the backend channel, the
   runtime channel, or both purely by virtue of which list it appears in. 
Reading the conf's
   definition tells you nothing about it, and a mismatch between the declared 
mutability of a conf and
   where native actually consumes it is impossible to notice. Surveying the 
current lists turned up
   several: `velox.cudf.enableTableScan` is declared static yet read per query;
   `memoryOverhead.size.in.bytes` is declared modifiable yet consumed only at 
backend init.
   
   **Third parties cannot participate.** An out-of-tree backend or component 
has no way to declare its
   own native confs. `extraNativeBackendConfKeys` is the only hook, it takes a 
bare `Set[String]`
   (no per-channel scope, no default, no normalization), and no backend in the 
tree has ever
   overridden it.
   
   #### Proposal
   
   Move the declaration to each conf's definition, and let the conf's own 
properties decide how it is
   delivered.
   
   1. **Declare at the definition site.** A marker on the config builder, e.g. 
`passToNative()`,
      states that the conf reaches native. Related markers cover the two 
remaining behaviors the old
      per-key special cases provided: delivering the conf's default when the 
user did not set it (for
      keys native relies on being present), and normalizing a value before 
delivery.
   
   2. **Derive the channel from mutability rather than stating it.** A conf 
that is modifiable at any
      time should be delivered wherever native might read it — both at backend 
initialization and on
      each native runtime creation. A conf that is set at backend init and 
immutable afterwards only
      needs delivering once, at backend init. This makes the channel a 
consequence of a property the
      declaration already states, so there is nothing extra to get wrong, and 
it forces the
      mutability/consumption mismatches above to be resolved rather than 
papered over.
   
   3. **Support Spark- and Hadoop-owned keys.** Keys such as 
`spark.sql.orc.compression.codec` or
      `spark.hadoop.input.read.timeout` must **not** get a Gluten `ConfigEntry` 
— their owner already
      registered them, and registering again conflicts with `SQLConf`. They 
need a declaration form
      that states only the native delivery.
   
   4. **Express "overrides a Spark conf" declaratively.** Several Gluten confs 
exist only to depart
      from a Spark default (`spark.gluten.sql.columnar.shuffle.codec` over
      `spark.io.compression.codec`). Today the relationship is hand-written at 
each read site. A
      fallback declaration should carry it, including whether a value came from 
the Gluten key or was
      inherited — callers that validate the two differently need that 
distinction.
   
   5. **Give components an entry point.** A conf object is a Scala `object`, so 
declaring one is not
      enough: its declarations only take effect once something touches it. 
Components need a hook that
      Gluten invokes early enough for the backend channel — i.e. before any 
backend's driver/executor
      startup, where native backend init happens. This is what makes the 
mechanism usable from
      out-of-tree code, and it also makes declarations naturally modular: a 
backend's declarations only
      exist when that backend is loaded, so Velox keys never leak into a 
ClickHouse deployment.
   
   Prefix-based rules (`spark.gluten.sql.columnar.backend.<backend>`, 
`spark.hadoop.fs.s3a.`, …) are
   out of scope — they cover open-ended key families and are pattern rules 
rather than enumerable
   declarations.
   
   #### Acceptance criteria
   
   - No hard-coded native conf key list, default-value list, or per-key special 
case remains in the
     selection methods.
   - The delivered key/value set is unchanged for every existing conf, except 
where a mismatch is
     deliberately corrected — each such difference stated explicitly.
   - A conf's native delivery is readable from its definition alone.
   - An out-of-tree backend or component can declare native confs without 
modifying Gluten common
     code, verified from outside the `org.apache.gluten` package.
   - The declared mutability of every native-passed conf matches where native 
consumes it.
   
   This description was written with the assistance of generative AI tooling 
(Claude Code).
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to