From b09a9cffd7dbaea52001d45e00899215fed9079b Mon Sep 17 00:00:00 2001 From: Luke Bond Date: Fri, 14 Aug 2026 17:20:59 +0100 Subject: [PATCH] Release 3.0.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bump all version references (Cargo.toml/lock, both charts, and the restate-operator-crds dependency pin) to 3.0.1, and consolidate the unreleased note into release-notes/v3.0.1.md. Patch release: reduces RestateDeployment introspection query load (#190) — owned HPAs are watched for spec changes only, and the deployment-usage query is skipped in the common case. Co-Authored-By: Claude Opus 4.8 --- Cargo.lock | 2 +- Cargo.toml | 2 +- charts/restate-operator-crds/Chart.yaml | 2 +- charts/restate-operator-helm/Chart.yaml | 4 +- .../185-reduce-introspection-query-load.md | 45 ------------------- release-notes/v3.0.1.md | 22 +++++++++ 6 files changed, 27 insertions(+), 50 deletions(-) delete mode 100644 release-notes/unreleased/185-reduce-introspection-query-load.md create mode 100644 release-notes/v3.0.1.md diff --git a/Cargo.lock b/Cargo.lock index 33adb4d..950af7d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2898,7 +2898,7 @@ dependencies = [ [[package]] name = "restate-operator" -version = "3.0.0" +version = "3.0.1" dependencies = [ "actix-web", "anyhow", diff --git a/Cargo.toml b/Cargo.toml index 0fb311f..ca3e06f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "restate-operator" -version = "3.0.0" +version = "3.0.1" authors = ["restate.dev"] edition = "2024" rust-version = "1.92" diff --git a/charts/restate-operator-crds/Chart.yaml b/charts/restate-operator-crds/Chart.yaml index 07ed04e..cbe4afd 100644 --- a/charts/restate-operator-crds/Chart.yaml +++ b/charts/restate-operator-crds/Chart.yaml @@ -2,4 +2,4 @@ apiVersion: v2 name: restate-operator-crds description: Restate operator CustomResourceDefinitions (RestateCluster, RestateDeployment, RestateCloudEnvironment) type: application -version: "3.0.0" +version: "3.0.1" diff --git a/charts/restate-operator-helm/Chart.yaml b/charts/restate-operator-helm/Chart.yaml index 6a55f22..2e7b91c 100644 --- a/charts/restate-operator-helm/Chart.yaml +++ b/charts/restate-operator-helm/Chart.yaml @@ -2,10 +2,10 @@ apiVersion: v2 name: restate-operator-helm description: An operator for Restate clusters type: application -version: "3.0.0" +version: "3.0.1" dependencies: - name: restate-operator-crds - version: "3.0.0" + version: "3.0.1" repository: "file://../restate-operator-crds" condition: installCrds diff --git a/release-notes/unreleased/185-reduce-introspection-query-load.md b/release-notes/unreleased/185-reduce-introspection-query-load.md deleted file mode 100644 index a8604e0..0000000 --- a/release-notes/unreleased/185-reduce-introspection-query-load.md +++ /dev/null @@ -1,45 +0,0 @@ -# Reduce RestateDeployment introspection query load - -## Bug Fix - -### What Changed - -The RestateDeployment controller no longer issues a Restate introspection query -(`POST /query` over `sys_invocation_status`) on every reconcile, and no longer reconciles on -every HorizontalPodAutoscaler status update. Two changes: - -- **Owned HPAs are watched for spec changes only.** The Kubernetes HPA controller re-writes an - HPA's status on a ~15s timer; with per-version autoscaling that is one such write per version - (including every draining one), and each previously woke the owning RestateDeployment. The - watch now filters to generation (spec) changes, so those heartbeats no longer trigger - reconciles. The operator's HPA cache still sees every update. -- **The deployment-usage query runs only when it is needed.** The query answers two questions: - is this version the one Restate routes new invocations to (registration), and have older - versions drained (cleanup). In the common case — this version already latest, with no older - version to drain — the operator determines "already latest" from the cheaper `GET /services` - and skips the invocation-status query entirely. Registration, promotion, rollback, - foreign-takeover, and drain paths run the full query exactly as before. - -### Why This Matters - -With per-version autoscaling enabled, a deployment carrying several draining versions produced -a steady stream of reconciles — roughly one HPA heartbeat every 15 seconds per version — each -issuing an invocation-status query. Across many deployments sharing one Restate admin endpoint -this multiplied into sustained query load that could overwhelm Restate's query engine, -surfacing as `500 Internal Server Error` ("No such scanner") responses from `/query`. - -### Impact on Users - -- No configuration change, and no change to registration, rollback, or drain behaviour. -- Restate admin/query load from the operator drops sharply in the steady state: introspection - queries are issued during rollouts and drains, not continuously. -- HorizontalPodAutoscaler status changes no longer trigger RestateDeployment reconciles; spec - changes and (re)creation still do. - -### Migration Guidance - -None. No CRD, Helm value, or CLI flag changes. - -### Related Issues - -- #185: reducing expensive RestateDeployment usage-query load (also approached by #186 and #188). diff --git a/release-notes/v3.0.1.md b/release-notes/v3.0.1.md new file mode 100644 index 0000000..3920dde --- /dev/null +++ b/release-notes/v3.0.1.md @@ -0,0 +1,22 @@ +# Restate Operator v3.0.1 Release Notes + +See the [v3.0.0 release notes](https://github.com/restatedev/restate-operator/blob/main/release-notes/v3.0.0.md) for changes prior to this release. + +## Reduced RestateDeployment introspection query load + +The RestateDeployment controller no longer issues a Restate introspection query (`POST /query` over `sys_invocation_status`) on every reconcile, and no longer reconciles on every HorizontalPodAutoscaler status update. + +- **Owned HPAs are watched for spec changes only.** The Kubernetes HPA controller re-writes an HPA's status on a ~15s timer; with per-version autoscaling that is one such write per version (including every draining one), and each previously woke the owning RestateDeployment. The watch now filters to generation (spec) changes, so those heartbeats no longer trigger reconciles. The operator's HPA cache still sees every update. +- **The deployment-usage query runs only when needed.** The query answers whether this version is the one Restate routes new invocations to (registration) and whether older versions have drained (cleanup). In the common case — this version already latest, with no older version to drain — the operator reads "already latest" from the cheaper `GET /services` and skips the invocation-status query entirely. Registration, promotion, rollback, foreign-takeover, and drain paths run the full query exactly as before. + +### Why this matters + +With per-version autoscaling enabled, a deployment carrying several draining versions produced a steady stream of reconciles — roughly one HPA heartbeat every 15 seconds per version — each issuing an invocation-status query. Across many deployments sharing one Restate admin endpoint this multiplied into sustained query load that could overwhelm Restate's query engine, surfacing as `500 Internal Server Error` ("No such scanner") responses from `/query`. + +### Impact + +- No configuration change, and no change to registration, rollback, or drain behaviour. +- Restate admin/query load from the operator drops sharply in the common case: introspection queries are issued during rollouts and drains, not continuously. +- HorizontalPodAutoscaler status changes no longer trigger RestateDeployment reconciles; spec changes and (re)creation still do. + +Related: #185.