From c2e95bb782bfa1aea1b4e1d4da3174ebe3962a2a Mon Sep 17 00:00:00 2001 From: lovasoa Date: Tue, 6 Oct 2026 10:16:39 +0200 Subject: [PATCH] ci(oracle) :: test against Instant Client 23ai instead of 21c 21c is an older innovation release; 23ai matches the database server used in CI and may have fixed or changed the finiSqora client cleanup path. No public reports of the bccFreeProcess exit deadlock were found (finiSqora appears only in an unrelated 2020 iRODS crash stack). Verified locally: all 90 integration tests pass in ~16s with the 23.26.0.0.0 client against Oracle 23.26.2, with a clean process exit. --- .github/workflows/ci.yml | 4 ++-- docker-compose.yml | 2 +- scripts/install-oracle-odbc.sh | 33 +++++++++++++++++++++------------ 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dbb4b6fd3..0c665252a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -100,7 +100,7 @@ jobs: - database: oracle test_args: --test-threads=2 container: oracle - db_url: "Driver=Oracle 21 ODBC driver;Dbq=//127.0.0.1:1521/FREEPDB1;Uid=root;Pwd=Password123!" + db_url: "Driver=Oracle 23 ODBC driver;Dbq=//127.0.0.1:1521/FREEPDB1;Uid=root;Pwd=Password123!" - database: duckdb container: "" db_url: "Driver=DuckDB;Database=/tmp/sqlpage-test.duckdb" @@ -128,7 +128,7 @@ jobs: uses: actions/cache@v6 with: path: ${{ runner.temp }}/sqlpage-oracle-instantclient-archives - key: oracle-instantclient-linux-x64-21.21.0.0.0-v1 + key: oracle-instantclient-linux-x64-23.26.0.0.0-v1 - name: Install Oracle ODBC driver if: matrix.database == 'oracle' run: | diff --git a/docker-compose.yml b/docker-compose.yml index 677996dde..b17201540 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,7 +4,7 @@ # DATABASE_URL='postgres://root:Password123!@localhost/sqlpage' # DATABASE_URL='mssql://root:Password123!@localhost/sqlpage' # DATABASE_URL='mysql://root:Password123!@localhost/sqlpage' -# DATABASE_URL='Driver=Oracle 21 ODBC driver;Dbq=//127.0.0.1:1521/FREEPDB1;Uid=root;Pwd=Password123!' +# DATABASE_URL='Driver=Oracle 23 ODBC driver;Dbq=//127.0.0.1:1521/FREEPDB1;Uid=root;Pwd=Password123!' # DATABASE_URL='Driver=DuckDB;Database=/tmp/sqlpage-test.duckdb' # Run for instance: diff --git a/scripts/install-oracle-odbc.sh b/scripts/install-oracle-odbc.sh index 2399d0be3..a7afbb98a 100755 --- a/scripts/install-oracle-odbc.sh +++ b/scripts/install-oracle-odbc.sh @@ -5,33 +5,42 @@ set -euo pipefail cd "$(dirname "${BASH_SOURCE[0]}")/.." -# Keep the same client version as the RPM installation, without converting RPMs -# to Debian packages. CI caches the archives; verify them even on cache hits. +# Oracle Instant Client 23ai (23.26.x). 21c is an older innovation release; +# 23ai matches the database server used in CI (gvenzl/oracle-free:23.x) +# and may have fixed or changed the client cleanup path involved in the +# finiSqora exit hang. Download the official ZIPs instead of converting +# RPMs to Debian packages. CI caches the archives; verify them even on +# cache hits. +oracle_version="23.26.0.0.0" +oracle_build="2326000" +oracle_dir="instantclient_23_26" +oracle_driver="Oracle 23 ODBC driver" +oracle_so="libsqora.so.23.1" archive_dir="${RUNNER_TEMP:-/tmp}/sqlpage-oracle-instantclient-archives" install_dir="${RUNNER_TEMP:-/tmp}/sqlpage-oracle-instantclient" mkdir -p "$archive_dir" "$install_dir" for package in basic odbc; do - archive="instantclient-${package}-linux.x64-21.21.0.0.0dbru.zip" + archive="instantclient-${package}-linux.x64-${oracle_version}.zip" if [[ ! -f "$archive_dir/$archive" ]]; then curl --fail --location --remove-on-error --retry 3 --connect-timeout 15 \ - --max-time 180 --output "$archive_dir/$archive" \ - "https://download.oracle.com/otn_software/linux/instantclient/2121000/$archive" + --max-time 300 --output "$archive_dir/$archive" \ + "https://download.oracle.com/otn_software/linux/instantclient/${oracle_build}/$archive" fi done ( cd "$archive_dir" sha256sum --check <<'CHECKSUMS' -9cd0d5d5619ddaac43aa2214bab48e84155ca7e057d937634d1909b298125e8a instantclient-basic-linux.x64-21.21.0.0.0dbru.zip -37e4326ac14b08d9130d499fe5c1ba58f8ad72e8196f5618c0dc5880a24d6a23 instantclient-odbc-linux.x64-21.21.0.0.0dbru.zip +d6c79cbcf0ff209363e779855c690d4fc730aed847e9198a2c439bcf34760af5 instantclient-basic-linux.x64-23.26.0.0.0.zip +e4e715d2dbf7f1c6907adceb8a62bea33d3ae2ae4466118df346b6c213af4fb4 instantclient-odbc-linux.x64-23.26.0.0.0.zip CHECKSUMS ) for package in basic odbc; do - unzip -oq "$archive_dir/instantclient-${package}-linux.x64-21.21.0.0.0dbru.zip" -d "$install_dir" + unzip -oq "$archive_dir/instantclient-${package}-linux.x64-${oracle_version}.zip" -d "$install_dir" done -client_dir="$install_dir/instantclient_21_21" +client_dir="$install_dir/$oracle_dir" # Ubuntu 24.04's libaio package uses a different SONAME from Oracle's client. libaio_path="$(ldconfig -p | awk '$1 ~ /^libaio\.so\.1(t64)?$/ { path = $NF } END { print path }')" @@ -39,9 +48,9 @@ test -n "$libaio_path" ln -sf "$libaio_path" "$client_dir/libaio.so.1" cat > "$install_dir/odbcinst.ini" <