Skip to content

Verify delivery in a disposable local Docker environment

This runbook is for maintainers and platform engineers validating the real DDA ClickHouse → MSSQL route. It uses the existing native runtime, native ClickHouse source, BCP, SQL transaction authority and SQLite recovery journal. Return to delivery acceleration for the feature scope and certification for evidence acceptance rules.

Prepare the services

Explicitly approve the disposable environment before starting services or setting live approval flags. Use separate ClickHouse and SQL Server containers and a Linux runner with Python, Microsoft ODBC Driver 18 and BCP. Place them on a private Docker network without published host ports. Preserve unrelated containers.

Create an Atomic ClickHouse database and a SQL Server database, both named dda_synthetic. The local factory refuses other database names. SQL Server needs catalog/identity-registry permissions and enough allocated free log space for native admission; a maximum file size alone does not provide that headroom. For this local synthetic experiment, SIMPLE recovery with a 256 MiB allocated log avoids accumulation between runs. Do not apply this setting to working or production databases. Retain service image digests, resource limits and the actual server versions with the experiment evidence.

The September 2026 local experiment uses ClickHouse 24.8.14.39, SQL Server 16.0.4265.3, BCP 18.6 and Python 3.12. SQL Server is amd64 under ARM64 emulation. These observations do not establish production x86-64 performance.

Supply credentials through process environment, without storing passwords in manifests, command arguments, evidence or shell history:

Environment variable Meaning
DPONE_IT_CH_HOST, DPONE_IT_CH_PORT Native ClickHouse endpoint
DPONE_IT_CH_DATABASE dda_synthetic
DPONE_IT_CH_USER, DPONE_IT_CH_PASSWORD Approved source credentials
DPONE_IT_MSSQL_HOST, DPONE_IT_MSSQL_PORT SQL Server endpoint
DPONE_IT_MSSQL_DATABASE dda_synthetic
DPONE_IT_MSSQL_USER, DPONE_IT_MSSQL_PASSWORD Approved target credentials
DPONE_IT_MSSQL_BCP_PATH Installed BCP executable
DPONE_IT_MSSQL_TRUST_SERVER_CERTIFICATE Disposable self-signed TLS setting
DPONE_DDA_SPOOL_ROOT Durable private directory outside both source checkouts

Install the selected subject's native connector dependencies and keep the factory/harness producer checkout separate. Explicitly set PYTHONPATH so the selected subject's src precedes the producer root. Verify the actual imported dpone.__file__ and Git identity; an adapter label is not source identity. When invoking repository pytest against a separate subject, set DPONE_TEST_USE_INSTALLED_PACKAGE=1 to prevent tests/conftest.py from prepending the producer's src, and pass -o pythonpath=/absolute/subject/src. Despite that legacy flag's name, record source imports honestly as source imports.

Run and inspect

Prepare a JSON limits file containing the exact eight legacy NativeChunkLimits fields for a v1 run:

{
  "max_total_encoded_bytes": 100000000,
  "stage_allocated_bytes_stop_threshold": 100000000,
  "max_rows": 65536,
  "max_bytes": 16777216,
  "max_row_bytes": 1048576,
  "max_pending": 2,
  "max_staging_tables": 1024,
  "parallelism": 1
}

For an independent-stage experiment, create a separate limits file with all eight fields above plus "encoding_parallelism": 2 and "import_parallelism": 1. With parallelism: 1, this is a canonical ten-field policy and produces a v2 run. Repeat with E=1/I=2 in another file. A ten-field record with both counts equal to parallelism is noncanonical; use the eight-field record instead. Manifest omission/fallback rules differ from these exact report inputs; see concurrency and report migration.

The frozen old subject accepts the eight-field path through its own limits model and the explicit legacy serialization whitelist. Ten-field input requires the new model capability and fails before fixture provisioning on old subjects. Keep candidate src out of that subject's import path.

After environment approval, set DPONE_RUN_INTEGRATION=1, DPONE_RUN_INTEGRATION_LIVE=1 and DPONE_DDA_DISPOSABLE_APPROVED=1. Invoke the existing harness with the local benchmark factory:

python tools/native_delivery_live_benchmark.py run \
  --factory tools.native_delivery_local.factory:create_benchmark_factory \
  --limits /absolute/evidence/limits.json \
  --profile narrow --rows 10000 --trials 3 \
  --strategy full_refresh --mode bounded_native \
  --output /absolute/evidence/candidate/run.json

Create the output parent directory before invoking the harness; it must already exist and be private. Use a new output location for each run. Repeat with partition_replace and the supported profiles wide, unicode, decimal, null and skewed. The binary profile is unsupported because the canonical planner does not provide an authored ClickHouse String-to-varbinary mapping. Do not bypass that rejection. The harness runs exact fidelity and recovery checks before timed trials, then one warmup and at least three trials. Inspect with the harness inspect command. A dirty producer or subject remains UNVERIFIED even when component checks pass.

For stage 2, retain narrow and wide/Unicode runs separately for each policy, with one warmup and three measured trials, raw observations, correctness and recovery receipts, limits, hashes and exact source/environment identities. A comparison PASS still requires the same full configuration on both subjects; these different-policy runs are diagnostic tuning observations and cannot certify a cross-policy speedup. Independent stage limits were released in 0.80.0. Retained exact-source C evidence covers 24 small functional cells and controlled recovery. Earlier H tuning uses a different source identity and cannot be relabelled as released-C performance. A new deployment still requires its own acceptance evidence.

Recover and clean up

Keep the private spool directory and immutable invocation inventory. For harness recover and cleanup, use tools.native_delivery_local.factory:create_factory and the original invocation ID, strategy and limits. The maintenance factory performs no benchmark preparation or source discovery. Recovery uses frozen bindings and fails if it needs to reacquire the source after durable EOF.

Acknowledged rollback is a terminal fixture outcome: clean up and open a new invocation. It is not a source-free replay case. Unknown commit outcomes block replay and cleanup and retain resources for investigation. Never delete journals or target receipts to force a fresh attempt.

Cleanup records deletion intent and progress under the current lease. It can resume a partial cleanup while rejecting replacement objects. It removes owned source and business tables; immutable SQL identity and transaction audit catalogs remain. Native staging cleanup remains the runtime's responsibility.

The source DDL guard is a cooperative cross-process file lock taken by every fixture DDL writer. It is suitable for this exclusively owned synthetic source; exclusion of independent administrator DDL is UNVERIFIED. This factory does not supply a production source-governance service.

Interpret results

Retain raw failures, logs, limits, identities and dependency inventories. The local comparison of baseline 0.76.0 and candidate source uses a shared 0.79.0 Airflow helper distribution needed by the import graph. This is a controlled native source-component experiment, not certification of two standard installed release environments. No Airflow/dbt workload runs in this experiment. Binary support, production DDL exclusion and installed-release performance certification must remain separate unresolved claims.