Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
fe3175e
[doc](connector) add project tracking system for catalog SPI migration
morningman May 25, 2026
4235de9
[feat](connector) P0 SPI baseline + DDL/Partition + import gate (T03-…
morningman May 25, 2026
ea61b53
[P1-T03-T05] route plugin-driven scans first in nereids translator (#…
morningman May 25, 2026
dfc58d6
[feat](connector) P2 migrate trino-connector to catalog SPI (T01-T13)…
morningman Jun 4, 2026
6021582
[feat](connector) P3 hudi connector hardening + test baseline + dispa…
morningman Jun 6, 2026
e0703a5
[refactor](connector) P4 maxcompute: remove legacy subsystem from fe-…
morningman Jun 9, 2026
3ab9005
update P5 handoff and fix compile issue
morningman Jun 9, 2026
65ddc62
[refactor](catalog) P5 paimon: migrate to catalog SPI + cutover (#644…
morningman Jun 20, 2026
3effe0b
[refactor](catalog) P5 paimon: remove legacy subsystem from fe-core +…
morningman Jun 20, 2026
5e00532
[refactor](catalog) P3b: consolidate kerberos authentication into fe-…
morningman Jun 21, 2026
8450d7c
[refactor](catalog) P6 iceberg: migrate to catalog SPI + cutover + re…
morningman Jul 5, 2026
3b8d5dd
[fix](catalog) jdbc: keep driver classloaders alive per URL to stop M…
morningman Jul 7, 2026
3d8e8e1
[fix](catalog) P4 maxcompute: drop dangling legacy MaxComputeExternal…
morningman Jul 7, 2026
843844a
[fix](catalog) port upstream #65332/#65094 datasource fixes into SPI …
morningman Jul 9, 2026
dbd1b99
[fix](catalog) tier3 #65094: preserve external-table top-level column…
morningman Jul 9, 2026
1afb9c1
[feat](catalog) P6.6-C6 #63068 SPI: neutral delegated-credential DTO …
morningman Jul 10, 2026
a9701b5
[feat](catalog) P6.6-C6 #63068 FE: capability-gated credential inject…
morningman Jul 10, 2026
4f80cfb
[feat](catalog) P6.6-C6 #63068 iceberg: per-user REST session routing…
morningman Jul 10, 2026
65f0628
[doc](catalog) P6.6-C6 #63068 OIDC session migration: design + resear…
morningman Jul 10, 2026
dda855c
[feat](catalog) P6.6-C6 #63068 FE: re-migrate ExternalDatabaseSession…
morningman Jul 10, 2026
7ecb548
[doc](catalog) P6.6-C6 #63068 HANDOFF: record cache-leakage data-flow…
morningman Jul 10, 2026
a3b61ca
[fix](catalog) reconcile upstream #65365 with connector SPI after reb…
morningman Jul 10, 2026
64a3228
[fix](build) fix parallel -T shade race in fe-connector-paimon-hive-s…
morningman Jul 14, 2026
e931e9b
[doc](catalog) HANDOFF: rebase to upstream 30a44d61a8a + register $po…
morningman Jul 15, 2026
046ccc2
[doc](catalog) P6.6 $position_deletes connector port: research notes …
morningman Jul 15, 2026
09d62d1
[doc](catalog) HANDOFF: point next step at the $position_deletes port…
morningman Jul 15, 2026
9520659
[feat](catalog) P6.6: support the iceberg $position_deletes system ta…
morningman Jul 15, 2026
8f22dd8
[doc](catalog) HANDOFF: $position_deletes port done; e2e is the only …
morningman Jul 15, 2026
afb59b5
[refactor](catalog) Catalog spi 11 hive (#65473)
morningman Jul 16, 2026
282256e
[refactor](catalog) fe-connector: replace fat hive-catalog-shade with…
morningman Jul 16, 2026
ec93c22
[refactor](catalog) fe-core: remove dead Trino-ported DirectoryLister…
morningman Jul 16, 2026
174c1a6
[refactor](catalog) fe-core: remove dead ExternalMetadataOps layer, d…
morningman Jul 16, 2026
c123b2e
[refactor](catalog) fe-core: remove 6 dead datasource classes orphane…
morningman Jul 17, 2026
d8cffef
[refactor](catalog) fe-core: reorganize datasource/ root into subpack…
morningman Jul 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
266 changes: 266 additions & 0 deletions .claude/wf-d2-cache-recon.js

Large diffs are not rendered by default.

5 changes: 4 additions & 1 deletion be/src/common/config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1543,7 +1543,10 @@ DEFINE_mInt64(s3_put_token_limit, "0");
DEFINE_mInt64(s3_rate_limiter_log_interval, "1000");
DEFINE_Validator(s3_rate_limiter_log_interval, [](int64_t config) -> bool { return config >= 0; });

DEFINE_String(trino_connector_plugin_dir, "${DORIS_HOME}/plugins/connectors");
// The dir TrinoConnectorPluginLoader loads Trino's own plugins from, used verbatim. Keep the default
// in sync with FE Config.trino_connector_plugin_dir: FE and BE load the same plugins and an operator
// who leaves both untouched expects both to find them.
DEFINE_String(trino_connector_plugin_dir, "${DORIS_HOME}/plugins/trino_plugins");

// ca_cert_file is in this path by default, Normally no modification is required
// ca cert default path is different from different OS
Expand Down
4 changes: 4 additions & 0 deletions be/src/io/fs/connectivity/s3_connectivity_tester.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ namespace doris::io {

Status S3ConnectivityTester::test(const std::map<std::string, std::string>& properties) {
auto it = properties.find(TEST_LOCATION);
if (it == properties.end()) {
return Status::InvalidArgument("Missing '{}' property in S3 connectivity test request",
TEST_LOCATION);
}
S3URI s3_uri(it->second);
RETURN_IF_ERROR(s3_uri.parse());

Expand Down
26 changes: 24 additions & 2 deletions build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -1042,7 +1042,11 @@ if [[ "${BUILD_FE}" -eq 1 ]]; then
mkdir -p "${DORIS_OUTPUT}/fe/conf/ssl"
mkdir -p "${DORIS_OUTPUT}/fe/plugins/jdbc_drivers/"
mkdir -p "${DORIS_OUTPUT}/fe/plugins/java_udf/"
mkdir -p "${DORIS_OUTPUT}/fe/plugins/connectors/"
# Drop point for the trino-connector's own Trino plugins. Deliberately NOT the legacy
# plugins/connectors/: that name is still read as a fallback for deployments upgrading from
# <= 2.1.8, so a fresh install must not create it (an empty dir would be harmless, but the
# one-letter gap to the plugins/connector/ tree above is not).
mkdir -p "${DORIS_OUTPUT}/fe/plugins/trino_plugins/"
mkdir -p "${DORIS_OUTPUT}/fe/plugins/hadoop_conf/"
mkdir -p "${DORIS_OUTPUT}/fe/plugins/java_extensions/"

Expand Down Expand Up @@ -1082,6 +1086,23 @@ if [[ "${BUILD_FE}" -eq 1 ]]; then
done
unset CONN_PLUGIN_DIR conn_module conn_plugin_target conn_module_dir conn_zip

# RC-4: self-contain the paimon connector plugin for OSS. The connector sets
# fs.oss.impl=com.aliyun.jindodata.oss.JindoOssFileSystem; that impl lives in the jindofs jars,
# which are packaged from thirdparty by post-build.sh into fe/lib/jindofs (NOT a maven artifact).
# The plugin runs child-first, so without its OWN copy JindoOssFileSystem resolves from the parent
# 'app' classloader and cannot be cast to the plugin's child-loaded org.apache.hadoop.fs.FileSystem.
# Copy the jindofs jars into the paimon plugin lib so JindoOssFileSystem loads child-first alongside
# the plugin's own hadoop FileSystem (same self-contained intent as the bundled hadoop-aws/S3A).
# Naturally gated: a no-op unless jindofs was packaged (--jindofs / DISABLE_BUILD_JINDOFS=OFF).
# CAVEAT (docker-gated, enablePaimonTest=true): jindo-core ships a native lib that can bind to only one
# classloader per JVM, so this is safe only while no concurrent non-paimon path loads jindo from
# fe/lib/jindofs in the same FE process.
PAIMON_CONN_LIB="${DORIS_OUTPUT}/fe/plugins/connector/paimon/lib"
if [[ -d "${PAIMON_CONN_LIB}" && -d "${DORIS_OUTPUT}/fe/lib/jindofs" ]]; then
cp -p "${DORIS_OUTPUT}/fe/lib/jindofs/"*.jar "${PAIMON_CONN_LIB}/" 2>/dev/null || true
fi
unset PAIMON_CONN_LIB

if [ "${TARGET_SYSTEM}" = "Darwin" ] || [ "${TARGET_SYSTEM}" = "Linux" ]; then
mkdir -p "${DORIS_OUTPUT}/fe/arthas"
rm -rf "${DORIS_OUTPUT}/fe/arthas/*"
Expand Down Expand Up @@ -1251,7 +1272,8 @@ EOF
mkdir -p "${DORIS_OUTPUT}/be/plugins/jdbc_drivers/"
mkdir -p "${DORIS_OUTPUT}/be/plugins/java_udf/"
mkdir -p "${DORIS_OUTPUT}/be/plugins/python_udf/"
mkdir -p "${DORIS_OUTPUT}/be/plugins/connectors/"
# Mirrors the FE drop point above; the BE JNI scanner loads the same Trino plugins independently.
mkdir -p "${DORIS_OUTPUT}/be/plugins/trino_plugins/"
mkdir -p "${DORIS_OUTPUT}/be/plugins/hadoop_conf/"
mkdir -p "${DORIS_OUTPUT}/be/plugins/java_extensions/"
cp -r -p "${DORIS_HOME}/be/src/udf/python/python_server.py" "${DORIS_OUTPUT}/be/plugins/python_udf/"
Expand Down
162 changes: 162 additions & 0 deletions docker/thirdparties/hive-regression-local-env.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
# Hive Regression Local Environment

This document records the local Docker and regression configuration needed to run:

```bash
regression-test/suites/external_table_p0/hive/
```

## Required Thirdparty Components

Run Hive2 and Hive3 through the thirdparty launcher:

```bash
./docker/thirdparties/run-thirdparties-docker.sh -c hive2,hive3 --hive-mode refresh
```

The Hive startup script may also start `mysql` automatically. Both
`docker-compose/hive/hive-2x_settings.env` and
`docker-compose/hive/hive-3x_settings.env` default `JFS_CLUSTER_META` to:

```bash
mysql://root:123456@(127.0.0.1:3316)/juicefs_meta
```

Because of that setting, `run-thirdparties-docker.sh` treats local MySQL 5.7 as
an implicit dependency for Hive.

Each Hive version starts its own compose services:

- Hive2: `hive2-server`, `hive2-metastore`, `hadoop2-namenode`,
`hadoop2-datanode`, `hive2-metastore-postgresql`
- Hive3: `hive3-server`, `hive3-metastore`, `hadoop3-namenode`,
`hadoop3-datanode`, `hive3-metastore-postgresql`
- MySQL 5.7: required by the default JuiceFS metadata URI when using the local
`127.0.0.1:3316` endpoint

The Hive p0 directory does not require these components by default:

- `pg`
- `iceberg`
- `minio`
- `hudi`
- `kerberos`
- `ranger`

`test_external_catalog_hive.groovy` has a Ranger-specific branch guarded by
`enableRangerTest`; if this option is not set to `true`, that branch is skipped.

## Current Running Containers Observed

The following relevant containers were running when checked with
`sudo docker ps`:

- Hive3 stack: `hive3-server`, `hive3-metastore`, `hadoop3-datanode`,
`hadoop3-namenode`, `hive3-metastore-postgresql`; all healthy
- Hive2 stack: `hive2-server`, `hive2-metastore`, `hadoop2-datanode`,
`hadoop2-namenode`, `hive2-metastore-postgresql`; all healthy
- MySQL 5.7: `mysql-doris--syt--mysql_57-1`, healthy, published as
`127.0.0.1:3316 -> 3306`

Other Doris thirdparty containers were also running, but they are not required
for `external_table_p0/hive/`:

- PostgreSQL 14 on `5442`
- Iceberg REST, Spark, Postgres, and MinIO
- Oracle on `1521`
- ClickHouse on `8123`
- SQLServer on `1433`
- OceanBase on `2881`

The observed Hive2/Hive3 and MySQL compose projects came from another checkout
under `/mnt/disk2/suyiteng/doris`, not from this worktree. PostgreSQL and
Iceberg compose projects came from this worktree.

## Regression Configuration

The Hive p0 suite directly reads these keys from
`regression-test/conf/regression-conf.groovy`:

```groovy
enableHiveTest
externalEnvIp
hive2HmsPort
hive2HdfsPort
hive3HmsPort
hive3HdfsPort
hdfsUser
```

It also uses framework helpers backed by:

```groovy
brokerName
hdfsPasswd
hdfsFs
```

For local Hive2/Hive3 Docker with default ports, the relevant values are:

```groovy
enableHiveTest = true

hive2HmsPort = 9083
hive2HdfsPort = 8020
hive2ServerPort = 10000
hive2PgPort = 5432

hive3HmsPort = 9383
hive3HdfsPort = 8320
hive3ServerPort = 13000
hive3PgPort = 5732

hdfsUser = "doris-test"
brokerName = "broker_name"
hdfsPasswd = ""
```

`externalEnvIp` must be the address that Doris BE can use to reach the Hive
Docker services. For a fully local setup this is usually:

```groovy
externalEnvIp = "127.0.0.1"
```

If BE runs in a context where `127.0.0.1` is not the Docker host, use the host
IP selected by `run-thirdparties-docker.sh` through `IP_HOST`.

## Config Gaps Noted In regression-conf.groovy.bak

`regression-test/conf/regression-conf.groovy.bak` already contains the core Hive
keys listed above. The notable follow-ups are:

- `externalEnvIp` was set to `172.20.32.136`; verify this is reachable from BE,
or replace it with `127.0.0.1` for local host-mode Docker.
- FE/JDBC addresses in the file used `9033`, `9022`, and `8033`; align these
with the current Doris worktree cluster ports before running regression.
- `enableRangerTest` is not present. This is acceptable for the Hive p0 suite
because the Ranger-specific branch is guarded and skipped unless explicitly
enabled.

## Thirdparty Script Settings

Before starting Hive through `run-thirdparties-docker.sh`, set a unique
`CONTAINER_UID` in:

```bash
docker/thirdparties/custom_settings.env
```

The default `CONTAINER_UID="doris--"` is rejected by the startup script.

Hive baseline restore also depends on these settings:

```bash
s3Endpoint
s3BucketName
HIVE_BASELINE_VERSION
HIVE_BASELINE_TARBALL_CACHE
```

If baseline download is unavailable, place the matching tarball manually under
`HIVE_BASELINE_TARBALL_CACHE`.
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@
import org.apache.doris.common.classloader.ThreadClassLoaderContext;
import org.apache.doris.common.jni.JniScanner;
import org.apache.doris.common.jni.vec.ColumnType;
import org.apache.doris.common.security.authentication.PreExecutionAuthenticator;
import org.apache.doris.common.security.authentication.PreExecutionAuthenticatorCache;
import org.apache.doris.kerberos.PreExecutionAuthenticator;
import org.apache.doris.kerberos.PreExecutionAuthenticatorCache;

import com.google.common.base.Joiner;
import com.google.common.base.Preconditions;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@
import org.apache.doris.common.jni.JniScanner;
import org.apache.doris.common.jni.vec.ColumnType;
import org.apache.doris.common.jni.vec.ColumnValue;
import org.apache.doris.common.security.authentication.PreExecutionAuthenticator;
import org.apache.doris.common.security.authentication.PreExecutionAuthenticatorCache;
import org.apache.doris.kerberos.PreExecutionAuthenticator;
import org.apache.doris.kerberos.PreExecutionAuthenticatorCache;

import com.google.common.base.Preconditions;
import org.apache.iceberg.FileScanTask;
Expand Down
5 changes: 5 additions & 0 deletions fe/be-java-extensions/java-common/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,11 @@ under the License.
</properties>

<dependencies>
<dependency>
<groupId>org.apache.doris</groupId>
<artifactId>fe-kerberos</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.doris</groupId>
<artifactId>fe-common</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@
// specific language governing permissions and limitations
// under the License.

package org.apache.doris.common.maxcompute;
package org.apache.doris.maxcompute;

import org.apache.doris.common.maxcompute.MCProperties;

import com.aliyun.auth.credentials.Credential;
import com.aliyun.auth.credentials.provider.EcsRamRoleCredentialProvider;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@

import org.apache.doris.common.jni.JniScanner;
import org.apache.doris.common.jni.vec.ColumnType;
import org.apache.doris.common.maxcompute.MCUtils;

import com.aliyun.odps.Odps;
import com.aliyun.odps.table.configuration.CompressionCodec;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
import org.apache.doris.common.jni.vec.VectorColumn;
import org.apache.doris.common.jni.vec.VectorTable;
import org.apache.doris.common.maxcompute.MCProperties;
import org.apache.doris.common.maxcompute.MCUtils;

import com.aliyun.odps.Odps;
import com.aliyun.odps.OdpsType;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@
import org.apache.doris.common.jni.JniScanner;
import org.apache.doris.common.jni.vec.ColumnType;
import org.apache.doris.common.jni.vec.TableSchema;
import org.apache.doris.common.security.authentication.PreExecutionAuthenticator;
import org.apache.doris.common.security.authentication.PreExecutionAuthenticatorCache;
import org.apache.doris.kerberos.PreExecutionAuthenticator;
import org.apache.doris.kerberos.PreExecutionAuthenticatorCache;

import com.google.common.base.Preconditions;
import org.apache.paimon.CoreOptions;
Expand Down Expand Up @@ -50,6 +50,7 @@
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
Expand Down Expand Up @@ -271,6 +272,12 @@ static int getFieldIndex(List<String> fieldNames, String fieldName) {
}

private List<Predicate> getPredicates() {
// Backstop for a missing paimon_predicate param (scan with no pushed-down filter): a null here means
// "no filter", not an error. Guard the unconditional deserialize so the JNI reader never NPEs on
// deserialize(null) ("encodedStr is null"). The FE producer also always emits an (empty) predicate now.
if (paimonPredicate == null) {
return Collections.emptyList();
}
List<Predicate> predicates = PaimonUtils.deserialize(paimonPredicate);
if (LOG.isDebugEnabled()) {
LOG.debug("predicates:{}", predicates);
Expand Down
12 changes: 12 additions & 0 deletions fe/be-java-extensions/preload-extensions/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,18 @@ under the License.
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
<!-- Runtime-only: Hive-using JNI scanners (paimon-hive-connector / hudi / HiveConf)
need org.apache.commons.lang.StringUtils (commons-lang 2.x) at runtime. It used to
arrive transitively via fe-common's odps-sdk-core; after P4-T09 (a53f2b17b8d) made
fe-common odps-free it was evicted from this shared preload classpath, breaking every
scanner with NoClassDefFoundError. Restore it here (version managed by fe/pom.xml) so
it lands in the preload-extensions runtime classpath, the shared parent of all JNI
scanners, while staying out of java-udf's own jar. -->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.arrow</groupId>
<artifactId>arrow-memory-unsafe</artifactId>
Expand Down
Loading
Loading