fix: recover log streaming when a stale non-FIFO blocks the log pipe by armru · Pull Request #11246 · cloudnative-pg/cloudnative-pg · GitHub
Skip to content

fix: recover log streaming when a stale non-FIFO blocks the log pipe - #11246

Merged
mnencia merged 6 commits into
mainfrom
fix/11201-logpipe-selfheal
Jul 29, 2026
Merged

mnencia merged 6 commits into
mainfrom
fix/11201-logpipe-selfheal

Conversation

@armru

@armru armru commented Jul 23, 2026 •

Copy link
Copy Markdown
Member

wal-archive and wal-restore run as separate /controller/manager processes and are told to write their logs to --log-destination <LogPath>/postgres.json, the same path the instance manager's JSON log pipe uses for its FIFO. If one of those commands opens the destination before the pipe has created the FIFO, customDestination creates a plain regular file there (it opens with O_CREATE). The pipe then finds a non-FIFO at the path; until now it silently accepted it, so the reader opened a static file, reached EOF, and no wal-archive/wal-restore output was ever captured. That is the silence reported in #11201.

Now that CreateFifo reports ErrExistsNotFifo for a non-FIFO, the pipe reacts to it: it removes the stale entry and lets the next iteration create the FIFO, so streaming recovers without operator action. The path lives on an emptyDir that outlives container restarts, so without this the only recovery is recreating the pod. The removal is deliberately narrow: it fires only on ErrExistsNotFifo, logs a warning first, and drops just the name at the path (a symlink is removed, never its target). An in-flight writer holding the old inode loses its buffered lines, but the next invocation opens the fresh FIFO; that is convergent and acceptable for a transient log-staging path. The retry loops also gain a short, cancellable backoff so a persistent failure no longer busy-spins.

The machinery dependency is pinned (operator and e2e modules) to machinery's main tip, which carries the ErrExistsNotFifo fix (cloudnative-pg/machinery#301, merged) ahead of a tagged release; re-pin to a tagged release once machinery cuts one.

Closes #11201

@armru
armru requested a review from a team July 23, 2026 13:59
@dosubot dosubot Bot added size:M This PR changes 30-99 lines, ignoring generated files. bug 🐛 Something isn't working release-1.28 release-1.29 release-1.30 labels Jul 23, 2026
@cnpg-bot cnpg-bot added the backport-requested ◀️ This pull request should be backported to all supported releases label Jul 23, 2026
@github-actions

Copy link
Copy Markdown
Contributor

@armru

armru commented Jul 23, 2026

Copy link
Copy Markdown
Member Author

/test

@github-actions

Copy link
Copy Markdown
Contributor

@armru, here's the link to the E2E on CNPG workflow run: https://github.com/cloudnative-pg/cloudnative-pg/actions/runs/30021191352

@cnpg-bot cnpg-bot added the ok to merge 👌 This PR can be merged label Jul 23, 2026

@bujjibabukatta bujjibabukatta left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changes looks good.

@litaocdl
litaocdl force-pushed the fix/11201-logpipe-selfheal branch from e2cf2f1 to c900917 Compare July 24, 2026 07:48
@GabriFedi97
GabriFedi97 force-pushed the fix/11201-logpipe-selfheal branch from 536056e to c900917 Compare July 27, 2026 14:49
@dosubot dosubot Bot added the lgtm This PR has been approved by a maintainer label Jul 27, 2026
@litaocdl
litaocdl force-pushed the fix/11201-logpipe-selfheal branch from c900917 to 4bb020b Compare July 28, 2026 06:15
@dosubot dosubot Bot added size:L This PR changes 100-499 lines, ignoring generated files. and removed size:M This PR changes 30-99 lines, ignoring generated files. labels Jul 28, 2026
@litaocdl
litaocdl force-pushed the fix/11201-logpipe-selfheal branch from 7fd0935 to c15757f Compare July 28, 2026 07:37
@litaocdl

Copy link
Copy Markdown
Collaborator

/test

@github-actions

