{
  "schema_version": 2,
  "id": "integrate/redis-data-integration/release-notes/rdi-2-2-0",
  "title": "Redis Data Integration release notes 2.2.0 (October 2026)",
  "url": "https://redis.io/docs/latest/integrate/redis-data-integration/release-notes/rdi-2-2-0/",
  "summary": "Named pipelines, pipeline configuration export, Snowflake connection discovery, expanded secret references, and high-availability and security improvements.",
  "tags": [
    "docs",
    "operate",
    "rs"
  ],
  "last_updated": "2026-10-30T12:23:39+02:00",
  "page_type": "content",
  "content_hash": "b966219ee1955718ae2b56383fefbec34cd0239b52e0a3b4d0769a053fa478a1",
  "sections": [
    {
      "id": "whats-new-in-220",
      "title": "What's New in 2.2.0",
      "role": "overview",
      "text": ""
    },
    {
      "id": "breaking-changes",
      "title": "Breaking Changes",
      "role": "content",
      "text": "See [Upgrading to RDI 2.2.0](https://redis.io/docs/latest/integrate/redis-data-integration/installation/upgrade#upgrading-to-rdi-220) for the breaking changes and the steps to take before and after you upgrade.\n\nA fresh installation no longer creates an empty `default` pipeline. Create a pipeline before\nusing its endpoints. See [Deploy a pipeline](https://redis.io/docs/latest/integrate/redis-data-integration/data-pipelines/deploy#deploy-a-pipeline)."
    },
    {
      "id": "new-features",
      "title": "New Features",
      "role": "content",
      "text": "- **Export a pipeline configuration with `redis-di export`**: Use `redis-di export [pipeline] --dir <dir>` to write the configuration of a deployed pipeline to `config.yaml` and `jobs/*.yaml`, ready to edit and deploy again with `redis-di deploy --dir <dir>`. See [`redis-di export`](https://redis.io/docs/latest/integrate/redis-data-integration/reference/cli/redis-di-export).\n- **Write records to RDI streams with external sources**: Set the `type` of a source to `external` when another producer writes records directly to the RDI streams. RDI deploys no collector and needs no database connection for such a source, and it still validates the source's jobs. External sources require the Flink processor.\n- **Test Snowflake connections and browse database metadata**: You can test a Snowflake connection and browse its schemas, tables, and columns while setting up a source, before starting replication.\n- **Store any connection parameter in a secret**: RDI accepts any secret key made of uppercase letters, digits, and underscores that starts with a letter, in addition to `USERNAME`, `PASSWORD`, `CACERT`, `CERT`, `KEY`, and `KEY_PASSWORD`. Set the key with `redis-di set-secret <key> --db <source|target>` or through the API v2 secret endpoints. Reference it from `config.yaml` as `${<DB>_DB_<KEY>}`. Pass `--type file` to store the value as a file, such as an additional CA certificate; the reference then resolves to the path of the mounted file.\n- **Use names other than `default` for pipelines**: `POST /api/v2/pipelines`, `PUT /api/v2/pipelines/{name}`, and `redis-di deploy <name>` accept a name of 3 to 20 characters that starts with a lowercase letter, ends with a letter or a digit, uses only lowercase letters, digits, and dashes, and contains no consecutive dashes. The name `rdi` is reserved. Each pipeline gets its own components, secrets, and secret provider resources. Finish upgrading all instances before creating a pipeline, and do not downgrade after creating one. The ingress and metrics paths of a pipeline other than `default` start with the pipeline name, for example `/orders/processor/metrics`, or `/orders/metrics-exporter/metrics` for the classic processor on a VM installation. The ServiceMonitors of the collectors and the stream processors add a `pipeline` label with the pipeline name, and the classic processor metrics exporter reports the metrics of its own pipeline. See [Multiple pipelines in one RDI installation](https://redis.io/docs/latest/integrate/redis-data-integration/data-pipelines/multiple-pipelines).\n- **Delete pipelines with `redis-di delete`**: The command deletes a pipeline, its components, and its RDI database keys while keeping its secrets. Unless you pass `--wait=false`, it waits for the pipeline to disappear or fails after `--timeout`.\n- **See configuration references for secrets**: API v2 pipeline secret endpoints and the `redis-di` CLI report a `config_reference` field. The CLI shows it as the `CONFIG REFERENCE` column of `list-secrets` and `get-secret`, and as the `Config Reference` field of `describe-secret`. Use it as the placeholder for the secret in `config.yaml`, for example `${MYSQL_DB_USERNAME}`.\n- **Trigger manual failover through the API or CLI**: Set `standby_mode` with `redis-di set-setting standby_mode true` or `PATCH /api/v2/settings` to remove an instance from leader election. Restore the previous setting after maintenance; deleting it restores the Helm default. Runtime `standby_mode` overrides `operator.leaderElection.standbyMode`. Use `redis-di list-settings` or `GET /api/v2/settings` to inspect the settings. Changing a setting does not restart the RDI operator or API. See [RDI instance settings](https://redis.io/docs/latest/integrate/redis-data-integration/reference/instance-settings) and [Trigger a failover manually](https://redis.io/docs/latest/integrate/redis-data-integration/installation/ha-test#trigger-a-failover-manually)."
    },
    {
      "id": "bug-fixes",
      "title": "Bug Fixes",
      "role": "content",
      "text": "- **Report Snowflake connection errors as validation failures**: Known authentication and connection failures during metadata discovery now return HTTP `422` with an authentication or connection label instead of HTTP `502`, while preserving the detailed error message.\n- **Report duplicate source properties clearly**: Requests containing both prefixed and unprefixed versions of a Debezium source property now return a validation error without exposing property values instead of an internal server error.\n- **Report RIOTX collector errors in pipeline status**: Failed Snowflake collectors now report their error messages through Kubernetes termination logs.\n- **Clean up legacy RIOTX state when resetting or removing a source**: Cleanup now recognizes the legacy `riotx` segment in older stream names when selecting dead-letter queue entries, counters, statistics, and deduplication keys.\n- **Deploy pipelines with multiple source types**: Fixed malformed YAML document separators in generated Kubernetes manifests that could prevent pipelines using different collector types from deploying.\n- **Move failed components out of `pending`**: A pipeline whose component never becomes available now moves to `error` when the deployment availability timeout elapses, without needing another change to trigger reconciliation.\n- **Report the leader election mode consistently**: With multiple operator replicas, `redis-di info` and `GET /api/v2/info` now report the mode from the replica that runs leader election.\n- **Keep a pipeline in `error` after Kubernetes rejects its configuration**: When Kubernetes rejected a deployed configuration, for example an invalid port in the advanced Flink processor settings, the pipeline could restart its components repeatedly and report an unrelated error, and deploying the corrected configuration could fail. The pipeline now stays in `error` with the cause, keeping the components that the failed configuration created or updated, until you deploy a corrected configuration.\n- **Delete the state of removed components reliably**: After a deploy removed a component, such as a source, its state in the RDI database, such as Debezium offsets and schema history, could remain, so a source added back later could skip its initial snapshot. RDI now reports the pipeline as `updating` until this state is deleted, and as `error` if the deletion takes longer than 90 seconds, for example because the component's pods do not terminate. RDI keeps retrying and clears the error once the state is deleted. A failed reset now also leaves the pipeline in `error` until a later reset succeeds, and deleting a pipeline deletes this state even if the component's pods do not terminate.\n- **Report classic processor throughput correctly with synchronous processing**: With `processors.enable_async_processing` set to `false`, the `rdi_processor_rec_per_sec_total` and `rdi_processor_rec_per_sec_last` metrics are now computed from the total batch time, instead of the slowest of the read, process, and acknowledge times.\n- **Remove the double slash from metrics ingress paths**: For the Debezium collector, the Flink collector, and the Flink processor, an ingress `pathPrefix` that ends in `/` now gives a metrics path without a double slash, for example `/processor/metrics` instead of `/processor//metrics` for `/processor/`, and `/metrics` instead of `//metrics` for `/`.\n- **Acknowledge processed records after a Flink checkpoint**: Records written to the target while a checkpoint was in progress are now acknowledged and deleted from the source stream by a later checkpoint."
    },
    {
      "id": "improvements",
      "title": "Improvements",
      "role": "content",
      "text": "- **Improve job schemas**: Transformation blocks and nested output arguments now describe their supported fields, types, and expression languages, improving editor autocomplete and rejecting invalid job structures earlier. A job file that an earlier version accepted can therefore fail validation, so check your configuration with `redis-di deploy --dry-run` before you redeploy it.\n- **Delete the `default` pipeline**: `DELETE /api/v2/pipelines/default` and `redis-di delete` now delete the `default` pipeline instead of returning `422`.\n- **Limit schema history to captured tables**: The Debezium collector now keeps only the schema history of the captured tables for SQL Server and MariaDB sources as well as MySQL and Oracle sources, so the history stays smaller and the collector recovers faster. PostgreSQL and MongoDB keep no schema history and are unaffected. If you add a table to the `tables` list of an existing MariaDB or SQL Server source, or add a database or schema to the ones it captures, reset the source, or it stops with an unknown schema error when the new table first changes. Set `schema.history.internal.store.only.captured.tables.ddl` to `false` in `advanced.source` to keep the previous behavior."
    },
    {
      "id": "security",
      "title": "Security",
      "role": "security",
      "text": "Compared with RDI 2.0.0, the following dependency updates resolve Common Vulnerabilities and\nExposures (CVEs) in the listed components:\n\n| RDI component | Dependency update from RDI 2.0.0 to RDI 2.2.0 | Resolved CVEs |\n| :-- | :-- | :-- |\n| Collector API | Spring Security `6.5.10` to `7.1.1` | [CVE-2026-59270](https://spring.io/security/cve-2026-59270/), [CVE-2026-59276](https://spring.io/security/cve-2026-59276/), [CVE-2026-47841](https://spring.io/security/cve-2026-47841/), [CVE-2026-47842](https://spring.io/security/cve-2026-47842/) |\n| Collector API | Spring Framework `6.2.18` to `7.0.9` | [CVE-2026-59282](https://spring.io/security/cve-2026-59282/) |\n| Collector API | Spring Retry `2.0.12` to `2.0.13` | [CVE-2026-41710](https://spring.io/security/cve-2026-41710/) |\n| Collector API | Netty handler `4.1.136.Final` to `4.1.137.Final` | [CVE-2026-75595](https://github.com/netty/netty/security/advisories/GHSA-c4c3-7fpv-j4q5), [CVE-2026-75596](https://github.com/netty/netty/security/advisories/GHSA-fccg-mwvh-qqg4) |\n| Collector API, Flink collector, Flink processor | Jackson Databind `2.21.4` to `2.21.7`; Collector API also uses `3.1.7` | [CVE-2026-54515](https://github.com/FasterXML/jackson/wiki/Jackson-Release-2.21.5), [CVE-2026-59889](https://github.com/FasterXML/jackson/wiki/Jackson-Release-2.21.5), [CVE-2026-83557](https://github.com/FasterXML/jackson-databind/security/advisories/GHSA-gx83-3vf8-gh7j), [CVE-2026-91777](https://github.com/FasterXML/jackson-databind/security/advisories/GHSA-cxp5-3px4-pw24) |\n| Collector API | Apache Commons Lang 3 `3.17.0` to `3.20.0` | [CVE-2025-48924](https://nvd.nist.gov/vuln/detail/CVE-2025-48924) |\n| Flink processor | Apache Commons Lang 3 `3.13.0` to `3.18.0`; removed Commons Lang `2.4` | [CVE-2025-48924](https://nvd.nist.gov/vuln/detail/CVE-2025-48924) |\n| Operator | Helm `3.19.5` to `3.20.2` | [CVE-2026-35206](https://github.com/helm/helm/security/advisories/GHSA-hr2v-4r36-88hr) |\n| Operator | containerd Go dependency `1.7.33` to `1.7.36` | [CVE-2026-53495](https://github.com/containerd/containerd/security/advisories/GHSA-7jxh-36q5-gcqv) |\n| Operator | `golang.org/x/crypto` `0.52.0` to `0.57.0` | [CVE-2026-56854](https://pkg.go.dev/vuln/GO-2026-6303), [CVE-2026-56855](https://pkg.go.dev/vuln/GO-2026-6355), [CVE-2026-78662](https://pkg.go.dev/vuln/GO-2026-6354) |\n| API, monitor, classic processor, metrics aggregator | PyJWT `2.14.0` to `2.15.0` | [CVE-2026-101918](https://github.com/jpadilla/pyjwt/security/advisories/GHSA-42vr-xj54-vc7v) |\n| Metrics aggregator | multidict `6.8.0` to `6.9.1` | [CVE-2026-104874](https://github.com/aio-libs/multidict/security/advisories/GHSA-54p9-h82j-f925) |"
    }
  ],
  "examples": []
}
