Restate 1.7.3
Restate 1.7.3 makes the flow-control capabilities introduced in v1.7 available to existing clusters. It also includes important fixes for memory retention, Prometheus compatibility, SQL correctness, and partition reliability.
🚀 Migrate Existing Clusters to VQueues
Existing clusters can now enable VQueues without provisioning a fresh cluster or first draining all in-flight invocations.
The migration covers inboxed, running, scheduled, suspended, paused, and completed invocations. Each invocation is migrated atomically, and interrupted migrations safely resume when the partition processor restarts.
To enable VQueues:
- Upgrade every Restate server in the cluster to v1.7.3.
- Enable VQueues on every node:
experimental_enable_vqueues = true- Restart the nodes with the updated configuration.
- Monitor the logs for
[VQueues Migration Progress]and[VQueues Migration Completed].
The enabled_features column in the partition_state SQL table includes vqueues after migration completes for a partition.
Migration Considerations
- Enabling VQueues is one-way. Disabling the configuration option does not migrate partitions back to the legacy execution path.
- A partition is temporarily unavailable while its migration runs and does not become an effective leader until migration completes.
- Migration duration depends on the amount of retained invocation data.
- Queued external state mutations cannot be migrated. Restate logs a warning identifying the affected virtual object, and the mutation must be submitted again after migration.
🧠 Memory-Retention Fix
The record cache previously allowed a small cached record to retain the complete backing allocation from a much larger input buffer.
Cached raw records are now detached from those allocations. This makes the configured cache budget more accurately reflect retained memory and reduces the risk of unexpected memory growth and OOM failures under sustained traffic.
No configuration changes are required.
🔄 Improved Ingress Observability
A new restate.invocation_client.requests.total counter records partition-processor RPC attempts by partition_id and outcome.
The status label on restate.ingress.requests.total now distinguishes:
completedrequest_errorinvocation_erroringress_error
Ingress request duration is now also recorded for unsuccessful requests. Review Prometheus queries that previously counted only status="completed".
📊 Metrics Changes
Partition metrics are now aggregated by node rather than exported as high-cardinality per-partition series. This prevents stale series from remaining after partitions move between nodes.
Custom dashboards and alerts may require updates:
- Replace
restate_partition_is_effective_leaderwithrestate_num_active_partition_leaders. - Query
restate_partition_applied_lsn_lagandrestate_partition_snapshot_age_secondsas quantile gauges without thepartitionlabel. - Replace
restate_partition_time_since_last_status_updatewithrestate_partition_time_since_last_status_update_seconds. - Use
restate_partition_num_unknown_applied_lsn_lagto monitor partitions whose lag is unknown.
The bundled Grafana dashboards have already been updated and can be re-imported.
This release also fixes invalid Prometheus exposition that could cause strict parsers, including Vector's prometheus_scrape source, to reject the complete metrics payload:
| Previous metric | Replacement |
|---|---|
restate_partition_shuffle_inflight_count |
restate_partition_shuffle_inflight |
restate_partition_shuffle_message_count |
restate_partition_shuffle_message_total |
The new in-flight metric is a gauge and no longer produces summary _sum, _count, or quantile series.
🛡️ Clearer Reporting for Irrecoverable Partitions
A partition processor whose local store is ahead of the log tail can no longer recover by retrying. Restate now parks the processor and reports it as broken instead of retrying indefinitely.
The condition is visible through:
restatectl partition listrestatectl status- The
partition_state.broken_reasonSQL column - The
restate.partition.blocked_flare{reason="ahead_of_log"}metric
Recovery requires replacing the local store from a safe snapshot.
🛠️ Additional Operator Tooling
This release also adds controls for freezing or explicitly setting partition placement and expands restatectl storage compact with bottommost-level compaction, level recalculation, and configurable timeout options.
For complete migration guidance and operational details, see the full release notes.
Install
Pull the Docker images
docker pull docker.restate.dev/restatedev/restate:1.7.3
docker pull docker.restate.dev/restatedev/restate-cli:1.7.3Install prebuilt binaries via Homebrew
brew install restatedev/tap/restate-server
brew install restatedev/tap/restate
brew install restatedev/tap/restatectlInstall prebuilt binaries into your npm project
npm install @restatedev/restate-server@1.7.3
npm install @restatedev/restate@1.7.3
npm install @restatedev/restatectl@1.7.3Download binary archives
| File | Platform | Checksum |
|---|---|---|
| restate-server-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| restate-server-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| restate-server-aarch64-unknown-linux-musl.tar.xz | ARM64 MUSL Linux | checksum |
| restate-server-x86_64-unknown-linux-musl.tar.xz | x64 MUSL Linux | checksum |
| restate-cli-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| restate-cli-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| restate-cli-aarch64-unknown-linux-musl.tar.xz | ARM64 MUSL Linux | checksum |
| restate-cli-x86_64-unknown-linux-musl.tar.xz | x64 MUSL Linux | checksum |
| restatectl-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| restatectl-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| restatectl-aarch64-unknown-linux-musl.tar.xz | ARM64 MUSL Linux | checksum |
| restatectl-x86_64-unknown-linux-musl.tar.xz | x64 MUSL Linux | checksum |