Copy link
Copy Markdown
Contributor

@litaocdl, here's the link to the E2E on CNPG workflow run: https://github.com/cloudnative-pg/cloudnative-pg/actions/runs/30339135651

@litaocdl
litaocdl force-pushed the fix/11201-logpipe-selfheal branch from 32efe9e to 0edf5f9 Compare July 28, 2026 10:26
@mnencia

mnencia commented Jul 28, 2026

Copy link
Copy Markdown
Member

/test

@mnencia mnencia removed the ok to merge 👌 This PR can be merged label Jul 28, 2026
@github-actions

Copy link
Copy Markdown
Contributor

@cnpg-bot cnpg-bot added the ok to merge 👌 This PR can be merged label Jul 28, 2026
armru and others added 6 commits July 28, 2026 23:27
wal-archive and wal-restore write their JSON logs to the same path
where the instance manager keeps the log pipe's FIFO. If one of them
opens that path with O_CREATE before the pipe recreates the FIFO, it
plants a regular file there, and the pipe's reader ends up reading a
static file instead of streaming: postgres.json output from
wal-archive/wal-restore stops appearing.

machinery's CreateFifo now reports this case as ErrExistsNotFifo
instead of silently accepting the non-FIFO entry. When the log pipe
loops see that error, they remove the stale entry and let the next
iteration create the FIFO in its place, so streaming recovers without
needing the pod to restart. A writer already holding the old file's
descriptor still loses its in-flight lines, but the next invocation
opens the fresh FIFO.

The two loops (CSV and line log pipes) also used to spin immediately
on any error with no delay between attempts, which could busy-loop and
flood the logs. They now wait briefly, respecting context
cancellation, before retrying.

Signed-off-by: Armando Ruocco <armando.ruocco@enterprisedb.com>
The interim pin tracked an earlier machinery commit that still checked the
FIFO path with os.Lstat, which rejects a symlink even when it resolves to a
real FIFO. dev/298 now resolves the path with os.Stat, matching the reader
that opens it, so a symlinked FIFO is a valid stream. Move the pin in both
modules to that commit and align the log-pipe symlink tests: a link to a
FIFO is accepted, while a link to a regular file is still treated as a
non-FIFO and has its name removed.

Signed-off-by: Armando Ruocco <armando.ruocco@enterprisedb.com>
If the restore_command/archive_command executed before the logpipes is ready
A non-FIFO will be created but later will be recreated by the createFIFO method

Signed-off-by: Tao Li <tao.li@enterprisedb.com>
Same for rewind, rewind will call the restore_command and using the log file exactly
with the logpipe, ensure logpipe is ready before rewind is executed.

Signed-off-by: Tao Li <tao.li@enterprisedb.com>
The ArchiveAllReadyWALs already fired before the wait inside the rewind, move teh Wait up to the top of verifyPgDataCoherenceForPrimary before the archive call to benefit both rewind and archive_command.
Executed.Wait() isn't ctx-aware, if pipe goroutine is cancelled before initialized broardcast, the wait on rewind would be block forever.

Signed-off-by: Tao Li <tao.li@enterprisedb.com>
LineLogPipe and InstanceReconciler named their FIFO/initialization
condition getter GetExecutedCondition, while LogPipe (and both types'
underlying fields) call it initialized. Sitting next to each type's
own GetExitedCondition, "Executed" reads as too close to "Exited" for
what is actually the same "initialization done" signal. Rename both
to GetInitializedCondition, matching LogPipe and the field names.

Also correct the two comments introduced earlier in this PR: the wait
before pg_rewind protects against pg_rewind's own restore_command and
against WAL-archive plugins (whose internals we can't audit), not
against archive_command, since the in-process WAL archiving path here
never shells out to it.

Signed-off-by: Marco Nenciarini <marco.nenciarini@enterprisedb.com>
@mnencia
mnencia force-pushed the fix/11201-logpipe-selfheal branch from 0c63afc to b24f4cb Compare July 28, 2026 21:31
@mnencia
mnencia merged commit aa196ca into main Jul 29, 2026
39 checks passed
@mnencia
mnencia deleted the fix/11201-logpipe-selfheal branch July 29, 2026 09:18
cnpg-bot pushed a commit that referenced this pull request Jul 29, 2026
…11246)

