Skip to content

Commit 90377e9

Browse files
committed
chore(release): 0.10.28 / chart 0.3.38 — multi-tenant secret bootstrap fix
Critical fix: 0.10.27 multi-tenant bootstrap was failing for any freshly- registered user attempting to ATTACH a DuckLake catalog over PGWire. ATTACH was killed during the eager-attach phase with "Secret with name <catalog>_adm_postgres not found" because the bootstrap fetched the single-tenant variants and the multi-tenant ATTACH path couldn't resolve them. Verified end-to-end with matview_stress and tantivy_stress. Also picks up the previously-uncommitted chart template files (NOTES.txt, gatewayclass.yaml) that match what's already shipping in the internal chart.
1 parent 8e2fc60 commit 90377e9

4 files changed

Lines changed: 65 additions & 2 deletions

File tree

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,17 @@ All notable changes to BoilStream will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [0.10.28] - 2026-04-30
9+
10+
### Fixes
11+
12+
- **⚠️ Critical: multi-tenant secret bootstrap was broken in 0.10.27.** Every freshly-registered user that connected via PGWire and tried to `ATTACH 'ducklake:<catalog>'` got `FATAL: Database '<catalog>' is not available: Secret with name "<catalog>_adm_postgres" not found` and the connection was killed during the eager-attach phase. Bootstrap was reading a stale path for the per-connection tenant identifier, so the `/secrets` fetch ran in single-tenant mode and cached the wrong (unprefixed) variants of each catalog's postgres-creds reference; the subsequent multi-tenant ATTACH then couldn't resolve them. Bootstrap now reads the tenant identifier through the supported settings path and passes its just-established session state directly to the secret fetch, so the multi-tenant secrets are cached before ATTACH runs. Reproduces locally in seconds with `matview_stress --smoke` against a freshly-registered user; verified with the full e2e suite (3728 tests, 0 fail) plus DuckDB-isolated serial suite (15/15) plus matview/tantivy stress smokes.
13+
14+
### Notes
15+
16+
- Chart version **0.3.38** tracks appVersion `0.10.28`.
17+
- ARM64 (`aarch64-linux-0.10.28`) and x86_64 (`x64-linux-0.10.28`) Docker images built on AWS EC2 (Graviton 2 / Intel Xeon).
18+
819
## [0.10.27] - 2026-04-29
920

1021
### Fixes

charts/boilstream/Chart.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ description: |
66
support. Each pod participates in S3-based leader election and serves
77
per-user catalogs; failed pods are recovered from S3 backups.
88
type: application
9-
version: 0.3.37
10-
appVersion: "0.10.27"
9+
version: 0.3.38
10+
appVersion: "0.10.28"
1111
kubeVersion: ">=1.27.0"
1212
keywords:
1313
- streaming
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{{- if .Values.gateway.enabled }}
2+
{{- $hasClass := lookup "gateway.networking.k8s.io/v1" "GatewayClass" "" .Values.gateway.className -}}
3+
{{- if and (not $hasClass) (not .Values.gateway.createClass) }}
4+
5+
╭──────────────────────────────────────────────────────────────────────╮
6+
│ WARNING — GatewayClass {{ printf "%q" .Values.gateway.className }} not found in this cluster
7+
8+
│ The chart's Gateway + TLSRoutes will sit Pending forever until you
9+
│ create it. Pick one:
10+
11+
│ 1) Re-run with the chart's built-in flag:
12+
│ helm upgrade {{ .Release.Name }} ./charts/boilstream \
13+
│ --set gateway.createClass=true \
14+
│ --reuse-values
15+
16+
│ 2) Apply the GatewayClass directly (one-shot):
17+
│ kubectl apply -f - <<'YAML'
18+
│ apiVersion: gateway.networking.k8s.io/v1
19+
│ kind: GatewayClass
20+
│ metadata: {{ printf "{ name: %s }" .Values.gateway.className }}
21+
│ spec: { controllerName: gateway.envoyproxy.io/gatewayclass-controller }
22+
│ YAML
23+
24+
│ 3) Install Envoy Gateway's own helm chart, which creates one too:
25+
│ helm install eg oci://docker.io/envoyproxy/gateway-helm \
26+
│ --version v1.2.1 -n envoy-gateway-system --create-namespace
27+
╰──────────────────────────────────────────────────────────────────────╯
28+
{{- end }}
29+
{{- end }}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{{- /*
2+
GatewayClass — referenced by the chart's Gateway via spec.gatewayClassName.
3+
4+
Rendered only when both gateway.enabled AND gateway.createClass are true.
5+
Cluster-scoped resource; safe to ignore (no-op) when the Envoy Gateway
6+
helm install already created it. Set createClass: true on first install
7+
to a fresh cluster — the alternative is the standalone `kubectl apply`
8+
documented in the chart README's prerequisites section.
9+
10+
If the GatewayClass is missing the Envoy Gateway controller logs
11+
"no accepted gatewayclass" forever and the chart's Gateway never gets
12+
programmed (no LB, no listeners, public traffic 400s at the edge).
13+
*/}}
14+
{{- if and .Values.gateway.enabled .Values.gateway.createClass }}
15+
apiVersion: gateway.networking.k8s.io/v1
16+
kind: GatewayClass
17+
metadata:
18+
name: {{ .Values.gateway.className }}
19+
labels:
20+
{{- include "boilstream.labels" . | nindent 4 }}
21+
spec:
22+
controllerName: {{ .Values.gateway.classControllerName | default "gateway.envoyproxy.io/gatewayclass-controller" }}
23+
{{- end }}

0 commit comments

Comments
 (0)