Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package pgbackrest for openSUSE:Factory checked in at 2026-09-28 10:47:25 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/pgbackrest (Old) and /work/SRC/openSUSE:Factory/.pgbackrest.new.383539 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "pgbackrest" Mon Sep 28 10:47:25 2026 rev:26 rq:1380950 version:2.59.2 Changes: -------- --- /work/SRC/openSUSE:Factory/pgbackrest/pgbackrest.changes 2026-08-25 13:21:41.469348649 +0200 +++ /work/SRC/openSUSE:Factory/.pgbackrest.new.383539/pgbackrest.changes 2026-09-28 10:48:08.010177882 +0200 @@ -1,0 +2,23 @@ +Sun Sep 27 11:51:08 UTC 2026 - Marcus Rueckert <[email protected]> + +- update to 2.59.2 + - Bug Fixes: + - Fix empty block map when file is truncated to zero during + backup. (Reviewed by Douglas J Hunley. Reported by + JPCOSTA78.) + - Disable read retry when filters are passed to the driver. + (Reviewed by Douglas J Hunley. Reported by megamaced.) + - Fix pagination of S3 version listing. (Reviewed by Douglas J + Hunley, guruguruguru. Reported by guruguruguru.) + - Set the Azure version header for SAS authentication. + (Reviewed by Douglas J Hunley. Reported by Florian + Helmberger.) + - Fix async archive-push stalling on a zero-size backup history + file. (Fixed by Andrew Kroh. Reviewed by David Steele, + Douglas J Hunley.) + - Fix annotate command on a remote encrypted repository. (Fixed + by Douglas J Hunley. Reviewed by David Steele.) + - Features: + - PostgreSQL 19beta4 support. + +------------------------------------------------------------------- Old: ---- pgbackrest-2.59.1.tar.gz New: ---- pgbackrest-2.59.2.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ pgbackrest.spec ++++++ --- /var/tmp/diff_new_pack.BlQQHN/_old 2026-09-28 10:48:09.261230299 +0200 +++ /var/tmp/diff_new_pack.BlQQHN/_new 2026-09-28 10:48:09.264230424 +0200 @@ -19,7 +19,7 @@ %define services pgbackrest.target [email protected] [email protected] [email protected] pgbackrest.service [email protected] [email protected] [email protected] Name: pgbackrest -Version: 2.59.1 +Version: 2.59.2 Release: 0 Summary: Reliable PostgreSQL Backup & Restore License: MIT ++++++ pgbackrest-2.59.1.tar.gz -> pgbackrest-2.59.2.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pgbackrest-2.59.1/dist new/pgbackrest-2.59.2/dist --- old/pgbackrest-2.59.1/dist 2026-08-17 11:10:21.775967600 +0200 +++ new/pgbackrest-2.59.2/dist 2026-09-27 13:17:13.529786000 +0200 @@ -1 +1 @@ -2.59.1 +2.59.2 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pgbackrest-2.59.1/doc/html/command.html new/pgbackrest-2.59.2/doc/html/command.html --- old/pgbackrest-2.59.1/doc/html/command.html 2026-08-17 11:10:21.774024000 +0200 +++ new/pgbackrest-2.59.2/doc/html/command.html 2026-09-27 13:17:13.527605000 +0200 @@ -15667,5 +15667,5 @@ <pre class="code-block">default: text example: --output=num</pre> </div></div></div></div></div></div></div><div class="page-footer"> -Copyright © 2015-2026, The PostgreSQL Global Development Group, <a href="https://github.com/pgbackrest/pgbackrest/blob/main/LICENSE">MIT License</a>. Updated August 17, 2026 +Copyright © 2015-2026, The PostgreSQL Global Development Group, <a href="https://github.com/pgbackrest/pgbackrest/blob/main/LICENSE">MIT License</a>. Updated September 27, 2026 </div></body></html> \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pgbackrest-2.59.1/doc/html/configuration.html new/pgbackrest-2.59.2/doc/html/configuration.html --- old/pgbackrest-2.59.1/doc/html/configuration.html 2026-08-17 11:10:21.774469400 +0200 +++ new/pgbackrest-2.59.2/doc/html/configuration.html 2026-09-27 13:17:13.527993700 +0200 @@ -2191,5 +2191,5 @@ </div> <pre class="code-block">example: pg1-user=backupuser</pre> </div></div></div></div></div><div class="page-footer"> -Copyright © 2015-2026, The PostgreSQL Global Development Group, <a href="https://github.com/pgbackrest/pgbackrest/blob/main/LICENSE">MIT License</a>. Updated August 17, 2026 +Copyright © 2015-2026, The PostgreSQL Global Development Group, <a href="https://github.com/pgbackrest/pgbackrest/blob/main/LICENSE">MIT License</a>. Updated September 27, 2026 </div></body></html> \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pgbackrest-2.59.1/doc/html/faq.html new/pgbackrest-2.59.2/doc/html/faq.html --- old/pgbackrest-2.59.1/doc/html/faq.html 2026-08-17 11:10:21.774563800 +0200 +++ new/pgbackrest-2.59.2/doc/html/faq.html 2026-09-27 13:17:13.528116000 +0200 @@ -153,5 +153,5 @@ </div><div class="section-body-text"> Please note that recovering this backup will not result in a timeline switch, which means that this cluster should not push WAL to the original repository that it was exported from. If the new cluster is in a network-isolated environment this should not be a problem. </div></div></div></div><div class="page-footer"> -Copyright © 2015-2026, The PostgreSQL Global Development Group, <a href="https://github.com/pgbackrest/pgbackrest/blob/main/LICENSE">MIT License</a>. Updated August 17, 2026 +Copyright © 2015-2026, The PostgreSQL Global Development Group, <a href="https://github.com/pgbackrest/pgbackrest/blob/main/LICENSE">MIT License</a>. Updated September 27, 2026 </div></body></html> \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pgbackrest-2.59.1/doc/html/index.html new/pgbackrest-2.59.2/doc/html/index.html --- old/pgbackrest-2.59.1/doc/html/index.html 2026-08-17 11:10:21.774604000 +0200 +++ new/pgbackrest-2.59.2/doc/html/index.html 2026-09-27 13:17:13.528155000 +0200 @@ -27,7 +27,7 @@ </div></div><div class="section-body"><div class="section-body-text"> <span class="backrest">pgBackRest</span> is a reliable backup and restore solution for <span class="postgres">PostgreSQL</span> that seamlessly scales up to the largest databases and workloads. </div><div class="section-body-text"> -<span class="backrest">pgBackRest</span> <a href="https://github.com/pgbackrest/pgbackrest/releases/tag/release/2.59.1">v2.59.1</a> is the current stable release. Release notes are on the <a href="release.html">Releases</a> page. +<span class="backrest">pgBackRest</span> <a href="https://github.com/pgbackrest/pgbackrest/releases/tag/release/2.59.2">v2.59.2</a> is the current stable release. Release notes are on the <a href="release.html">Releases</a> page. </div><div class="section-body-text"> Please give us a star on <a href="https://github.com/pgbackrest/pgbackrest">GitHub</a> if you like <span class="backrest">pgBackRest</span>! </div></div></div><div class="section1"><a id="features"></a><div class="section1-header"><div class="section1-title"> @@ -137,5 +137,5 @@ </div><div class="section-body-text"> Creating a robust disaster recovery policy with proper replication and backup strategies can be a very complex and daunting task. You may find that you need help during the architecture phase and ongoing support to ensure that your enterprise continues running smoothly. </div></div></div></div><div class="page-footer"> -Copyright © 2015-2026, The PostgreSQL Global Development Group, <a href="https://github.com/pgbackrest/pgbackrest/blob/main/LICENSE">MIT License</a>. Updated August 17, 2026 +Copyright © 2015-2026, The PostgreSQL Global Development Group, <a href="https://github.com/pgbackrest/pgbackrest/blob/main/LICENSE">MIT License</a>. Updated September 27, 2026 </div></body></html> \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pgbackrest-2.59.1/doc/html/release.html new/pgbackrest-2.59.2/doc/html/release.html --- old/pgbackrest-2.59.1/doc/html/release.html 2026-08-17 11:10:21.774642700 +0200 +++ new/pgbackrest-2.59.2/doc/html/release.html 2026-09-27 13:17:13.528193000 +0200 @@ -26,8 +26,8 @@ Introduction </a></div></div><div class="section1-toc"><div class="section1-toc-title"><a href="#current"> Current Stable Release -</a></div><div class="section2-toc"><div class="section2-toc-title"><a href="#2.59.1"> -v2.59.1 Release Notes +</a></div><div class="section2-toc"><div class="section2-toc-title"><a href="#2.59.2"> +v2.59.2 Release Notes </a></div></div></div><div class="section1-toc"><div class="section1-toc-title"><a href="#supported"> Stable Releases </a></div></div><div class="section1-toc"><div class="section1-toc-title"><a href="#unsupported"> @@ -42,6 +42,32 @@ The notes for a release may also contain <q>Additional Notes</q> but changes in this section are only to documentation or the test suite and have no direct impact on the <span class="backrest">pgBackRest</span> codebase. </div><div class="section-body"></div></div><div class="section1"><a id="current"></a><div class="section1-header"><div class="section1-title"> Current Stable Release +</div></div><div class="section-body"><div class="section2"><a id="2.59.2"></a><div class="section2-header"><div class="section2-title"> +v2.59.2 Release Notes +</div></div><div class="section-body"><div class="section2-subtitle"> +PostgreSQL 19beta4 Support +</div><div class="section2-subsubtitle"> +Released September 27, 2026 +</div><div class="section-body-text"> +<b> Bug Fixes:</b> +</div><ul class="list-unordered"><li class="list-unordered"> +Fix empty block map when file is truncated to zero during backup. (<i>Reviewed by Douglas J Hunley. Reported by JPCOSTA78.</i>) +</li><li class="list-unordered"> +Disable read retry when filters are passed to the driver. (<i>Reviewed by Douglas J Hunley. Reported by megamaced.</i>) +</li><li class="list-unordered"> +Fix pagination of <span class="host">S3</span> version listing. (<i>Reviewed by Douglas J Hunley, guruguruguru. Reported by guruguruguru.</i>) +</li><li class="list-unordered"> +Set the <span class="host">Azure</span> version header for <span class="id">SAS</span> authentication. (<i>Reviewed by Douglas J Hunley. Reported by Florian Helmberger.</i>) +</li><li class="list-unordered"> +Fix async <span class="cmd">archive-push</span> stalling on a zero-size backup history file. (<i>Fixed by Andrew Kroh. Reviewed by David Steele, Douglas J Hunley.</i>) +</li><li class="list-unordered"> +Fix <span class="cmd">annotate</span> command on a remote encrypted repository. (<i>Fixed by Douglas J Hunley. Reviewed by David Steele.</i>) +</li></ul><div class="section-body-text"> +<b> Features:</b> +</div><ul class="list-unordered"><li class="list-unordered"> +<span class="host">PostgreSQL 19beta4</span> support. +</li></ul></div></div></div></div><div class="section1"><a id="supported"></a><div class="section1-header"><div class="section1-title"> +Stable Releases </div></div><div class="section-body"><div class="section2"><a id="2.59.1"></a><div class="section2-header"><div class="section2-title"> v2.59.1 Release Notes </div></div><div class="section-body"><div class="section2-subtitle"> @@ -66,9 +92,7 @@ Document exception for dots in <span class="host">S3</span> bucket names when <span class="br-setting">repo-s3-uri-style=path</span>. </li><li class="list-unordered"> Remove explicit <span class="pg-setting">hot_standby</span> configuration from user guide. -</li></ul></div></div></div></div><div class="section1"><a id="supported"></a><div class="section1-header"><div class="section1-title"> -Stable Releases -</div></div><div class="section-body"><div class="section2"><a id="2.59.0"></a><div class="section2-header"><div class="section2-title"> +</li></ul></div></div><div class="section2"><a id="2.59.0"></a><div class="section2-header"><div class="section2-title"> v2.59.0 Release Notes </div></div><div class="section-body"><div class="section2-subtitle"> PostgreSQL 19beta2 Support @@ -3429,5 +3453,5 @@ </div><ul class="list-unordered"><li class="list-unordered"> Absolutely no documentation (outside the code). Well, excepting these release notes. </li></ul></div></div></div></div></div><div class="page-footer"> -Copyright © 2015-2026, The PostgreSQL Global Development Group, <a href="https://github.com/pgbackrest/pgbackrest/blob/main/LICENSE">MIT License</a>. Updated August 17, 2026 +Copyright © 2015-2026, The PostgreSQL Global Development Group, <a href="https://github.com/pgbackrest/pgbackrest/blob/main/LICENSE">MIT License</a>. Updated September 27, 2026 </div></body></html> \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pgbackrest-2.59.1/doc/html/user-guide-index.html new/pgbackrest-2.59.2/doc/html/user-guide-index.html --- old/pgbackrest-2.59.1/doc/html/user-guide-index.html 2026-08-17 11:10:21.774852800 +0200 +++ new/pgbackrest-2.59.2/doc/html/user-guide-index.html 2026-09-27 13:17:13.528400000 +0200 @@ -29,5 +29,5 @@ </li><li class="list-unordered"> <a href="user-guide-rhel.html">RHEL</a> </li></ul></div></div></div><div class="page-footer"> -Copyright © 2015-2026, The PostgreSQL Global Development Group, <a href="https://github.com/pgbackrest/pgbackrest/blob/main/LICENSE">MIT License</a>. Updated August 17, 2026 +Copyright © 2015-2026, The PostgreSQL Global Development Group, <a href="https://github.com/pgbackrest/pgbackrest/blob/main/LICENSE">MIT License</a>. Updated September 27, 2026 </div></body></html> \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pgbackrest-2.59.1/doc/html/user-guide-rhel.html new/pgbackrest-2.59.2/doc/html/user-guide-rhel.html --- old/pgbackrest-2.59.1/doc/html/user-guide-rhel.html 2026-08-17 11:10:21.774757100 +0200 +++ new/pgbackrest-2.59.2/doc/html/user-guide-rhel.html 2026-09-27 13:17:13.528307700 +0200 @@ -223,11 +223,11 @@ </div><div class="section-body-text"> When building from source it is best to use a build host rather than building on production. Many of the tools required for the build should generally not be installed in production. <span class="backrest">pgBackRest</span> consists of a single executable so it is easy to copy to a new host once it is built. </div><div class="execute"><div class="execute-title"> -<span class="host">build</span> <b>⇒</b> Download version <span class="id">2.59.1</span> of <span class="backrest">pgBackRest</span> to <span class="path">/build</span> path +<span class="host">build</span> <b>⇒</b> Download version <span class="id">2.59.2</span> of <span class="backrest">pgBackRest</span> to <span class="path">/build</span> path </div><div class="execute-body"> <pre class="execute-body-cmd">mkdir -p /build</pre> <pre class="execute-body-cmd">curl -fsSL \ - https://github.com/pgbackrest/pgbackrest/releases/download/release%2F2.59.1/pgbackrest-2.59.1.tar.gz | \ + https://github.com/pgbackrest/pgbackrest/releases/download/release%2F2.59.2/pgbackrest-2.59.2.tar.gz | \ tar zx -C /build</pre> </div></div><div class="execute"><div class="execute-title"> <span class="host">build</span> <b>⇒</b> Install build dependencies @@ -237,7 +237,7 @@ </div></div><div class="execute"><div class="execute-title"> <span class="host">build</span> <b>⇒</b> Configure and compile <span class="backrest">pgBackRest</span> </div><div class="execute-body"> -<pre class="execute-body-cmd">meson setup /build/pgbackrest /build/pgbackrest-2.59.1</pre> +<pre class="execute-body-cmd">meson setup /build/pgbackrest /build/pgbackrest-2.59.2</pre> <pre class="execute-body-cmd">ninja -C /build/pgbackrest</pre> </div></div><div class="execute"><div class="execute-title"> <span class="host">build</span> <b>⇒</b> Optionally run smoke tests to verify <span class="backrest">pgBackRest</span> was built correctly @@ -1982,5 +1982,5 @@ </div><div class="config-body"><div class="config-body-output"> Config suppressed for testing </div></div></div></div></div></div><div class="page-footer"> -Copyright © 2015-2026, The PostgreSQL Global Development Group, <a href="https://github.com/pgbackrest/pgbackrest/blob/main/LICENSE">MIT License</a>. Updated August 17, 2026 +Copyright © 2015-2026, The PostgreSQL Global Development Group, <a href="https://github.com/pgbackrest/pgbackrest/blob/main/LICENSE">MIT License</a>. Updated September 27, 2026 </div></body></html> \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pgbackrest-2.59.1/doc/html/user-guide.html new/pgbackrest-2.59.2/doc/html/user-guide.html --- old/pgbackrest-2.59.1/doc/html/user-guide.html 2026-08-17 11:10:21.773832300 +0200 +++ new/pgbackrest-2.59.2/doc/html/user-guide.html 2026-09-27 13:17:13.527422700 +0200 @@ -229,11 +229,11 @@ </div><div class="section-body-text"> When building from source it is best to use a build host rather than building on production. Many of the tools required for the build should generally not be installed in production. <span class="backrest">pgBackRest</span> consists of a single executable so it is easy to copy to a new host once it is built. </div><div class="execute"><div class="execute-title"> -<span class="host">build</span> <b>⇒</b> Download version <span class="id">2.59.1</span> of <span class="backrest">pgBackRest</span> to <span class="path">/build</span> path +<span class="host">build</span> <b>⇒</b> Download version <span class="id">2.59.2</span> of <span class="backrest">pgBackRest</span> to <span class="path">/build</span> path </div><div class="execute-body"> <pre class="execute-body-cmd">mkdir -p /build</pre> <pre class="execute-body-cmd">curl -fsSL \ - https://github.com/pgbackrest/pgbackrest/releases/download/release%2F2.59.1/pgbackrest-2.59.1.tar.gz | \ + https://github.com/pgbackrest/pgbackrest/releases/download/release%2F2.59.2/pgbackrest-2.59.2.tar.gz | \ tar zx -C /build</pre> </div></div><div class="execute"><div class="execute-title"> <span class="host">build</span> <b>⇒</b> Install build dependencies @@ -243,7 +243,7 @@ </div></div><div class="execute"><div class="execute-title"> <span class="host">build</span> <b>⇒</b> Configure and compile <span class="backrest">pgBackRest</span> </div><div class="execute-body"> -<pre class="execute-body-cmd">meson setup /build/pgbackrest /build/pgbackrest-2.59.1</pre> +<pre class="execute-body-cmd">meson setup /build/pgbackrest /build/pgbackrest-2.59.2</pre> <pre class="execute-body-cmd">ninja -C /build/pgbackrest</pre> </div></div><div class="execute"><div class="execute-title"> <span class="host">build</span> <b>⇒</b> Optionally run smoke tests to verify <span class="backrest">pgBackRest</span> was built correctly @@ -2092,5 +2092,5 @@ </div><div class="config-body"><div class="config-body-output"> Config suppressed for testing </div></div></div></div></div></div><div class="page-footer"> -Copyright © 2015-2026, The PostgreSQL Global Development Group, <a href="https://github.com/pgbackrest/pgbackrest/blob/main/LICENSE">MIT License</a>. Updated August 17, 2026 +Copyright © 2015-2026, The PostgreSQL Global Development Group, <a href="https://github.com/pgbackrest/pgbackrest/blob/main/LICENSE">MIT License</a>. Updated September 27, 2026 </div></body></html> \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pgbackrest-2.59.1/meson.build new/pgbackrest-2.59.2/meson.build --- old/pgbackrest-2.59.1/meson.build 2026-08-17 11:08:40.000000000 +0200 +++ new/pgbackrest-2.59.2/meson.build 2026-09-27 13:15:45.000000000 +0200 @@ -4,7 +4,7 @@ project( 'pgbackrest', ['c'], - version: '2.59.1', + version: '2.59.2', license: 'MIT', meson_version: '>=0.47', default_options: [ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pgbackrest-2.59.1/src/command/annotate/annotate.c new/pgbackrest-2.59.2/src/command/annotate/annotate.c --- old/pgbackrest-2.59.1/src/command/annotate/annotate.c 2026-08-17 11:08:40.000000000 +0200 +++ new/pgbackrest-2.59.2/src/command/annotate/annotate.c 2026-09-27 13:15:45.000000000 +0200 @@ -52,6 +52,9 @@ { TRY_BEGIN() { + // Get the repo storage in case it is remote and encryption settings need to be pulled down + storageRepoIdx(repoIdx); + // Attempt to load the backup info file const CipherType repoCipherType = cfgOptionIdxStrId(cfgOptRepoCipherType, repoIdx); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pgbackrest-2.59.1/src/command/archive/push/push.c new/pgbackrest-2.59.2/src/command/archive/push/push.c --- old/pgbackrest-2.59.1/src/command/archive/push/push.c 2026-08-17 11:08:40.000000000 +0200 +++ new/pgbackrest-2.59.2/src/command/archive/push/push.c 2026-09-27 13:15:45.000000000 +0200 @@ -559,18 +559,38 @@ // If not dropping then limit the number of WAL files pushed in a single run to archive-push-batch-size. The queue is // only rechecked at the start of each run so this bounds how large it can grow before the next run rechecks it. Convert - // the size to a segment count using the size of the first ready segment and always push at least one segment. A ready - // WAL segment should never be missing or zero size, so error immediately if it is. + // the size to a segment count using the size of the first ready segment and always push at least one file. Files that + // are not segments also count against the batch, so a run may push only those files when the batch size is small, but + // they are acknowledged and drop out of the list for the next run. if (!drop) { - const uint64_t segmentSize = storageInfoP( - storagePg(), strNewFmt("%s/%s", strZ(jobData.walPath), strZ(strLstGet(jobData.walFileList, 0)))).size; - CHECK_FMT(FormatError, segmentSize != 0, "size of WAL segment '%s' is 0", strZ(strLstGet(jobData.walFileList, 0))); + // Find the first ready WAL segment. The ready list also contains backup and timeline history files, which are + // smaller than a segment and may even be zero size when PostgreSQL did not sync them before the cluster was + // copied, so they cannot be used to determine the segment size. + const String *walSegment = NULL; - const uint64_t batchMax = cfgOptionUInt64(cfgOptArchivePushBatchSize) / segmentSize; + for (unsigned int walFileIdx = 0; walFileIdx < strLstSize(jobData.walFileList); walFileIdx++) + { + if (walIsSegment(strLstGet(jobData.walFileList, walFileIdx))) + { + walSegment = strLstGet(jobData.walFileList, walFileIdx); + break; + } + } - while (strLstSize(jobData.walFileList) > 1 && strLstSize(jobData.walFileList) > batchMax) - strLstRemoveIdx(jobData.walFileList, strLstSize(jobData.walFileList) - 1); + // Apply the batch size when a segment is ready. When none is ready every file is small so there is nothing to + // limit. A ready WAL segment should never be missing or zero size, so error immediately if it is. + if (walSegment != NULL) + { + const uint64_t segmentSize = storageInfoP( + storagePg(), strNewFmt("%s/%s", strZ(jobData.walPath), strZ(walSegment))).size; + CHECK_FMT(FormatError, segmentSize != 0, "size of WAL segment '%s' is 0", strZ(walSegment)); + + const uint64_t batchMax = cfgOptionUInt64(cfgOptArchivePushBatchSize) / segmentSize; + + while (strLstSize(jobData.walFileList) > 1 && strLstSize(jobData.walFileList) > batchMax) + strLstRemoveIdx(jobData.walFileList, strLstSize(jobData.walFileList) - 1); + } } LOG_INFO_FMT( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pgbackrest-2.59.1/src/command/backup/blockIncr.c new/pgbackrest-2.59.2/src/command/backup/blockIncr.c --- old/pgbackrest-2.59.1/src/command/backup/blockIncr.c 2026-08-17 11:08:40.000000000 +0200 +++ new/pgbackrest-2.59.2/src/command/backup/blockIncr.c 2026-09-27 13:15:45.000000000 +0200 @@ -232,10 +232,13 @@ this->blockMapWrite = true; } - // Write the block map if done processing and there are new/changed blocks or block list has been truncated + // Write the block map if done processing and there are new/changed blocks or block list has been truncated. A block map + // with no blocks is never written because it cannot be read back. That happens when the file is truncated to zero during + // the backup, in which case the file is stored as truncated and the map is not needed. if (this->done && this->blockOutOffset == 0 && (this->blockMapWrite || - (this->blockMapPrior != NULL && blockMapSize(this->blockMapOut) < blockMapSize(this->blockMapPrior)))) + (this->blockMapPrior != NULL && blockMapSize(this->blockMapOut) > 0 && + blockMapSize(this->blockMapOut) < blockMapSize(this->blockMapPrior)))) { MEM_CONTEXT_TEMP_BEGIN() { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pgbackrest-2.59.1/src/command/backup/file.c new/pgbackrest-2.59.2/src/command/backup/file.c --- old/pgbackrest-2.59.1/src/command/backup/file.c 2026-08-17 11:08:40.000000000 +0200 +++ new/pgbackrest-2.59.2/src/command/backup/file.c 2026-09-27 13:15:45.000000000 +0200 @@ -314,9 +314,10 @@ fileResult->copySize = pckReadU64P( ioFilterGroupResultP(ioReadFilterGroup(readIo), SIZE_FILTER_TYPE, .idx = 0)); - // If file is zero-length then it was truncated during the backup. When bundling we can simply mark it - // as truncated since no file needs to be stored. - if (bundleId != 0 && fileResult->copySize == 0) + // If file is zero-length then it was truncated during the backup. When bundling we can simply mark + // it as truncated since no file needs to be stored. The same is true for block incremental, which + // additionally must not be stored because a block map with no blocks cannot be read back. + if ((bundleId != 0 || file->blockIncrSize != 0) && fileResult->copySize == 0) { fileResult->backupCopyResult = backupCopyResultTruncate; fileResult->copyChecksum = HASH_TYPE_SHA1_ZERO_BUF; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pgbackrest-2.59.1/src/command/manifest/manifest.c new/pgbackrest-2.59.2/src/command/manifest/manifest.c --- old/pgbackrest-2.59.1/src/command/manifest/manifest.c 2026-08-17 11:08:40.000000000 +0200 +++ new/pgbackrest-2.59.2/src/command/manifest/manifest.c 2026-09-27 13:15:45.000000000 +0200 @@ -437,6 +437,9 @@ MEM_CONTEXT_TEMP_BEGIN() { + // Get the repo storage in case it is remote and encryption settings need to be pulled down + storageRepo(); + // Load backup.info and cipher const InfoBackup *const infoBackup = infoBackupLoadFile( storageRepo(), INFO_BACKUP_PATH_FILE_STR, cfgOptionStrId(cfgOptRepoCipherType), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pgbackrest-2.59.1/src/postgres/interface/static.vendor.h new/pgbackrest-2.59.2/src/postgres/interface/static.vendor.h --- old/pgbackrest-2.59.1/src/postgres/interface/static.vendor.h 2026-08-17 11:08:40.000000000 +0200 +++ new/pgbackrest-2.59.2/src/postgres/interface/static.vendor.h 2026-09-27 13:15:45.000000000 +0200 @@ -62,19 +62,14 @@ // ChecksumStateType enum // --------------------------------------------------------------------------------------------------------------------------------- /* - * Checksum state 0 is used for when data checksums are disabled (OFF). - * PG_DATA_CHECKSUM_INPROGRESS_{ON|OFF} defines that data checksums are either - * currently being enabled or disabled, and PG_DATA_CHECKSUM_VERSION defines - * that data checksums are enabled. The ChecksumStateType is stored in - * pg_control so changing requires a catversion bump, and the values cannot - * be reordered. New states must be added at the end. + * Checksum state 0 is used for when data checksums are disabled (OFF), and + * PG_DATA_CHECKSUM_VERSION defines that data checksums are enabled. New + * states must be added at the end. */ typedef enum ChecksumStateType { PG_DATA_CHECKSUM_OFF = 0, PG_DATA_CHECKSUM_VERSION = 1, - PG_DATA_CHECKSUM_INPROGRESS_OFF = 2, - PG_DATA_CHECKSUM_INPROGRESS_ON = 3, } ChecksumStateType; /*********************************************************************************************************************************** diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pgbackrest-2.59.1/src/postgres/interface/version.vendor.h new/pgbackrest-2.59.2/src/postgres/interface/version.vendor.h --- old/pgbackrest-2.59.1/src/postgres/interface/version.vendor.h 2026-08-17 11:08:40.000000000 +0200 +++ new/pgbackrest-2.59.2/src/postgres/interface/version.vendor.h 2026-09-27 13:15:45.000000000 +0200 @@ -296,7 +296,7 @@ #elif PG_VERSION >= PG_VERSION_19 /* Version identifier for this pg_control format */ -#define PG_CONTROL_VERSION 1902 +#define PG_CONTROL_VERSION 1905 #elif PG_VERSION >= PG_VERSION_18 @@ -388,9 +388,6 @@ * set to InvalidTransactionId. */ TransactionId oldestActiveXid; - - /* data checksums state at the time of the checkpoint */ - uint32 dataChecksumState; } CheckPoint; #elif PG_VERSION >= PG_VERSION_17 @@ -694,7 +691,13 @@ bool float8ByVal; /* float8, int8, etc pass-by-value? */ - /* Are data pages protected by checksums? Zero if no checksum version */ + /* + * Data checksum state at cluster initialization. Since the state can be + * changed during runtime, we need to store the initial value for system + * functions which report initdb settings. + */ + uint32 data_checksum_version_init; + /* Current data checksums state */ uint32 data_checksum_version; /* @@ -1701,7 +1704,7 @@ #elif PG_VERSION >= PG_VERSION_19 -#define XLOG_PAGE_MAGIC 0xD121 /* can be used as WAL version indicator */ +#define XLOG_PAGE_MAGIC 0xD122 /* can be used as WAL version indicator */ #elif PG_VERSION >= PG_VERSION_18 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pgbackrest-2.59.1/src/postgres/interface.c new/pgbackrest-2.59.2/src/postgres/interface.c --- old/pgbackrest-2.59.1/src/postgres/interface.c 2026-08-17 11:08:40.000000000 +0200 +++ new/pgbackrest-2.59.2/src/postgres/interface.c 2026-09-27 13:15:45.000000000 +0200 @@ -322,18 +322,12 @@ pgPageSizeCheck(result.pageSize); // Check the checksum version - if ((result.version <= PG_VERSION_18 && result.pageChecksumVersion > PG_DATA_CHECKSUM_VERSION) || - (result.version > PG_VERSION_18 && result.pageChecksumVersion > PG_DATA_CHECKSUM_INPROGRESS_ON)) + if (result.pageChecksumVersion > PG_DATA_CHECKSUM_VERSION) { THROW_FMT( - FormatError, "page checksum version is %u but must be <= %d", result.pageChecksumVersion, - result.version <= PG_VERSION_18 ? PG_DATA_CHECKSUM_VERSION : PG_DATA_CHECKSUM_INPROGRESS_ON); + FormatError, "page checksum version is %u but must be <= %d", result.pageChecksumVersion, PG_DATA_CHECKSUM_VERSION); } - // Clear checksum version values that represent clusters with incomplete checksums - if (result.version > PG_VERSION_18 && result.pageChecksumVersion > PG_DATA_CHECKSUM_VERSION) - result.pageChecksumVersion = 0; - FUNCTION_LOG_RETURN(PG_CONTROL, result); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pgbackrest-2.59.1/src/storage/azure/storage.c new/pgbackrest-2.59.2/src/storage/azure/storage.c --- old/pgbackrest-2.59.1/src/storage/azure/storage.c 2026-08-17 11:08:40.000000000 +0200 +++ new/pgbackrest-2.59.2/src/storage/azure/storage.c 2026-09-27 13:15:45.000000000 +0200 @@ -153,9 +153,10 @@ if (this->keyType == storageAzureKeyTypeShared) httpHeaderPut(httpHeader, HTTP_HEADER_DATE_STR, dateTime); - // Set version header (required for shared key and auto auth types, not for SAS) but never on batch sub-requests, - // which inherit the version from the top-level batch request - if (this->keyType != storageAzureKeyTypeSas && !subRequest) + // Set version header but never on batch sub-requests, which inherit the version from the top-level batch request. SAS + // specifies a version in the sv parameter, but that is not sufficient for batch, which rejects the request when the version + // is not set explicitly. + if (!subRequest) httpHeaderPut(httpHeader, AZURE_HEADER_VERSION_STR, AZURE_HEADER_VERSION_VALUE_STR); // Shared key authentication diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pgbackrest-2.59.1/src/storage/read.c new/pgbackrest-2.59.2/src/storage/read.c --- old/pgbackrest-2.59.1/src/storage/read.c 2026-08-17 11:08:40.000000000 +0200 +++ new/pgbackrest-2.59.2/src/storage/read.c 2026-09-27 13:15:45.000000000 +0200 @@ -119,6 +119,10 @@ .limit = this->pub.limit != NULL ? varNewUInt64(varUInt64(this->pub.limit) - this->bytesRead) : NULL, .versionId = this->pub.versionId); + // The filter group is never set on the recreated driver, so retry must already be disabled for any driver + // that requires one (see storageReadNew()) + ASSERT(storageReadDriverInterface(this->driver)->filterGroup == NULL); + // Error when the file is missing since it must have existed when the read began if (!storageReadDriverInterface(this->driver)->open(this->driver)) THROW_FMT(FileMissingError, STORAGE_ERROR_READ_MISSING, strZ(storageReadName(this))); @@ -259,7 +263,15 @@ // Set filter group when interface function exists if (storageReadDriverInterface(this->driver)->filterGroup != NULL) + { storageReadDriverInterface(this->driver)->filterGroup(this->driver, ioReadFilterGroup(storageReadIo(this))); + + // Disable retry when the driver requires the filter group. The filters are passed to the driver when the read is + // opened, e.g. to be run on a remote host, so they cannot be run again for a retry. Also, bytes read are counted after + // the filters have been applied so the offset to restart the read cannot be determined. Retry in this case is expected + // to be handled by the driver, e.g. the remote host retries reads on object stores. + this->retry = false; + } } OBJ_NEW_END(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pgbackrest-2.59.1/src/storage/s3/storage.c new/pgbackrest-2.59.2/src/storage/s3/storage.c --- old/pgbackrest-2.59.1/src/storage/s3/storage.c 2026-08-17 11:08:40.000000000 +0200 +++ new/pgbackrest-2.59.2/src/storage/s3/storage.c 2026-09-27 13:15:45.000000000 +0200 @@ -49,8 +49,10 @@ STRING_STATIC(S3_QUERY_CONTINUATION_TOKEN_STR, "continuation-token"); STRING_STATIC(S3_QUERY_DELETE_STR, "delete"); STRING_STATIC(S3_QUERY_DELIMITER_STR, "delimiter"); +STRING_STATIC(S3_QUERY_KEY_MARKER_STR, "key-marker"); STRING_STATIC(S3_QUERY_LIST_TYPE_STR, "list-type"); STRING_STATIC(S3_QUERY_PREFIX_STR, "prefix"); +STRING_STATIC(S3_QUERY_VERSION_ID_MARKER_STR, "version-id-marker"); STRING_STATIC(S3_QUERY_VERSIONS_STR, "versions"); STRING_STATIC(S3_QUERY_VALUE_LIST_TYPE_2_STR, "2"); @@ -68,6 +70,9 @@ STRING_STATIC(S3_XML_TAG_LAST_MODIFIED_STR, "LastModified"); #define S3_XML_TAG_NEXT_CONTINUATION_TOKEN "NextContinuationToken" STRING_STATIC(S3_XML_TAG_NEXT_CONTINUATION_TOKEN_STR, S3_XML_TAG_NEXT_CONTINUATION_TOKEN); +#define S3_XML_TAG_NEXT_KEY_MARKER "NextKeyMarker" +STRING_STATIC(S3_XML_TAG_NEXT_KEY_MARKER_STR, S3_XML_TAG_NEXT_KEY_MARKER); +STRING_STATIC(S3_XML_TAG_NEXT_VERSION_ID_MARKER_STR, "NextVersionIdMarker"); STRING_STATIC(S3_XML_TAG_OBJECT_STR, "Object"); STRING_STATIC(S3_XML_TAG_PREFIX_STR, "Prefix"); STRING_STATIC(S3_XML_TAG_QUIET_STR, "Quiet"); @@ -839,16 +844,42 @@ // If list is truncated then send an async request to get more data if (strEq(xmlNodeContent(xmlNodeChild(xmlRoot, S3_XML_TAG_IS_TRUNCATED_STR, true)), TRUE_STR)) { - const String *const nextContinuationToken = xmlNodeContent( - xmlNodeChild(xmlRoot, S3_XML_TAG_NEXT_CONTINUATION_TOKEN_STR, true)); - CHECK(FormatError, !strEmpty(nextContinuationToken), S3_XML_TAG_NEXT_CONTINUATION_TOKEN " may not be empty"); + // Build the query for the next page from the base query since the markers are set per page + HttpQuery *const queryNext = httpQueryDupP(query); - httpQueryPut(query, S3_QUERY_CONTINUATION_TOKEN_STR, nextContinuationToken); + // Version listing is paginated with key and version id markers + if (targetTime != 0) + { + const String *const nextKeyMarker = xmlNodeContent( + xmlNodeChild(xmlRoot, S3_XML_TAG_NEXT_KEY_MARKER_STR, true)); + CHECK(FormatError, !strEmpty(nextKeyMarker), S3_XML_TAG_NEXT_KEY_MARKER " may not be empty"); + + httpQueryAdd(queryNext, S3_QUERY_KEY_MARKER_STR, nextKeyMarker); + + // The version id marker may be missing or empty when the next result is a common prefix. In that case the + // next page starts at the key after the key marker, which is what is needed. + const String *const nextVersionIdMarker = xmlNodeContent( + xmlNodeChild(xmlRoot, S3_XML_TAG_NEXT_VERSION_ID_MARKER_STR, false)); + + if (nextVersionIdMarker != NULL && !strEmpty(nextVersionIdMarker)) + httpQueryAdd(queryNext, S3_QUERY_VERSION_ID_MARKER_STR, nextVersionIdMarker); + } + // Else object listing is paginated with a continuation token + else + { + const String *const nextContinuationToken = xmlNodeContent( + xmlNodeChild(xmlRoot, S3_XML_TAG_NEXT_CONTINUATION_TOKEN_STR, true)); + CHECK( + FormatError, !strEmpty(nextContinuationToken), + S3_XML_TAG_NEXT_CONTINUATION_TOKEN " may not be empty"); + + httpQueryAdd(queryNext, S3_QUERY_CONTINUATION_TOKEN_STR, nextContinuationToken); + } // Store request in the outer temp context MEM_CONTEXT_PRIOR_BEGIN() { - request = storageS3RequestAsyncP(this, HTTP_VERB_GET_STR, FSLASH_STR, .query = query); + request = storageS3RequestAsyncP(this, HTTP_VERB_GET_STR, FSLASH_STR, .query = queryNext); } MEM_CONTEXT_PRIOR_END(); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pgbackrest-2.59.1/src/version.h new/pgbackrest-2.59.2/src/version.h --- old/pgbackrest-2.59.1/src/version.h 2026-08-17 11:08:40.000000000 +0200 +++ new/pgbackrest-2.59.2/src/version.h 2026-09-27 13:15:45.000000000 +0200 @@ -35,10 +35,10 @@ ***********************************************************************************************************************************/ #define PROJECT_VERSION_MAJOR 2 #define PROJECT_VERSION_MINOR 59 -#define PROJECT_VERSION_PATCH 1 +#define PROJECT_VERSION_PATCH 2 #define PROJECT_VERSION_SUFFIX "" -#define PROJECT_VERSION "2.59.1" -#define PROJECT_VERSION_NUM 2059001 +#define PROJECT_VERSION "2.59.2" +#define PROJECT_VERSION_NUM 2059002 #endif