`wal-archive` and `wal-restore` run as separate `/controller/manager`
processes and are told to write their logs to `--log-destination
<LogPath>/postgres.json`, the same path the instance manager's JSON log
pipe uses for its FIFO. If one of those commands opens the destination
before the pipe has created the FIFO, `customDestination` creates a
plain regular file there (it opens with `O_CREATE`). The pipe then finds
a non-FIFO at the path; until now it silently accepted it, so the reader
opened a static file, reached EOF, and no `wal-archive`/`wal-restore`
output was ever captured. That is the silence reported in #11201.

Now that `CreateFifo` reports `ErrExistsNotFifo` for a non-FIFO, the
pipe reacts to it: it removes the stale entry and lets the next
iteration create the FIFO, so streaming recovers without operator
action. The path lives on an `emptyDir` that outlives container
restarts, so without this the only recovery is recreating the pod. The
removal is deliberately narrow: it fires only on `ErrExistsNotFifo`,
logs a warning first, and drops just the name at the path (a symlink is
removed, never its target). An in-flight writer holding the old inode
loses its buffered lines, but the next invocation opens the fresh FIFO;
that is convergent and acceptable for a transient log-staging path. The
retry loops also gain a short, cancellable backoff so a persistent
failure no longer busy-spins.

The machinery dependency is pinned (operator and e2e modules) to
machinery's `main` tip, which carries the `ErrExistsNotFifo` fix
(cloudnative-pg/machinery#301, merged) ahead of a tagged release; re-pin
to a tagged release once machinery cuts one.

Closes #11201

Signed-off-by: Armando Ruocco <armando.ruocco@enterprisedb.com>
Signed-off-by: Tao Li <tao.li@enterprisedb.com>
Signed-off-by: Marco Nenciarini <marco.nenciarini@enterprisedb.com>
Co-authored-by: Tao Li <tao.li@enterprisedb.com>
Co-authored-by: Marco Nenciarini <marco.nenciarini@enterprisedb.com>
(cherry picked from commit aa196ca)
cnpg-bot pushed a commit that referenced this pull request Jul 29, 2026
…11246)

`wal-archive` and `wal-restore` run as separate `/controller/manager`
processes and are told to write their logs to `--log-destination
<LogPath>/postgres.json`, the same path the instance manager's JSON log
pipe uses for its FIFO. If one of those commands opens the destination
before the pipe has created the FIFO, `customDestination` creates a
plain regular file there (it opens with `O_CREATE`). The pipe then finds
a non-FIFO at the path; until now it silently accepted it, so the reader
opened a static file, reached EOF, and no `wal-archive`/`wal-restore`
output was ever captured. That is the silence reported in #11201.

Now that `CreateFifo` reports `ErrExistsNotFifo` for a non-FIFO, the
pipe reacts to it: it removes the stale entry and lets the next
iteration create the FIFO, so streaming recovers without operator
action. The path lives on an `emptyDir` that outlives container
restarts, so without this the only recovery is recreating the pod. The
removal is deliberately narrow: it fires only on `ErrExistsNotFifo`,
logs a warning first, and drops just the name at the path (a symlink is
removed, never its target). An in-flight writer holding the old inode
loses its buffered lines, but the next invocation opens the fresh FIFO;
that is convergent and acceptable for a transient log-staging path. The
retry loops also gain a short, cancellable backoff so a persistent
failure no longer busy-spins.

The machinery dependency is pinned (operator and e2e modules) to
machinery's `main` tip, which carries the `ErrExistsNotFifo` fix
(cloudnative-pg/machinery#301, merged) ahead of a tagged release; re-pin
to a tagged release once machinery cuts one.

Closes #11201

Signed-off-by: Armando Ruocco <armando.ruocco@enterprisedb.com>
Signed-off-by: Tao Li <tao.li@enterprisedb.com>
Signed-off-by: Marco Nenciarini <marco.nenciarini@enterprisedb.com>
Co-authored-by: Tao Li <tao.li@enterprisedb.com>
Co-authored-by: Marco Nenciarini <marco.nenciarini@enterprisedb.com>
(cherry picked from commit aa196ca)
mnencia added a commit that referenced this pull request Jul 29, 2026
…11246)

`wal-archive` and `wal-restore` run as separate `/controller/manager`
processes and are told to write their logs to `--log-destination
<LogPath>/postgres.json`, the same path the instance manager's JSON log
pipe uses for its FIFO. If one of those commands opens the destination
before the pipe has created the FIFO, `customDestination` creates a
plain regular file there (it opens with `O_CREATE`). The pipe then finds
a non-FIFO at the path; until now it silently accepted it, so the reader
opened a static file, reached EOF, and no `wal-archive`/`wal-restore`
output was ever captured. That is the silence reported in #11201.

Now that `CreateFifo` reports `ErrExistsNotFifo` for a non-FIFO, the
pipe reacts to it: it removes the stale entry and lets the next
iteration create the FIFO, so streaming recovers without operator
action. The path lives on an `emptyDir` that outlives container
restarts, so without this the only recovery is recreating the pod. The
removal is deliberately narrow: it fires only on `ErrExistsNotFifo`,
logs a warning first, and drops just the name at the path (a symlink is
removed, never its target). An in-flight writer holding the old inode
loses its buffered lines, but the next invocation opens the fresh FIFO;
that is convergent and acceptable for a transient log-staging path. The
retry loops also gain a short, cancellable backoff so a persistent
failure no longer busy-spins.

The machinery dependency is pinned (operator and e2e modules) to
machinery's `main` tip, which carries the `ErrExistsNotFifo` fix
(cloudnative-pg/machinery#301, merged) ahead of a tagged release; re-pin
to a tagged release once machinery cuts one.

Closes #11201

Signed-off-by: Armando Ruocco <armando.ruocco@enterprisedb.com>
Signed-off-by: Tao Li <tao.li@enterprisedb.com>
Signed-off-by: Marco Nenciarini <marco.nenciarini@enterprisedb.com>
Co-authored-by: Tao Li <tao.li@enterprisedb.com>
Co-authored-by: Marco Nenciarini <marco.nenciarini@enterprisedb.com>
(cherry picked from commit aa196ca)
renovate Bot added a commit to sdwilsh/ansible-playbooks that referenced this pull request Sep 24, 2026
##### [\`v1.30.1\`](https://github.com/cloudnative-pg/cloudnative-pg/releases/tag/v1.30.1)

**Release date:** Sep 23, 2026

##### Enhancements

- Added `restoreAdditionalCommandArgs` to `.barmanObjectStore.data` for in-tree Barman Cloud recoveries, so custom flags are forwarded to `barman-cloud-restore` during recovery. ([#11278](cloudnative-pg/cloudnative-pg#11278)) <!-- 1.29 1.28 -->

- Plugin authors no longer need to re-derive whether an empty WAL archive should be treated as an error: the operator now computes the `check_empty_wal_archive` decision once and passes it to CNPG-I plugins on both WAL archiving and restore hooks. ([#11216](cloudnative-pg/cloudnative-pg#11216)) <!-- 1.29 1.28 -->

- Allowed setting the `ssl_ecdh_curve` PostgreSQL parameter in `.spec.postgresql.parameters`. It was previously rejected by the validating webhook even though the operator does not manage it. Contributed by [@Jamstah](https://github.com/Jamstah). ([#11308](cloudnative-pg/cloudnative-pg#11308)) <!-- 1.29 1.28 -->

- Added support for setting `auth_user` in `spec.pgbouncer.parameters` to override the user PgBouncer uses for its `auth_query` connection, instead of always deriving it from the `authQuerySecret`. Useful with a custom `authQuerySecret` where the role to authenticate as differs from the one implied by the Secret. Contributed by [@jonasbadstuebner](https://github.com/jonasbadstuebner). ([#10899](cloudnative-pg/cloudnative-pg#10899)) <!-- 1.29 1.28 -->

- Fixed PgBouncer metrics silently reporting zero when PgBouncer adds or reorders columns: `SHOW STATS` and `SHOW POOLS` results are now matched by column name instead of by position. Contributed by [@AdzerKI](https://github.com/AdzerKI) (`SHOW STATS`). ([#11366](cloudnative-pg/cloudnative-pg#11366), [#11464](cloudnative-pg/cloudnative-pg#11464)) <!-- 1.29 1.28 -->

- `cnpg` plugin:

  - Added a `--dry-run` option to the `backup` command that prints the `Backup` resource that would be created, without creating it. ([#11233](cloudnative-pg/cloudnative-pg#11233)) <!-- 1.29 1.28 -->

##### Security and Supply Chain

- Fixed a webhook validation bypass where an absolute extension path with an embedded `..` traversal (e.g. `/a/../../../../etc`) was accepted because only the raw path was checked; such paths still escaped the extension's mount point once resolved at runtime. Affected entries are now resolved and rejected/skipped consistently across admission, the major-upgrade job, and already-persisted Cluster specs. Contributed by [@Anand-240](https://github.com/Anand-240). ([#11210](cloudnative-pg/cloudnative-pg#11210)) <!-- 1.29 1.28 -->

- Updated `google.golang.org/grpc` to v1.83.1, fixing [CVE-2026-84304](https://nvd.nist.gov/vuln/detail/CVE-2026-84304) / GHSA-vp52-pcj8-j9qc (gRPC-Go heap memory exhaustion via HTTP/2 DATA frame fragmentation). ([#11394](cloudnative-pg/cloudnative-pg#11394)) <!-- 1.29 1.28 -->

##### Changes

- Updated the default PostgreSQL operand image to 18.6-system-trixie. ([#11257](cloudnative-pg/cloudnative-pg#11257)) <!-- 1.29 1.28 -->

- Moved the operator's own base image from Debian 12 (bookworm) to Debian 13 (trixie), now that Debian 12 has moved to LTS-only maintenance. ([#11193](cloudnative-pg/cloudnative-pg#11193)) <!-- 1.29 1.28 -->

##### Fixes

- Demoted an unreachable old primary immediately during failover, instead of waiting on checkpoint and fast-shutdown attempts that could never complete. Previously, an old primary whose PostgreSQL had become unresponsive was never shut down, so it could never rejoin the cluster as a replica of the new primary. The shutdown is now requested without blocking the reconciler, though demotion can still take up to a minute or more if PostgreSQL keeps ignoring shutdown signals. ([#11347](cloudnative-pg/cloudnative-pg#11347)) <!-- 1.29 1.28 -->

- Fixed failover and Pod recreation getting stuck while any instance in the cluster was fenced. A fenced instance kept reporting itself as healthy on its status endpoint even though its Pod was permanently not Ready, which blocked the readiness guard, the primary-election logic, and the Pod-reattachment gate from reacting to an unrelated failure elsewhere in the cluster, leaving it stalled until someone manually removed the fencing. All three now recognize and skip fenced instances. ([#11274](cloudnative-pg/cloudnative-pg#11274)) <!-- 1.29 1.28 -->

- Fixed a failover that could stall forever or get silently reverted. While a failover was pending, the reconciler could skip checking whether it was ready to complete, or mistake the pending state for a missing Pod and reset the target primary back to the unhealthy one. It now keeps progressing a pending failover and completes it once the WAL receivers are down, rechecking quorum safety right before promoting in case it changed while waiting. ([#11336](cloudnative-pg/cloudnative-pg#11336)) <!-- 1.29 1.28 -->

- Fixed the designated-primary sort in `PostgresqlStatusList` so a tie on LSN no longer sorts it out of order. If the designated primary's Pod later disappeared from the status list, this could have led the operator to promote the wrong standby. ([#11494](cloudnative-pg/cloudnative-pg#11494)) <!-- 1.29 1.28 -->

- Gated PostgreSQL startup on the instance manager actually holding the primary `Lease`, closing a window where a restarting or rescheduled primary could start accepting writes before acquiring the lease. Lease acquisition now happens during instance initialization, strictly before PostgreSQL is allowed to start, instead of only later in the reconciliation loop once the instance was already reported ready. ([#11356](cloudnative-pg/cloudnative-pg#11356))

- Bounded the primary lease take-over `Get` call to the lease's `RenewDeadline`, so a call against an unreachable API server now fails fast and retries instead of blocking indefinitely. Left unbounded, the same stalled call could also delay a primary's own lease renewal after a transient API server blip, risking an unwanted takeover by another instance once the lease appeared to expire. ([#11350](cloudnative-pg/cloudnative-pg#11350))

- Stopped abandoning a fast shutdown after 60 seconds. The request carried no explicit timeout, so `pg_ctl` fell back to its own implicit 60-second limit, and the instance manager, being PID 1 in the container, took PostgreSQL down mid-shutdown regardless of a larger configured `stopDelay`. The fast phase now waits for the full `stopDelay` instead. ([#11263](cloudnative-pg/cloudnative-pg#11263)) <!-- 1.29 1.28 -->

- Waited for certificate status before refreshing secrets during bootstrap. ([#11450](cloudnative-pg/cloudnative-pg#11450)) <!-- 1.29 1.28 -->

- Fixed in-tree Barman Cloud recovery ignoring `wal.maxParallel` and `wal.restoreAdditionalCommandArgs`, fetching WAL one segment at a time instead of using the configured parallelism. ([#11105](cloudnative-pg/cloudnative-pg#11105)) <!-- 1.29 1.28 -->

- Honored the `unrecoverable` annotation on pending and terminating instances. ([#11241](cloudnative-pg/cloudnative-pg#11241)) <!-- 1.29 1.28 -->

- Honored `Backup.spec.online` when finalizing VolumeSnapshot-based backups, so a cold backup is no longer reported as online in status. ([#11276](cloudnative-pg/cloudnative-pg#11276)) <!-- 1.29 1.28 -->

- Set `--no-data-checksums` explicitly when `.spec.postgresql.dataChecksums` is `false` on PostgreSQL 18+, which now enables checksums by default in `initdb`. Contributed by [@evan314159](https://github.com/evan314159). ([#11488](cloudnative-pg/cloudnative-pg#11488)) <!-- 1.29 1.28 -->

- Stopped discarding `.spec.inheritedMetadata` labels on PVC reconciliation; they were applied before, and then overwritten by, the operator's own labels. Contributed by [@GellertBabel](https://github.com/GellertBabel). ([#11499](cloudnative-pg/cloudnative-pg#11499)) <!-- 1.29 1.28 -->

- Stopped `Pooler` and `DatabaseRole` from recreating their owned resources after being marked for deletion, which could block an external finalizer (e.g. ArgoCD foreground deletion) waiting for those resources to disappear. Contributed by [@mjlshen](https://github.com/mjlshen). ([#11359](cloudnative-pg/cloudnative-pg#11359)) <!-- 1.29 1.28 -->

- Handled a `NULL` `stats_reset` value in the `pg_stat_wal` metric, which could occasionally break Prometheus scraping on PostgreSQL 18 clusters. Contributed by [@HoniSanders](https://github.com/HoniSanders). ([#11207](cloudnative-pg/cloudnative-pg#11207)) <!-- 1.29 1.28 -->

- Recovered log streaming when a stale non-FIFO file blocked the log pipe. ([#11246](cloudnative-pg/cloudnative-pg#11246)) <!-- 1.29 1.28 -->

- Stopped sampling logs of the Pods' processes, so no log lines are silently dropped. ([#11131](cloudnative-pg/cloudnative-pg#11131)) <!-- 1.29 1.28 -->

- Stopped caching Helm release Secrets in the operator, which could spike memory usage and crashloop the operator on clusters with large Helm releases installed alongside it. ([#11211](cloudnative-pg/cloudnative-pg#11211)) <!-- 1.29 1.28 -->

- Re-ran owned-resource finalizer cleanup after an operator restart, so a namespace deleted while the operator was down doesn't hang in `Terminating` forever. ([#11215](cloudnative-pg/cloudnative-pg#11215)) <!-- 1.29 1.28 -->

- Fixed rejoining replicas taking a long time to complete `pg_rewind` when WAL prefetching (`wal.maxParallel > 1`) was enabled. ([#11204](cloudnative-pg/cloudnative-pg#11204)) <!-- 1.29 1.28 -->

- Treated a PostgreSQL instance rejecting connections as started up in probes. ([#11152](cloudnative-pg/cloudnative-pg#11152)) <!-- 1.29 1.28 -->

- Stopped issuing a redundant PATCH on every reconciliation when a cluster's `pvcTemplate` set `volumeAttributesClass`. Contributed by [@andrew-farries](https://github.com/andrew-farries). ([#11196](cloudnative-pg/cloudnative-pg#11196)) <!-- 1.29 1.28 -->

- Stopped halting replication slot reconciliation at the first failing slot. ([#11119](cloudnative-pg/cloudnative-pg#11119)) <!-- 1.29 1.28 -->

- During rollouts, compared the running configuration hash, rather than the on-disk one, avoiding unnecessary switchovers. ([#11130](cloudnative-pg/cloudnative-pg#11130)) <!-- 1.29 1.28 -->

- Retried `VolumeSnapshot` errors until the deadline, instead of giving up early. ([#11132](cloudnative-pg/cloudnative-pg#11132)) <!-- 1.29 1.28 -->

- Symlinked `pg_wal` to the WAL volume during plugin-based recovery, instead of replaying WAL onto the data volume, which could exhaust it on a large point-in-time recovery. ([#11127](cloudnative-pg/cloudnative-pg#11127)) <!-- 1.29 1.28 -->

- Corrected grammar in `PhaseUpgradeDelayed` status messages. Contributed by [@Utkarsh-sharma47](https://github.com/Utkarsh-sharma47). ([#11065](cloudnative-pg/cloudnative-pg#11065)) <!-- 1.29 1.28 -->

- CloudNativePG Interface (CNPG-I):

  - Reported the Postgres capabilities of a plugin correctly. ([#11447](cloudnative-pg/cloudnative-pg#11447)) <!-- 1.29 1.28 -->
  - Prevented the plugin status field from flapping on Cluster reconciliation. Contributed by [@sharifmshaker](https://github.com/sharifmshaker). ([#11386](cloudnative-pg/cloudnative-pg#11386)) <!-- 1.29 1.28 -->
  - Replaced a finalizer with in-memory cleanup on Service deletion. This avoids namespaces hanging in `Terminating` state when the operator and its plugins run in the same namespace. Contributed by [@maxlengdell](https://github.com/maxlengdell). ([#10940](cloudnative-pg/cloudnative-pg#10940)) <!-- 1.29 -->

- `cnpg` plugin:

  - Used UTC time zone for the default backup name. ([#11329](cloudnative-pg/cloudnative-pg#11329)) <!-- 1.29 1.28 -->
  - Deleted PVCs before Pods in `cnpg destroy`, avoiding a race that could leave dangling PVCs needing a second invocation to clean up. Contributed by [@daanvinken](https://github.com/daanvinken). ([#10847](cloudnative-pg/cloudnative-pg#10847)) <!-- 1.29 1.28 -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport-requested ◀️ This pull request should be backported to all supported releases bug 🐛 Something isn't working lgtm This PR has been approved by a maintainer ok to merge 👌 This PR can be merged release-1.28 release-1.30 size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: wal-archive/wal-restore log destination can be silently and permanently downgraded from a FIFO to a dead regular file

6 participants