1
0
mirror of https://github.com/pgbackrest/pgbackrest.git synced 2026-10-23 21:28:56 +03:00

Add release note details for v2.33 through v2.60.

Every item in v2.33 through v2.60.0 other than development items now has a summary, and every commit of each release is claimed by an item. Commits that were not mentioned are grouped into development items. Missing and incorrect pull request and issue references were fixed by comparing against GitHub.

When the local integration branch is related to HEAD, a release with details must claim every commit. A commit whose subject is not unique in a release is named with <commit id="..." subject="...">. Commits back-patched to a patch release are listed in <release-backpatch-list> and shown only on a development build. The commits of a patch release are read from its release/x.y.z tag.

A development item can specify the release note of a later release with <release-note version="..." subject="...">. The release note lists the development commits in its details, and on a development build the development item links to the release note. A release in development can be specified by its final version, e.g. 2.61.0 for 2.61.0dev.

Add the tester contributor role, which replaces the comments that recorded testers as reviewers.

Disable scroll anchoring on the page so opening details does not scroll the page in Firefox.
This commit is contained in:
David Steele
2026-10-17 20:53:47 +02:00
parent e96d03cb38
commit bd8f99be00
46 changed files with 5788 additions and 209 deletions

View File

@@ -181,7 +181,7 @@ def _build(config, var_store):
var_store.add("release-date", date)
var_store.add("release-year", year)
release_history_update(path_repo, config.doc_path)
claim = release_history_update(path_repo, config.doc_path)
document_map = {
"command": reference_command_render(bld_cfg, bld_hlp),
@@ -189,7 +189,7 @@ def _build(config, var_store):
"index": news_index_render(index, news),
"news": news_render(news),
"user-guide": build_pre(user_guide, bld_hlp, var_store),
"release": release_render(release, config.doc_path, config.var_map.get("dev") == "y"),
"release": release_render(release, config.doc_path, config.var_map.get("dev") == "y", claim),
}
return document_map, reference_man_render(index, bld_cfg, bld_hlp)

View File

@@ -15,7 +15,7 @@ from collections import deque
from common.date import date_render
from common.error import ToolError
from common.exec import exec_result
from common.exec import exec_result, exec_status
from common.storage import file_read, file_write
from common.xml import (
xml_document_new,
@@ -35,6 +35,9 @@ from config.project import PROJECT_NAME
# Where the git history is cached
_FILE_HISTORY = "resource/git-history.cache"
# Local branch the git history ends at when it is related to HEAD
_HISTORY_BRANCH = "refs/heads/integration"
# Subject of a commit that closed a release
_RELEASE_SUBJECT_EXP = re.compile(r"^v[0-9]{1,2}\.[0-9]{1,2}(\.[0-9]+)?: ")
@@ -57,6 +60,7 @@ _ITEM_LIST = (
_CONTRIBUTOR_LIST = (
("release-item-contributor", "Fixed", "Contributed"),
("release-item-reviewer", "Reviewed", "Reviewed"),
("release-item-tester", "Tested", "Tested"),
("release-item-ideator", "Reported", "Suggested"),
)
@@ -71,7 +75,7 @@ _COMMIT_URL = "{[github-url-base]}/commit/%s"
_COMMIT_SIZE = 7
# Releases with version >= this have the paragraphs after the first and the links of an item in details
_DETAIL_VERSION_MIN = "2.60"
_DETAIL_VERSION_MIN = "2.33"
# A bug fix release is x.y.z with z > 0
_VERSION_BUG_FIX_EXP = re.compile(r"^[0-9]+\.[0-9]+\.[1-9][0-9]*$")
@@ -105,22 +109,57 @@ def release_current_stable(root):
####################################################################################################################################
def release_history_update(path_repo, path_doc):
"""Write the git history the release notes are checked against when HEAD is not the newest commit in it.
"""Write the git history the release notes are checked against when the newest commit in it has changed.
The body of a commit that closed a release is left out."""
When the local integration branch is related to HEAD the history ends at the newest commit of HEAD that is also in integration
and the result is true. The commits of a release branch are left out this way. Otherwise the history ends at HEAD and the result
is false. The body of a commit that closed a release is left out."""
path_history = os.path.join(path_doc, _FILE_HISTORY)
head = exec_result("git -C %s rev-parse HEAD" % path_repo, suppress_stderr=True)[1].strip()
command = "git -C %s merge-base HEAD %s" % (path_repo, _HISTORY_BRANCH)
related = exec_status(command) == 0
head = exec_result(command if related else "git -C %s rev-parse HEAD" % path_repo, suppress_stderr=True)[1].strip()
if os.path.isfile(path_history) and json.loads(file_read(path_history))[0]["commit"] == head:
return
# The tag of each patch release with version >= _DETAIL_VERSION_MIN
tag_map = {}
for tag in exec_result("git -C %s tag --list 'release/*'" % path_repo, suppress_stderr=True)[1].split():
version = tag[len("release/") :]
if _VERSION_BUG_FIX_EXP.match(version) is not None and version >= _DETAIL_VERSION_MIN:
tag_map[version] = exec_result("git -C %s rev-parse '%s^{commit}'" % (path_repo, tag), suppress_stderr=True)[1].strip()
if os.path.isfile(path_history):
history = json.loads(file_read(path_history))
if (
isinstance(history, dict)
and history["head"][0]["commit"] == head
and {version: tag_list[0]["commit"] for version, tag_list in history["tag"].items()} == tag_map
):
return related
# The history of a patch release is the commits of its tag that are not in the history of HEAD
history = {
"head": _history_read(path_repo, head),
"tag": {version: _history_read(path_repo, "%s --not %s" % (commit, head)) for version, commit in tag_map.items()},
}
file_write(path_history, json.dumps(history, indent=4, ensure_ascii=False) + "\n")
return related
####################################################################################################################################
def _history_read(path_repo, revision):
"""Read the commits git log lists for a revision, newest first."""
# Records are separated by a byte that cannot appear in a commit message, and so are the fields within a record
output = exec_result(
"git -C %s log --pretty=format:%%H%%x00%%ci%%x00%%s%%x00%%b%%x1e %s" % (path_repo, head), suppress_stderr=True
"git -C %s log --pretty=format:%%H%%x00%%ci%%x00%%s%%x00%%b%%x1e %s" % (path_repo, revision), suppress_stderr=True
)[1]
history = []
result = []
for record in output.split("\x1e"):
record = record.strip("\n")
@@ -135,9 +174,9 @@ def release_history_update(path_repo, path_doc):
if body != "" and _RELEASE_SUBJECT_EXP.match(subject) is None:
entry["body"] = body
history.append(entry)
result.append(entry)
file_write(path_history, json.dumps(history, indent=4, ensure_ascii=False) + "\n")
return result
####################################################################################################################################
@@ -157,11 +196,15 @@ def _date_render(date, version):
class _Release:
"""Builds the release document."""
def __init__(self, root, path_doc, dev):
def __init__(self, root, path_doc, dev, claim):
self.root = root
self.dev = dev
self.claim = claim # Must every commit of a release be claimed by an item?
self.version_list = [xml_node_attribute(release, "version", True) for release in release_list(root)]
self.history = deque(json.loads(file_read(os.path.join(path_doc, _FILE_HISTORY))))
history = json.loads(file_read(os.path.join(path_doc, _FILE_HISTORY)))
self.history = deque(history["head"])
self.history_tag = history["tag"]
# The first contributor is the default for every item, which is what keeps the common case out of the xml
self.contributor_map = {}
@@ -179,6 +222,9 @@ class _Release:
self.render = DocRender("text")
self.render.tag_set("backrest", PROJECT_NAME)
# The items of each release that are not development items, as [text, list item, item, commits, development items]
self.release_item_map = {}
################################################################################################################################
def _contributor_text(self, item, item_type):
"""What the release notes say about who did the work on an item."""
@@ -239,17 +285,19 @@ class _Release:
return result
################################################################################################################################
def _commit_find(self, commit_list, subject, regexp=True):
"""Find a commit by what its subject begins with, which is how a release item is tied to the work that did it."""
def _commit_find(self, commit_list, subject, regexp=True, key="subject"):
"""Find a commit by what its subject begins with, which is how a release item is tied to the work that did it.
With key="commit" the commit is found by what its hash begins with."""
result = None
for commit in commit_list:
found = re.match(subject, commit["subject"]) is not None if regexp else commit["subject"].startswith(subject)
found = re.match(subject, commit[key]) is not None if regexp else commit[key].startswith(subject)
if found:
if result is not None:
raise ToolError("subject prefix '%s' already found in commit %s" % (subject, commit["commit"]))
raise ToolError("%s prefix '%s' already found in commit %s" % (key, subject, commit["commit"]))
result = commit
@@ -274,24 +322,35 @@ class _Release:
def _commit_list(self, version, release_idx, release_all):
"""Every commit that belongs to a release, and whether the items of the release are checked against them.
A bug fix release that is not the most recent is skipped since it was built on a branch of its own, so the commits are not
in the history between this release and the one before it."""
A bug fix release that is not the most recent was built on a branch of its own, so its commits are read from the history of
its tag. It is skipped when there is no history for its tag."""
if version < "2.01" or (_VERSION_BUG_FIX_EXP.match(version) is not None and release_idx != 0):
bug_fix = _VERSION_BUG_FIX_EXP.match(version) is not None and release_idx != 0
if version < "2.01" or (bug_fix and version not in self.history_tag):
return [], [], {}, False
history = deque(self.history_tag[version]) if bug_fix else self.history
dev = version.endswith("dev")
# The commit that opened development on this release and the commit that closed the release before it, which are the ends of
# what belongs to this release
commit_begin = self._commit_find(self.history, "Begin v%s development\\." % version)
commit_begin = self._commit_find(history, "Begin v%s development\\." % version)
# Development on an x.y.0 release may have been opened as x.y
if commit_begin is None and version.endswith(".0"):
commit_begin = self._commit_find(history, "Begin v%s development\\." % version[:-2])
commit_begin = None if commit_begin is None else commit_begin["commit"]
# Skip back over bug fix releases, which were built on branches of their own
# Skip back over bug fix releases, which were built on branches of their own. The tag history of a bug fix release ends
# at the release before it.
last_idx = release_idx + 1
while last_idx < len(release_all) and _VERSION_BUG_FIX_EXP.match(
xml_node_attribute(release_all[last_idx], "version", True)
while (
not bug_fix
and last_idx < len(release_all)
and _VERSION_BUG_FIX_EXP.match(xml_node_attribute(release_all[last_idx], "version", True))
):
last_idx += 1
@@ -300,21 +359,21 @@ class _Release:
version_last = xml_node_attribute(release_all[last_idx], "version", True)
commit_last_end = self._commit_find(self.history, "v%s\\: .+" % version_last)
commit_last_end = self._commit_find(history, "v%s\\: .+" % version_last)
if commit_last_end is None:
if commit_last_end is None and not bug_fix:
raise ToolError("release %s must have an end commit" % version_last)
# A release that is out has a commit that closed it, which the release after it has already checked for
commit_end = self._commit_find(self.history, "v%s\\: .+" % version)
commit_end = self._commit_find(history, "v%s\\: .+" % version)
commit_end = None if commit_end is None else commit_end["commit"]
commit_list = []
remaining_list = []
commit_map = {}
while len(self.history) > 0 and self.history[0]["commit"] != commit_last_end["commit"]:
commit = self.history.popleft()
while len(history) > 0 and (commit_last_end is None or history[0]["commit"] != commit_last_end["commit"]):
commit = history.popleft()
# The commits that open and close a release are the release rather than part of it
if commit["commit"] in (commit_begin, commit_end):
@@ -357,18 +416,32 @@ class _Release:
for commit_xml in commit_xml_list:
subject = xml_node_attribute(commit_xml, "subject", True)
commit = self._commit_find(commit_list, subject, False)
commit_id = xml_node_attribute(commit_xml, "id")
if commit is None:
if check:
self._commit_error(
"unable to find release %s commit subject '%s' in list" % (version, subject), remaining_list, commit_map
# A commit with an id is found by the id and its subject must begin with the subject named
if commit_id is not None:
name = "id '%s'" % commit_id
commit = self._commit_find(commit_list, commit_id, False, "commit")
if commit is not None and not commit["subject"].startswith(subject):
raise ToolError(
"release %s commit id '%s' subject '%s' does not begin with '%s'"
% (version, commit_id, commit["subject"], subject)
)
elif commit["commit"] in remaining_list:
remaining_list.remove(commit["commit"])
else:
name = "subject '%s'" % subject
commit = self._commit_find(commit_list, subject, False)
if commit is None and check:
self._commit_error("unable to find release %s commit %s in list" % (version, name), remaining_list, commit_map)
result.append((commit_xml, commit))
# Remove the commits found from the commits no item has claimed
for _, commit in result:
if commit is not None and commit["commit"] in remaining_list:
remaining_list.remove(commit["commit"])
return result
################################################################################################################################
@@ -396,26 +469,43 @@ class _Release:
self._ref_add(ref, label, url % id, "#%s" % id)
################################################################################################################################
def _detail_add(self, list_item, item, item_commit_list):
"""Add the paragraphs after the first and the issues, pull requests, and commits of an item as details.
@staticmethod
def _version_line_add(detail, version, text, note=None):
"""Add a line to details that links to a release, after the text of a release note in quotes when note is not None."""
ref_item = xml_node_add(xml_node_add(detail, "list-detail-ref"), "list-detail-ref-item")
xml_node_content_add(ref_item, text)
if note is not None:
xml_node_content_add(xml_node_add(ref_item, "quote"), note)
xml_node_content_add(ref_item, " in ")
xml_node_content_add(xml_node_add(ref_item, "link", {"url": "#%s" % version}), "v%s" % version)
xml_node_content_add(ref_item, ":")
################################################################################################################################
def _ref_line_add(self, detail, item, item_commit_list, commit_line):
"""Add the issues, pull requests, and commits of an item to details.
An item with one commit has the commit on the same line as its issues and pull requests, after them. An item with more than
one commit has a line for each commit, with the subject of the commit and the issues and pull requests the commit element
names."""
one commit, or any item when commit_line is true, has a line for each commit, with the subject of the commit and the issues
and pull requests the commit element names. The issues and pull requests of an item with one commit are on the line of the
commit when commit_line is true."""
detail = xml_node_add(list_item, "list-detail")
for paragraph in xml_node_child_list(item, "p")[1:]:
xml_node_child_add(xml_node_add(detail, "list-detail-text"), paragraph)
item_line = commit_line and len(item_commit_list) == 1
commit_line = commit_line or len(item_commit_list) > 1
ref = xml_node_add(detail, "list-detail-ref")
self._ref_list_add(ref, item)
if not item_line:
self._ref_list_add(ref, item)
for commit_xml, commit in item_commit_list:
url = None if commit is None else _COMMIT_URL % commit["commit"]
hash = None if commit is None else commit["commit"][:_COMMIT_SIZE]
if len(item_commit_list) > 1:
if commit_line:
ref = xml_node_add(detail, "list-detail-ref")
# Escape the subject for html
@@ -425,9 +515,39 @@ class _Release:
if commit_xml is not None:
self._ref_list_add(ref, commit_xml)
if len(item_commit_list) == 1 and commit is not None:
if item_line:
self._ref_list_add(ref, item)
if not commit_line and commit is not None:
self._ref_add(ref, "Commit", url, hash, True)
################################################################################################################################
def _detail_add(self, list_item, item, item_commit_list, commit_line=False, release_note=None, dev_list=()):
"""Add the paragraphs after the first and the issues, pull requests, and commits of an item as details.
release_note is the version and text of the release note a development item names. dev_list is the development items
that name an item as their release note, as (version, item, commits), listed under a line for each release that links to
it."""
detail = xml_node_add(list_item, "list-detail")
for paragraph in xml_node_child_list(item, "p")[1:]:
xml_node_child_add(xml_node_add(detail, "list-detail-text"), paragraph)
if release_note is not None:
self._version_line_add(detail, release_note[0], "Development for ", release_note[1])
self._ref_line_add(detail, item, item_commit_list, commit_line)
dev_version_last = None
for dev_version, dev_item, dev_commit_list in dev_list:
if dev_version != dev_version_last:
self._version_line_add(detail, dev_version, "Development in ")
dev_version_last = dev_version
self._ref_line_add(detail, dev_item, dev_commit_list, True)
# Remove lines with no links and details with nothing in them
for ref in xml_node_child_list(detail, "list-detail-ref"):
if len(ref) == 0:
@@ -436,6 +556,49 @@ class _Release:
if len(detail) == 0:
list_item.remove(detail)
################################################################################################################################
def _release_note_add(self, item, version, item_commit_list):
"""Add a development item to the details of the release note it names. A release note is an item that is not a development
item in a later release. Returns the version and the text without a period at the end of the release note, or None when the
item names no release note."""
release_note = xml_node_child(item, "release-note")
if release_note is None:
return None
note_version = xml_node_attribute(release_note, "version", True)
note_subject = xml_node_attribute(release_note, "subject", True)
# A release in development is named by the version it will have when it is released
if note_version not in self.version_list and note_version + "dev" in self.version_list:
note_version += "dev"
if note_version not in self.version_list or self.version_list.index(note_version) >= self.version_list.index(version):
raise ToolError("release %s release note version %s is not a later release" % (version, note_version))
note_list = [note for note in self.release_item_map.get(note_version, []) if note[0].startswith(note_subject)]
if len(note_list) == 0:
raise ToolError("release %s release note '%s' not found in release %s" % (version, note_subject, note_version))
if len(note_list) > 1:
raise ToolError(
"release %s release note '%s' found more than once in release %s" % (version, note_subject, note_version)
)
note_list[0][4].append((version, item, item_commit_list))
return note_version, re.sub(r"\.$", "", note_list[0][0])
################################################################################################################################
def _release_item_render(self):
"""Add the details of each item that is not a development item, with the development items that name it."""
for item_list in self.release_item_map.values():
for _, list_item, item, item_commit_list, dev_list in item_list:
self._detail_add(list_item, item, item_commit_list, dev_list=dev_list)
################################################################################################################################
def render_document(self):
"""Build the release document."""
@@ -520,6 +683,8 @@ class _Release:
self._release_render(release, release_section, version, commit_list, remaining_list, commit_map, check)
self._release_item_render()
return root
################################################################################################################################
@@ -536,15 +701,24 @@ class _Release:
continue
for item_type, item_title, item_name in _ITEM_LIST:
# Development items are only listed on a development build, since they are of no interest to a reader
if not self.dev and item_type == "release-development-list":
continue
item_node = xml_node_child(type_node, item_type)
if item_node is None:
continue
# Development items are only listed on a development build, since they are of no interest to a reader. Their
# commits are still claimed when detail is true.
if not self.dev and item_type == "release-development-list":
if detail and check:
for item in xml_node_child_list(item_node, "release-item"):
item_commit_list = self._item_commit(
item, xml_node_child_list(item, "p")[0], version, commit_list, remaining_list, commit_map, True
)
self._release_note_add(item, version, item_commit_list)
continue
# A note about the release as a whole goes before the first list, whichever list that turns out to be
if not note and xml_node_child(type_node, "text") is not None:
xml_node_child_add(
@@ -562,7 +736,11 @@ class _Release:
for item in xml_node_child_list(item_node, "release-item"):
text = xml_node_child_list(item, "p")[0]
item_check = check and item_type != "release-development-list"
# Plain text of the item before credits are added
text_plain = self.render.process_text(text) if detail else None
item_check = check and (detail or item_type != "release-development-list")
item_commit_list = None
if item_check or detail:
@@ -570,7 +748,7 @@ class _Release:
item, text, version, commit_list, remaining_list, commit_map, item_check
)
# An item written as more than one paragraph reads as one line in the release notes when version < 2.60
# An item written as more than one paragraph reads as one line in the release notes when detail is false
if not detail:
for extra in xml_node_child_list(item, "p")[1:]:
xml_node_content_add(text, " ")
@@ -587,11 +765,70 @@ class _Release:
xml_node_child_add(list_item, text)
if detail:
self._detail_add(list_item, item, item_commit_list)
if item_type == "release-development-list":
release_note = self._release_note_add(item, version, item_commit_list)
self._detail_add(list_item, item, item_commit_list, release_note=release_note)
else:
if xml_node_child(item, "release-note") is not None:
raise ToolError(
"release %s item '%s' is not a development item and cannot name a release note"
% (version, text_plain)
)
# Details are added after every release is read
self.release_item_map.setdefault(version, []).append(
[text_plain, list_item, item, item_commit_list, []]
)
self._backpatch_render(release, release_section, version, commit_list, remaining_list, commit_map, check)
# Every commit of the release is claimed by an item when detail and claim are true
if detail and check and self.claim and len(remaining_list) > 0:
self._commit_error("release %s has commits that no item claims" % version, remaining_list, commit_map)
################################################################################################################################
def _backpatch_render(self, release, release_section, version, commit_list, remaining_list, commit_map, check):
"""Render the commits of a release that were back-patched to a patch release, grouped by the version of the patch release.
The commits are claimed on every build and only listed on a development build."""
backpatch_list = xml_node_child(release, "release-backpatch-list")
if backpatch_list is None:
return
list_node = None
if self.dev:
heading = xml_node_add(release_section, "p")
xml_node_content_add(xml_node_add(xml_node_text_add(heading), "b"), "Back-Patched:")
list_node = xml_node_add(release_section, "list")
for backpatch in xml_node_child_list(backpatch_list, "release-backpatch"):
backpatch_version = xml_node_attribute(backpatch, "version", True)
if backpatch_version not in self.version_list or _VERSION_BUG_FIX_EXP.match(backpatch_version) is None:
raise ToolError("release %s back-patch version %s is not a patch release" % (version, backpatch_version))
if len(xml_node_child_list(backpatch, "commit")) == 0:
raise ToolError("release %s back-patch version %s has no commits" % (version, backpatch_version))
item_commit_list = self._item_commit(backpatch, None, version, commit_list, remaining_list, commit_map, check)
if list_node is not None:
list_item = xml_node_text_add(xml_node_add(list_node, "list-item"))
xml_node_content_add(list_item, "Back-patched to ")
xml_node_content_add(xml_node_add(list_item, "link", {"url": "#%s" % backpatch_version}), "v%s" % backpatch_version)
xml_node_content_add(list_item, ".")
self._detail_add(list_item, backpatch, item_commit_list, True)
####################################################################################################################################
def release_render(root, path_doc, dev):
"""Build the release document from the release list."""
def release_render(root, path_doc, dev, claim=False):
"""Build the release document from the release list.
return _Release(root, path_doc, dev).render_document()
When claim is true every commit of a release with version >= _DETAIL_VERSION_MIN must be claimed by an item."""
return _Release(root, path_doc, dev, claim).render_document()

View File

@@ -130,6 +130,9 @@ html
font-family: var(--font-body);
font-size: 16px;
-webkit-text-size-adjust: 100%;
/* Opening details does not scroll the page */
overflow-anchor: none;
}
body

View File

@@ -15,10 +15,9 @@
<release-improvement-list>
<release-item>
<release-item-contributor-list>
<!-- Actually tester, but we don't have a tag for that yet -->
<release-item-reviewer id="slava.moudry"/>
<release-item-reviewer id="cynthia.shang"/>
<release-item-reviewer id="stephen.frost"/>
<release-item-tester id="slava.moudry"/>
</release-item-contributor-list>
<p>Non-blocking TLS implementation.</p>

View File

@@ -19,8 +19,7 @@
<release-item-contributor-list>
<release-item-reviewer id="cynthia.shang"/>
<!-- Actually tester, but we don't have a tag for that yet -->
<release-item-reviewer id="don.seiler"/>
<release-item-tester id="don.seiler"/>
</release-item-contributor-list>
<p>Azure support for repository storage.</p>

View File

@@ -33,10 +33,9 @@
<release-item-contributor id="david.steele"/>
<release-item-contributor id="stephen.frost"/>
<release-item-reviewer id="cynthia.shang"/>
<!-- Actually tester, but we don't have a tag for that yet -->
<release-item-reviewer id="david.youatt"/>
<release-item-reviewer id="ales.zeleny"/>
<release-item-reviewer id="jeanette.bromage"/>
<release-item-tester id="david.youatt"/>
</release-item-contributor-list>
<p>Automatically retrieve temporary <proper>S3</proper> credentials on <proper>AWS</proper> instances.</p>
@@ -75,9 +74,8 @@
<release-item-ideator id="brad.nicholson"/>
<release-item-reviewer id="cynthia.shang"/>
<release-item-reviewer id="stephen.frost"/>
<!-- Actually tester, but we don't have a tag for that yet -->
<release-item-reviewer id="brad.nicholson"/>
<release-item-reviewer id="MannerMan"/>
<release-item-tester id="brad.nicholson"/>
</release-item-contributor-list>
<p>Improve memory usage of unlogged relation detection in manifest build.</p>

View File

@@ -46,8 +46,7 @@
<release-item-ideator id="brian.peterson"/>
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="cynthia.shang"/>
<!-- Actually tester, but we don't have a tag for that yet -->
<release-item-reviewer id="brian.peterson"/>
<release-item-tester id="brian.peterson"/>
</release-item-contributor-list>
<p>Add <br-option>repo-azure-endpoint</br-option> option.</p>
@@ -77,8 +76,7 @@
<release-item>
<release-item-contributor-list>
<release-item-reviewer id="cynthia.shang"/>
<!-- Actually tester, but we don't have a tag for that yet -->
<release-item-reviewer id="MannerMan"/>
<release-item-tester id="MannerMan"/>
</release-item-contributor-list>
<p>Improve performance of large file lists in <cmd>backup</cmd>/<cmd>restore</cmd> commands.</p>

View File

@@ -15,8 +15,7 @@
<release-item>
<release-item-contributor-list>
<release-item-reviewer id="cynthia.shang"/>
<!-- Actually tester, but we don't have a tag for that yet -->
<release-item-reviewer id="stefan.fercot"/>
<release-item-tester id="stefan.fercot"/>
</release-item-contributor-list>
<p>Add <cmd>repo-ls</cmd> command.</p>
@@ -36,8 +35,7 @@
<release-item-contributor-list>
<release-item-contributor id="stefan.fercot"/>
<release-item-reviewer id="david.steele"/>
<!-- Actually tester, but we don't have a tag for that yet -->
<release-item-reviewer id="michael.banck"/>
<release-item-tester id="michael.banck"/>
</release-item-contributor-list>
<p>Add <setting>archive-mode-check</setting> option.</p>

View File

@@ -12,6 +12,8 @@
</release-item-contributor-list>
<p>Fix option warnings breaking async <cmd>archive-get</cmd>/<cmd>archive-push</cmd>.</p>
<p>An option warning in the async process was logged to a closed stdout, which made the process abort. Since the async role can now have different valid options than the default role, this happened more often. Option warnings are now logged only for the default role.</p>
</release-item>
<release-item>
@@ -25,6 +27,8 @@
</release-item-contributor-list>
<p>Fix memory leak in backup during archive copy.</p>
<p>Copying WAL into the backup with <br-option>archive-copy</br-option> leaked memory, especially when the WAL needed to be recompressed.</p>
</release-item>
<release-item>
@@ -38,6 +42,8 @@
</release-item-contributor-list>
<p>Fix stack overflow in cipher passphrase generation.</p>
<p>The buffer for the generated passphrase had no room for the terminating zero. This was found on arm64 with musl libc.</p>
</release-item>
<release-item>
@@ -51,6 +57,8 @@
</release-item-contributor-list>
<p>Fix <cmd>repo-ls</cmd> <id>/</id> on <proper>S3</proper> repositories.</p>
<p><proper>S3</proper> reports <id>/</id> as a file without the expected headers, which caused an error. <id>/</id> is now reported as not existing on storage that does not support paths.</p>
</release-item>
</release-bug-list>
@@ -99,20 +107,36 @@
</release-item-contributor-list>
<p>Multiple repository support.</p>
<p>Up to four repositories may be configured, e.g. a local repository for fast restores and a remote repository for redundancy. <cmd>archive-push</cmd> pushes WAL to all repositories, and backups are scheduled for each repository. Some commands work with all repositories, while others require <br-option>repo</br-option>. <br-option>repo</br-option> is not required when only <id>repo1</id> is configured.</p>
</release-item>
<release-item>
<github-issue id="631"/>
<github-issue id="743"/>
<github-pull-request id="1320"/>
<commit subject="Decode JSON \u escaped characters."/>
<commit subject="Rename uri to path where appropriate in HTTP and storage modules."/>
<commit subject="Encode path before passing to HttpRequest."/>
<commit subject="Add strNewEncode(), strCatEncode(), and bufNewDecode()."/>
<commit subject="Combine encode module files into a single file."/>
<commit subject="Use switch rather than if-else for encoding types."/>
<commit subject="Do not expose valid/validate functions from encode module."/>
<commit subject="Add ASSERT_MSG()."/>
<commit subject="Add base64url encoding."/>
<commit subject="Make remote storage objects writeable."/>
<commit subject="GCS support for repository storage.">
<github-issue id="631"/>
<github-issue id="743"/>
<github-pull-request id="1320"/>
</commit>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="cynthia.shang"/>
<!-- Actually tester, but we don't have a tag for that yet -->
<release-item-reviewer id="daniel.farina"/>
<release-item-tester id="daniel.farina"/>
</release-item-contributor-list>
<p>GCS support for repository storage.</p>
<p>Set <br-option>repo-type=gcs</br-option> to store the repository on <proper>GCS</proper> or a <proper>GCS</proper>-compatible object store.</p>
</release-item>
<release-item>
@@ -126,6 +150,8 @@
</release-item-contributor-list>
<p>Add <br-option>archive-header-check</br-option> option.</p>
<p>The WAL header is checked against the <postgres/> version and system identifier to make sure WAL is pushed to the correct stanza. The check is enabled by default and can be disabled when needed, e.g. for encrypted WAL.</p>
</release-item>
</release-feature-list>
@@ -140,6 +166,8 @@
</release-item-contributor-list>
<p>Include recreated system databases during selective restore.</p>
<p>A system database (<id>template0</id>, <id>template1</id>, or <id>postgres</id>) that was recreated has an OID that makes it look like a user database. These databases are now always restored, whatever their OID.</p>
</release-item>
<release-item>
@@ -153,22 +181,30 @@
</release-item-contributor-list>
<p>Exclude <id>content-length</id> from <proper>S3</proper> signed headers.</p>
<p>Some proxies modify the <id>content-length</id> header, which made authentication fail when it was signed.</p>
</release-item>
<release-item>
<github-pull-request id="1321"/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="cynthia.shang"/>
</release-item-contributor-list>
<p>Consolidate less commonly used repository storage options.</p>
<p>The <proper>S3</proper> and <proper>Azure</proper> CA, host, port, and TLS verification options are renamed to <br-option>repo-storage-*</br-option>, e.g. <br-option>repo1-s3-host</br-option> is now <br-option>repo1-storage-host</br-option>. The old names are still accepted.</p>
</release-item>
<release-item>
<github-issue id="1251"/>
<github-issue id="1293"/>
<github-pull-request id="1255"/>
<commit subject="Set config path in configure script."/>
<commit subject="Allow custom config-path default with ./configure --with-configdir.">
<github-issue id="1251"/>
<github-issue id="1293"/>
<github-pull-request id="1255"/>
</commit>
<release-item-contributor-list>
<release-item-contributor id="michael.schout"/>
@@ -176,6 +212,8 @@
</release-item-contributor-list>
<p>Allow custom <setting>config-path</setting> default with <id>./configure --with-configdir</id>.</p>
<p>Packagers can set a different default for <setting>config-path</setting> when building. Without the option the default is still <file>/etc/pgbackrest</file>.</p>
</release-item>
<release-item>
@@ -197,6 +235,7 @@
<github-pull-request id="1332"/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="cynthia.shang"/>
</release-item-contributor-list>
@@ -207,11 +246,86 @@
<github-pull-request id="1318"/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="cynthia.shang"/>
</release-item-contributor-list>
<p>Add <code>HttpUrl</code> object.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Move configuration definition to <file>src/build/config/config.yaml</file>.</p>
</release-item>
<release-item>
<commit subject="Remove unused header files in S3 and Azure storage modules."/>
<commit subject="Make S3/Azure file missing error messages match Posix."/>
<commit subject="Add storageInfoLevelType."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve storage drivers.</p>
</release-item>
<release-item>
<commit subject="Better exclusions for configure help."/>
<commit subject="Remove autoconf cache when configure is built."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve the configure script.</p>
</release-item>
<release-item>
<commit subject="Update to help.auto.c missed in d1aa765a."/>
<commit subject="Update to help.auto.c missed in 9506ffae and 92d12ccb."/>
<commit subject="Update to help.auto.c missed in 75987621."/>
<commit subject="Update to help.auto.c missed in d372dd652c9."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update help.auto.c missed in prior commits.</p>
</release-item>
<release-item>
<commit subject="Add missing linefeeds."/>
<commit subject="Use list to search for WAL segments to preserve in queueNeed()."/>
<commit subject="Add missing linefeed."/>
<commit subject="Suppress implicit-fallthrough warning."/>
<commit subject="Fix comments."/>
<commit subject="Add missing assert."/>
<commit subject="Print module type (e.g. c or h) in stack trace."/>
<commit subject="Remove extra spaces before macro continuation."/>
<commit subject="Pass cipher type directly to backupFileProtocol()."/>
<commit subject="Fix comment typo."/>
<commit subject="Changed unnecessary strNewFmt() to strNew()."/>
<commit subject="Fix comment type and phrasing."/>
<commit subject="Do not lower-case help summaries when first word is an acronym."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Clean up code and comments.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update config.guess and config.sub to latest versions.</p>
</release-item>
</release-development-list>
</release-core-list>
@@ -226,6 +340,8 @@
</release-item-contributor-list>
<p>Update reference to include links to user guide examples.</p>
<p>The command reference now links to the user guide sections with examples, and some descriptions were clarified, e.g. <br-option>set</br-option> for <cmd>expire</cmd>.</p>
</release-item>
<release-item>
@@ -239,6 +355,8 @@
</release-item-contributor-list>
<p>Update selective restore documentation with caveats.</p>
<p>Recovery may fail unless <br-option>type=immediate</br-option> is specified, because <postgres/> reports zeroed pages as errors after consistency is reached. On <postgres/> &gt;= 13 <pg-setting>ignore_invalid_pages</pg-setting> may be used, but check the logs for invalid pages in the selected databases.</p>
</release-item>
<release-item>
@@ -252,6 +370,8 @@
</release-item-contributor-list>
<p>Add <setting>compress-type</setting> clarification to <setting>archive-copy</setting> documentation.</p>
<p>WAL must be recompressed when <cmd>archive-push</cmd> and <cmd>backup</cmd> use a different <br-option>compress-type</br-option>, which can be expensive.</p>
</release-item>
<release-item>
@@ -264,6 +384,8 @@
</release-item-contributor-list>
<p>Add <setting>compress-level</setting> defaults per <setting>compress-type</setting> value.</p>
<p>The defaults are 9 for <id>bz2</id>, 6 for <id>gz</id>, 1 for <id>lz4</id>, and 3 for <id>zst</id>.</p>
</release-item>
<release-item>
@@ -278,5 +400,56 @@
<p>Add note about required <proper>NFS</proper> settings being the same as <postgres/>.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<commit subject="Fix option validity by role and make sections conform to C help."/>
<commit subject="Update to help.auto.c missed in e7bbdf38."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Fix option validity by role and make sections conform to C help.</p>
</release-item>
<release-item>
<commit subject="Use latex sloppypar to fix monospace wrapping in PDF rendering."/>
<commit subject="Fix .gitignore in doc directory."/>
<commit subject="Combine multi-repo release notes."/>
<commit subject="Link Github issues/PRs to release notes."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve the documentation build and release notes.</p>
</release-item>
</release-development-list>
</release-doc-list>
<release-test-list>
<release-development-list>
<release-item>
<commit subject="Ensure test user has permissions before removing test files."/>
<commit subject="Fix tests that ensure log levels are not set for local/remote roles."/>
<commit subject="Silence chmod warning of empty path when removing unit test data."/>
<commit subject="Reduce default file log level for integration tests."/>
<commit subject="Rename FUNCTION_HARNESS_RESULT*() macros to FUNCTION_HARNESS_RETURN*()."/>
<commit subject="Add backup delta unit test."/>
<commit subject="Add HRN_STORAGE_TIME() harness macro."/>
<commit subject="Explicitly free local processes after restore error unit test."/>
<commit subject="Add back performance tests lost during Github Actions switch."/>
<commit subject="Allow key replacements in TEST_ERROR*() macros."/>
<commit subject="Add --gen-check option to test.pl to check autogenerated code."/>
<commit subject="Fix extraneous hrnReplaceKey() calls in unit tests."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve unit tests and test tools.</p>
</release-item>
</release-development-list>
</release-test-list>
</release>

View File

@@ -10,11 +10,12 @@
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="cynthia.shang"/>
<release-item-reviewer id="stefan.fercot"/>
<!-- Actually tester, but we don't have a tag for that yet -->
<release-item-reviewer id="floris.van.nee"/>
<release-item-tester id="floris.van.nee"/>
</release-item-contributor-list>
<p>Fix issues with leftover spool files from a prior <cmd>restore</cmd>.</p>
<p>A notification left in the spool path by a prior restore could make <cmd>archive-get</cmd> report a WAL segment as missing. When this notification is found on the first check, it is now removed and the async process is run again. An error is reported when the async process does not respond, rather than reporting the WAL segment as missing.</p>
</release-item>
<release-item>
@@ -25,11 +26,12 @@
<release-item-ideator id="avinash.vallarapu"/>
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="cynthia.shang"/>
<!-- Actually tester, but we don't have a tag for that yet -->
<release-item-reviewer id="avinash.vallarapu"/>
<release-item-tester id="avinash.vallarapu"/>
</release-item-contributor-list>
<p>Fix issue when checking links for large numbers of tablespaces.</p>
<p>The link check used a lot of memory with many tablespaces and could crash. The new check is much faster, uses far less memory, and also detects duplicate file links.</p>
</release-item>
<release-item>
@@ -43,6 +45,8 @@
</release-item-contributor-list>
<p>Free no longer needed remotes so they do not timeout during <cmd>restore</cmd>.</p>
<p>The connections to remotes were held for the whole restore and could time out, which logged a harmless but distracting warning at the end of a long restore. They are now closed after the manifest is loaded.</p>
</release-item>
<release-item>
@@ -50,10 +54,13 @@
<release-item-contributor-list>
<release-item-ideator id="cynthia.shang"/>
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="stefan.fercot"/>
</release-item-contributor-list>
<p>Fix <cmd>help</cmd> when a valid option is invalid for the specified command.</p>
<p><cmd>help</cmd> segfaulted when asked about an option that is not valid for the command.</p>
</release-item>
</release-bug-list>
@@ -67,6 +74,8 @@
</release-item-contributor-list>
<p>Add <proper>PostgreSQL 14</proper> support.</p>
<p><postgres/> 14 needs no code changes from <postgres/> 13. The catalog version may now change during the <postgres/> beta/rc period without requiring a new <backrest/> release.</p>
</release-item>
<release-item>
@@ -79,11 +88,12 @@
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="jan.wieck"/>
<!-- Actually tester, but we don't have a tag for that yet -->
<release-item-reviewer id="daniel.farina"/>
<release-item-tester id="daniel.farina"/>
</release-item-contributor-list>
<p>Add automatic <proper>GCS</proper> authentication for <proper>GCE</proper> instances.</p>
<p>Set <br-option>repo-gcs-key-type=auto</br-option> to get the authentication token from the instance metadata on a <proper>GCE</proper> instance.</p>
</release-item>
<release-item>
@@ -96,6 +106,8 @@
</release-item-contributor-list>
<p>Add <br-option>repo-retention-history</br-option> option to expire backup history.</p>
<p>Set the number of days of backup history to keep. By default all history is kept, and history for backups still in the repository is never expired. When a full backup manifest expires, the manifests of its differential and incremental backups expire as well.</p>
</release-item>
<release-item>
@@ -108,6 +120,8 @@
</release-item-contributor-list>
<p>Add <br-option>db-exclude</br-option> option.</p>
<p>Restore excludes the specified databases by writing them as sparse, zeroed files. <postgres/> can still perform recovery, and the databases can be dropped after recovery. With <br-option>db-include</br-option>, <br-option>db-exclude</br-option> applies only to the system databases <id>template0</id>, <id>template1</id>, and <id>postgres</id>.</p>
</release-item>
</release-feature-list>
@@ -134,10 +148,12 @@
</release-item-contributor-list>
<p>Remove stanza archive spool path on <cmd>restore</cmd>.</p>
<p>Files in the spool path could interfere with the new cluster, e.g. old <cmd>archive-push</cmd> acknowledgements could make it skip archiving WAL.</p>
</release-item>
<release-item>
<github-issue id="1373"/>
<github-pull-request id="1373"/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
@@ -147,6 +163,8 @@
</release-item-contributor-list>
<p>Do not write files atomically or sync paths during <cmd>backup</cmd> copy.</p>
<p>Atomic writes are not needed since checksums are validated when a failed backup is resumed, and all paths are synced at the end of the backup.</p>
</release-item>
</release-improvement-list>
@@ -206,6 +224,7 @@
</commit>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="cynthia.shang"/>
</release-item-contributor-list>
@@ -222,8 +241,13 @@
<commit subject="Add local process shim to archive-get/archive-push unit tests."/>
<commit subject="Set buffer-size in the configuration test harness."/>
<commit subject="Factor remote process exec out of protocolRemoteGet()."/>
<commit subject="Add remote process shim."/>
<commit subject="Refactor storage/remote unit test using the protocol remote shim."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add local process shim.</p>
</release-item>
@@ -231,6 +255,7 @@
<github-pull-request id="1381"/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="cynthia.shang"/>
</release-item-contributor-list>
@@ -238,6 +263,8 @@
</release-item>
<release-item>
<commit subject="Revert ignoring catalog version when identifying a PostgreSQL version."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="cynthia.shang"/>
@@ -265,6 +292,70 @@
<p>Simplify defaults for <br-option>--force</br-option> option.</p>
</release-item>
<release-item>
<commit subject="Refactor List, StringList, and VariantList for performance."/>
<commit subject="Refactor storage modules with inline getters/setters."/>
<commit subject="Replace OBJECT_DEFINE_GET() with *Pub struct pattern."/>
<commit subject="Replace OBJECT_DEFINE_FREE_RESOURCE_BEGIN() with normal functions."/>
<commit subject="Replace OBJECT_DEFINE_MOVE() and OBJECT_DEFINE_FREE() with inlines."/>
<commit subject="Refactor protocol modules with inline getters/setters."/>
<commit subject="Refactor info modules with inline getters/setters."/>
<commit subject="Refactor db module with inline getters/setters."/>
<commit subject="Refactor common/exec module with inline getters/setters."/>
<commit subject="Remove unused XML constructors."/>
<commit subject="Refactor common/type/xml module with inline getters/setters."/>
<commit subject="Refactor common/type/keyValue module with inline getters/setters."/>
<commit subject="Refactor common/io/filter module with inline getters/setters."/>
<commit subject="Refactor remaining common/io modules with inline getters/setters."/>
<commit subject="Add THIS_PUB() macro to simplify inline object accessors."/>
<commit subject="Add storageDriver() inlines missed in b715c70b."/>
<commit subject="Add const to inline functions where appropriate."/>
<commit subject="Refactor String, Buffer, and Variant types with inline getters."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Refactor modules with inline getters/setters.</p>
</release-item>
<release-item>
<commit subject="Add const keyword to module scope constants."/>
<commit subject="Define DEBUG in build.auto.c."/>
<commit subject="Remove lockClear()."/>
<commit subject="Fix indentation."/>
<commit subject="Use option constants in warnings."/>
<commit subject="Remove auto-generated option String constants."/>
<commit subject="Remove redundant CompressType conversions."/>
<commit subject="Replace misused kvAdd() with kvPut()."/>
<commit subject="Remove documentation about enum truncation and add tests."/>
<commit subject="Preserve unused YAML fix for older Debian/Ubuntu distributions."/>
<commit subject="Fix comments where &#x27;output&#x27; was misspelled as &#x27;ouput&#x27;."/>
<commit subject="Fix an ungrammatical error message in config parsing."/>
<commit subject="Remove overzealous cast."/>
<commit subject="Move includes after typedef in info/manifest.h."/>
<commit subject="Fix typo in struct typedef."/>
<commit subject="Add missing header."/>
<commit subject="Update negate to indicate that it should not be used for new options."/>
<commit subject="Rename strNew() to strNewZ() and add parameter-less strNew()."/>
<commit subject="Add missing parameter log debug."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-contributor id="cynthia.shang"/>
</release-item-contributor-list>
<p>Clean up code and comments.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update config.sub to latest version.</p>
</release-item>
</release-development-list>
</release-core-list>
@@ -280,6 +371,8 @@
</release-item-contributor-list>
<p>Update contributing documentation.</p>
<p>The contributing guide has more examples of how to write code, add configuration options, and test.</p>
</release-item>
<release-item>
@@ -291,6 +384,8 @@
</release-item-contributor-list>
<p>Consolidate <proper>RHEL</proper>/<proper>CentOS</proper> user guide into a single document.</p>
<p>The second guide existed mainly to document <br-option>stop-auto</br-option> for <postgres/> &lt;= 9.5, which is now EOL. The option is still documented in the reference.</p>
</release-item>
<release-item>
@@ -304,5 +399,81 @@
<p>Clarify that <br-option>repo-s3-role</br-option> is not an <id>ARN</id>.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<commit subject="Add new instructions for PostgreSQL news and include a sample."/>
<commit subject="Change CentOS 7 documentation test to CentOS 8."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update the user guide and release documentation.</p>
</release-item>
</release-development-list>
</release-doc-list>
<release-test-list>
<release-development-list>
<release-item>
<commit subject="Move PostgreSQL version interface test functions to a test harness."/>
<commit subject="Add recursion to TEST_STORAGE_LIST() macro."/>
<commit subject="Add defines for many test*() getter functions."/>
<commit subject="Remove comment formatting from TEST_*() macros."/>
<commit subject="Replace TEST_ERROR_FMT() with TEST_ERROR() where possible."/>
<commit subject="Replace hrnLogResult() with TEST_RESULT_LOG/_FMT()."/>
<commit subject="Rename TEST_SYSTEM*() to HRN_SYSTEM*()."/>
<commit subject="Replace system() in tests with HRN_SYSTEM*()."/>
<commit subject="Remove unused padding parameter from hrnTestLogPrefix()."/>
<commit subject="Remove line parameter from hrnTestResultBegin()."/>
<commit subject="Use L to denote line numbers in test output."/>
<commit subject="Improve storage harness/test macros."/>
<commit subject="Add HRN_STORAGE_PATH_CREATE() macro."/>
<commit subject="Replace harnessCfgLoad*() functions with HRN_CFG_LOAD() macro."/>
<commit subject="Add HRN_STORAGE_PATH_REMOVE() macro."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-contributor id="cynthia.shang"/>
</release-item-contributor-list>
<p>Improve test harness macros.</p>
</release-item>
<release-item>
<commit subject="Update to remove files after archive-get test completes."/>
<commit subject="Fix incorrect test title."/>
<commit subject="Exclude Dockerfile from code count."/>
<commit subject="Add instructions to install lcov for MacOS."/>
<commit subject="Remove default VM for test.pl --coverage-only option."/>
<commit subject="Fix invalid type in test function."/>
<commit subject="Minor fixes for command/archive-get unit test."/>
<commit subject="Move protocol test module before config module."/>
<commit subject="Show diff when test.pl --gen-check detects unexpected autogeneration."/>
<commit subject="Replace storageTest with storagePg*() in command/archive-get test."/>
<commit subject="Add storage/remote test for unknown user/group name."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve unit tests and test tools.</p>
</release-item>
<release-item>
<commit subject="Add Ubuntu 20.04 test VM definition."/>
<commit subject="Add bash to Cirrus CI FreeBSD package install."/>
<commit subject="Update Cirrus CI FreeBSD release to 12.2."/>
<commit subject="Test pull requests in Cirrus CI."/>
<commit subject="Basic multi-architecture support for test containers."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>CI updates.</p>
</release-item>
</release-development-list>
</release-test-list>
</release>

View File

@@ -21,11 +21,12 @@
<release-item-ideator id="anderson.a.mallmann"/>
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="cynthia.shang"/>
<!-- Actually tester, but we don't have a tag for that yet -->
<release-item-reviewer id="marco.montagna"/>
<release-item-tester id="marco.montagna"/>
</release-item-contributor-list>
<p>Detect errors in <proper>S3</proper> multi-part upload finalize.</p>
<p>Completing a multi-part upload can fail even when <proper>S3</proper> returns HTTP success. A response without an <id>ETag</id> is now treated as a failure, and the job is retried.</p>
</release-item>
<release-item>
@@ -39,10 +40,12 @@
</release-item-contributor-list>
<p>Fix detection of circular symlinks.</p>
<p>Links were followed before they were checked, and a circular link sent the manifest build into endless recursion and a crash.</p>
</release-item>
<release-item>
<github-issue id="1480"/>
<github-pull-request id="1480"/>
<release-item-contributor-list>
<release-item-ideator id="greg.sabino.mullane"/>
@@ -53,6 +56,8 @@
</release-item-contributor-list>
<p>Only pass selected <setting>repo</setting> options to the remote.</p>
<p>Options for other repositories could cause conflicts on the remote, which uses exactly one repository.</p>
</release-item>
</release-bug-list>
@@ -71,6 +76,8 @@
</release-item-contributor-list>
<p>Binary protocol.</p>
<p>Local and remote processes now communicate with the binary pack format rather than JSON. Packs are more compact, faster to render and parse, and strictly typed. Each message is written in one place, which makes an error less likely to leave the protocol in a bad state, and messages have no size limit.</p>
</release-item>
<release-item>
@@ -84,11 +91,13 @@
</release-item-contributor-list>
<p>Automatically create data directory on <cmd>restore</cmd>.</p>
<p>A check migrated from Perl prevented restore from creating the data directory.</p>
</release-item>
<release-item>
<github-issue id="1462"/>
<github-pull-request id="1339"/>
<github-issue id="1339"/>
<github-pull-request id="1462"/>
<release-item-contributor-list>
<release-item-ideator id="james.coleman"/>
@@ -97,6 +106,8 @@
</release-item-contributor-list>
<p>Allow <cmd>restore</cmd> <setting>--type=lsn</setting>.</p>
<p>Set <br-option>type=lsn</br-option> and an LSN in <br-option>target</br-option> to recover to an LSN on <postgres/> &gt;= 10.</p>
</release-item>
<release-item>
@@ -110,11 +121,13 @@
</release-item-contributor-list>
<p>Change level of <cmd>backup</cmd>/<cmd>restore</cmd> copied file logging to detail.</p>
<p>This makes the <id>info</id> log level less noisy. Set the log level to <id>detail</id> to see each copied file.</p>
</release-item>
<release-item>
<github-issue id="1460"/>
<github-pull-request id="1450"/>
<github-issue id="1450"/>
<github-pull-request id="1460"/>
<release-item-contributor-list>
<release-item-ideator id="fatih.mencutekin"/>
@@ -123,6 +136,8 @@
</release-item-contributor-list>
<p>Loop while waiting for checkpoint LSN to reach replay LSN.</p>
<p>On a standby the checkpoint LSN can lag slightly behind the replay LSN until <file>pg_control</file> is updated. The backup now keeps checking rather than failing.</p>
</release-item>
<release-item>
@@ -134,12 +149,18 @@
</release-item-contributor-list>
<p>Log <cmd>backup</cmd> file total and <cmd>restore</cmd> size/file total.</p>
<p>The backup size is now logged at the end of the backup and includes files added to the manifest after the main copy, e.g. <file>backup_label</file> and WAL. Restore now logs its size and file total.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<github-pull-request id="1421"/>
<commit subject="Add support for more Pack types.">
<github-pull-request id="1421"/>
</commit>
<commit subject="Add mode, Pack, and StringId to the Pack type."/>
<commit subject="Add pckReadMove() and pckWriteMove()."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
@@ -159,6 +180,102 @@
<p>Clear error when a <code>CATCH()</code> block finishes.</p>
</release-item>
<release-item>
<commit subject="Remove parse.auto.h."/>
<commit subject="Remove unused command string constants."/>
<commit subject="Partial migration of config code generation to C."/>
<commit subject="Update order of configuration options."/>
<commit subject="Use consistent separator comment spacing in parse.auto.c."/>
<commit subject="Automatically generate option value StringIds in make build-config."/>
<commit subject="Updates to build/config/config.yaml."/>
<commit subject="Complete migration of config code generation to C."/>
<commit subject="Remove generated config.auto.c file."/>
<commit subject="Remove code made obsolete by f3f0c64a."/>
<commit subject="Remove unused struct member noted in f3f0c64a."/>
<commit subject="Add line and column to build yaml error messages."/>
<commit subject="Update error.yaml comment to remove Perl reference."/>
<commit subject="Migrate error code generation to C."/>
<commit subject="Move bldStrId() into a C file."/>
<commit subject="Improve comments."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Migrate config and error code generation to C.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Fix miscalculation in time option command defaults.</p>
</release-item>
<release-item>
<release-note version="2.37" subject="Add TLS server."/>
<commit subject="Refactor cmdLocal()/cmdRemote() to accept a ProtocolServer object."/>
<commit subject="Move noop from protocolClientNew() to local/remote initialization."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Refactor local/remote startup.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Fix infinite loop in <code>protocolServerProcess()</code> on error.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add temp mem context reset blocks in job processing loops.</p>
</release-item>
<release-item>
<commit subject="Handle NULL VariantList in JSON."/>
<commit subject="Rename param structs to match function names."/>
<commit subject="Fix comments."/>
<commit subject="Skip sleep in sleepMSec() when sleep time is zero."/>
<commit subject="Make pgControlFromBuffer() static."/>
<commit subject="Add ioFdReadNewOpen() and ioFdWriteNewOpen()."/>
<commit id="f70ddc16d" subject="Fix typo."/>
<commit subject="Add lstComparatorZ()."/>
<commit id="07f0a5901" subject="Fix typo."/>
<commit subject="Protect against mixed FUNCTION_TEST* and FUNCTION_LOG* macros."/>
<commit subject="Remove dead loop in verifyArchive()."/>
<commit subject="Fix EOF behavior of ioReadSmall() to match ioRead()."/>
<commit subject="Change ASSERT() to CHECK() in infoLoad()."/>
<commit subject="Mark contextTop static."/>
<commit subject="Rename stringz.h to stringZ.h."/>
<commit subject="Rearrange MemContext struct members to save space on 64-bit."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-contributor id="cynthia.shang"/>
<release-item-contributor id="stefan.fercot"/>
</release-item-contributor-list>
<p>Clean up code and comments.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update config.guess and config.sub to latest versions.</p>
</release-item>
</release-development-list>
</release-core-list>
@@ -174,6 +291,8 @@
</release-item-contributor-list>
<p>Fix incorrect host names in user guide.</p>
<p>Some examples showed <id>pg1</id> rather than the host name, and the install block installed packages on the build host no matter which host was specified.</p>
</release-item>
</release-bug-list>
@@ -192,6 +311,8 @@
</release-item-contributor-list>
<p>Update contributing documentation and add pull request template.</p>
<p>The contributing guide now has a table of contents and sections on understanding test output and submitting a pull request. GitHub now shows a template for new pull requests.</p>
</release-item>
<release-item>
@@ -203,6 +324,8 @@
</release-item-contributor-list>
<p>Rearrange backup documentation in user guide.</p>
<p>The <quote>Fast Start Option</quote> and <quote>Archive Timeout</quote> sections moved to <quote>Quick Start - Perform Backup</quote>. The <quote>Automatic Stop Option</quote> section, which applies only to <postgres/> &lt;= 9.6, was removed.</p>
</release-item>
<release-item>
@@ -212,6 +335,8 @@
</release-item-contributor-list>
<p>Clarify <cmd>restore</cmd> <br-option>--type</br-option> behavior in command reference.</p>
<p>The reference now states that <br-option>set</br-option> must be specified when the target is before the latest backup and <br-option>type</br-option> is not <id>time</id>.</p>
</release-item>
<release-item>
@@ -225,6 +350,29 @@
<p>Fix documentation and comment typos.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<commit subject="Add optional stress test section to the user guide."/>
<commit subject="Add variables for build paths in the user guide."/>
<commit subject="Reduce memory requirements of stress test section in the user guide."/>
<commit subject="Add instructions for dev builds to stress test in user guide."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add optional stress test section to the user guide.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add linefeeds around content even when not in pretty mode.</p>
</release-item>
</release-development-list>
</release-doc-list>
<release-test-list>
@@ -240,6 +388,8 @@
</release-item-contributor-list>
<p>Add check for test path inside repo path.</p>
<p>A test path inside the repository path caused strange failures because the repository is copied into the test path. <file>test.pl</file> now errors in this case.</p>
</release-item>
<release-item>
@@ -251,6 +401,8 @@
</release-item-contributor-list>
<p>Add CodeQL static code analysis.</p>
<p>CodeQL now runs in CI. Issues it found were fixed, e.g. <code>gmtime()</code>/<code>localtime()</code> were replaced with <code>gmtime_r()</code>/<code>localtime_r()</code>.</p>
</release-item>
<release-item>
@@ -328,5 +480,73 @@
<p>Update tests to use standard patterns.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<commit subject="Add optional remove to TEST_STORAGE_EXISTS()."/>
<commit subject="Add HRN_STORAGE_MOVE() macro."/>
<commit subject="Add error test harness/shim."/>
<commit subject="Add mode parameter to HRN_STORAGE_PUT() macro."/>
<commit subject="Add HRN_STORAGE_COPY() macro."/>
<commit subject="Add expression parameter to TEST_STORAGE_LIST() macro."/>
<commit subject="Remove TEST_PATH_REPO, TEST_PATH_PG, and TEST_PATH_SPOOL constants."/>
<commit subject="Allow NULL path in HRN_STORAGE_MODE() macro."/>
<commit subject="Add compressType parameter to TEST_STORAGE_GET() macro."/>
<commit subject="Error in TEST_STORAGE_LIST() when path does not exist."/>
<commit subject="Rename HARNESS_FORK*() macros to HRN_FORK*()."/>
<commit subject="Improve HRN_FORK*() macros."/>
<commit subject="Automatically create IoRead/IoWrite interfaces in HRN_FORK*() macros."/>
<commit subject="Add noParentCreate parameter to HRN_STORAGE_PATH_CREATE() macro."/>
<commit subject="Allow NULL path in HRN_STORAGE_PATH_CREATE() macro."/>
<commit subject="Allow NULL path in TEST_STORAGE_LIST() macro."/>
<commit subject="Allow NULL path in HRN_STORAGE_PATH_REMOVE() macro."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-contributor id="cynthia.shang"/>
</release-item-contributor-list>
<p>Improve test harness macros.</p>
</release-item>
<release-item>
<commit subject="Switch order of remote startup in storage/remote test."/>
<commit subject="Use lower-case names from Azure identifiers in integration tests."/>
<commit subject="Update pg-path options in db test module to be valid."/>
<commit subject="Ignore mismatched close requests in the pq shim during error processing."/>
<commit subject="Improve error handling in db test module."/>
<commit subject="Increase harness log level to detail in command/backup test."/>
<commit subject="Fix flapping coverage in storage/remote test."/>
<commit subject="Remove last vestiges of key replacement missed in b270253a."/>
<commit subject="Remove test.pl --vm-host option."/>
<commit subject="Remove test.pl --smart, --dev, and --dev-test options."/>
<commit id="eb98b8d2d" subject="Fix typo."/>
<commit subject="Update db test module error for newer libpq versions."/>
<commit subject="Clean src path in test.pl before attempting vpath builds."/>
<commit subject="Increase timeouts in storage/remote test."/>
<commit subject="Fix rsync include list removed from test.pl in 9ee9b1fa."/>
<commit subject="Fix test added for lstComparatorZ() in 9abf6a27."/>
<commit subject="Cleanup inherited clients in protocol test harness."/>
<commit subject="Add additional checks to performance/storage test."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve unit tests and test tools.</p>
</release-item>
<release-item>
<commit subject="Update test container OS versions."/>
<commit subject="Update Vagrantfile box version."/>
<commit subject="Update containers for new PostgreSQL releases."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>CI updates.</p>
</release-item>
</release-development-list>
</release-test-list>
</release>

View File

@@ -12,6 +12,8 @@
</release-item-contributor-list>
<p>Allow <quote>global</quote> as a stanza prefix.</p>
<p>A stanza name that begins with <id>global</id>, e.g. <id>global_stanza</id>, was rejected because the config parser treated it as a global section.</p>
</release-item>
<release-item>
@@ -24,6 +26,8 @@
</release-item-contributor-list>
<p>Fix segfault on invalid <proper>GCS</proper> key file.</p>
<p>A <proper>GCS</proper> key file without the client email, private key, or token URI caused a segfault. It now causes an error.</p>
</release-item>
</release-bug-list>
@@ -45,6 +49,8 @@
</release-item-contributor-list>
<p>Allow <br-option>link-map</br-option> option to create new links.</p>
<p><br-option>link-map</br-option> could only remap links that were in the backup. It can now create a new link for any path or file in the backup.</p>
</release-item>
<release-item>
@@ -59,9 +65,12 @@
</release-item-contributor-list>
<p>Increase max index allowed for <id>pg</id>/<id>repo</id> options to 256.</p>
<p>The maximum index was 8 for <id>pg</id> options and 4 for <id>repo</id> options. Both are now 256, e.g. <br-option>pg256-path</br-option>.</p>
</release-item>
<release-item>
<commit subject="Refactor S3 storage driver for additional auth methods."/>
<commit subject="Add WebIdentity authentication for AWS S3.">
<github-issue id="1203"/>
<github-pull-request id="1527"/>
@@ -72,12 +81,23 @@
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="james.callahan"/>
<release-item-reviewer id="reid.thompson"/>
<!-- Actually tester, but we don't have a tag for that yet -->
<release-item-reviewer id="benjamin.blattberg"/>
<release-item-reviewer id="andrew.lecuyer"/>
<release-item-tester id="benjamin.blattberg"/>
</release-item-contributor-list>
<p>Add <id>WebIdentity</id> authentication for <proper>AWS S3</proper>.</p>
<p>Set <br-option>repo-s3-key-type=web-id</br-option> to get credentials automatically in an <proper>EKS</proper> environment.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add <br-option>repo-azure-uri-style</br-option> option.</p>
<p>Set <br-option>repo-azure-uri-style</br-option> to <id>host</id> (default) or <id>path</id> to select the URI style for <proper>Azure</proper>. <proper>Azurite</proper> uses host-style URIs when the endpoint looks like a multipart host name.</p>
</release-item>
<release-item>
@@ -90,6 +110,8 @@
</release-item-contributor-list>
<p>Report backup file validation errors in <file>backup.info</file>.</p>
<p>Errors found during a backup, e.g. invalid page checksums, were shown only by <cmd>info</cmd> with <br-option>set</br-option>. A flag in <file>backup.info</file> now shows in text and JSON output that a backup has errors. The details still require <br-option>set</br-option>.</p>
</release-item>
<release-item>
@@ -104,6 +126,8 @@
</release-item-contributor-list>
<p>Add recovery start time to online backup restore log.</p>
<p>Restore now logs the time that recovery will start from, which shows how much WAL must be replayed.</p>
</release-item>
<release-item>
@@ -119,6 +143,8 @@
</release-item-contributor-list>
<p>Report original error and retries on local job failure.</p>
<p>When a local job fails after its retries, the error now reports the first error with its stack trace, followed by the retry errors. Before, only the last error was reported, which was often a cascade failure such as the protocol being out of sync.</p>
</release-item>
<release-item>
@@ -130,6 +156,8 @@
</release-item-contributor-list>
<p>Rename page checksum error to error list in info text output.</p>
<p>The label in <cmd>info</cmd> text output is now <quote>error list</quote> rather than <quote>page checksum error</quote>. A file may have an alignment error rather than a page checksum error.</p>
</release-item>
<release-item>
@@ -143,12 +171,15 @@
</release-item-contributor-list>
<p>Add hints to standby replay timeout message.</p>
<p>The timeout waiting for the standby to replay now has hints to check that replication is running and to disable <br-option>backup-standby</br-option> to back up from the primary.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<commit subject="Add TLS server.">
<release-note version="2.37" subject="Add TLS server."/>
<commit subject="Add TLS Server.">
<github-pull-request id="1504"/>
</commit>
<commit subject="Check return value of getsockopt()."/>
@@ -156,8 +187,7 @@
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="stephen.frost"/>
<!-- Actually tester, but we don't have a tag for that yet -->
<release-item-reviewer id="andrew.lecuyer"/>
<release-item-tester id="andrew.lecuyer"/>
</release-item-contributor-list>
<p>Add <proper>TLS</proper> server.</p>
@@ -173,10 +203,186 @@
<p>Store config values as a union instead of a variant.</p>
</release-item>
<release-item>
<commit subject="Migrate command-line help generation to C."/>
<commit subject="Add initializer braces required by older versions of gcc."/>
<commit subject="Skip comments when rendering help output."/>
<commit subject="Specify size for helpData array."/>
<commit subject="Minor fix for lower-casing of option summaries."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Migrate command-line help generation to C.</p>
</release-item>
<release-item>
<commit subject="Convert filter param/result to Pack type."/>
<commit subject="Rename pckReadNew()/pckWriteNew() to pckReadNewIo()/pckWriteNewIo()."/>
<commit subject="Add Pack pseudo-type."/>
<commit subject="Centralize and optimize tag stack management."/>
<commit subject="Convert page checksum filter result to a pack."/>
<commit subject="Add assert in pckReadNext() to prevent reading into a field."/>
<commit subject="Read tag size in pckReadTagNext()."/>
<commit subject="Add const buffer functions to Pack type."/>
<commit subject="Convert configuration optional rules to pack format."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve the Pack type and use it for filters and configuration rules.</p>
</release-item>
<release-item>
<commit subject="Invert required in set option to simplify generated rules."/>
<commit subject="Remove command overrides for output options."/>
<commit subject="Remove command overrides for restore-only options."/>
<commit subject="Remove allow range from pg-socket-path option."/>
<commit subject="Write command configuration overrides explicitly."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Simplify configuration rules.</p>
</release-item>
<release-item>
<commit subject="Add const to memContextFreeing()/memContextName() parameters."/>
<commit subject="Remove useless if in memContextFree()."/>
<commit subject="Remove useless memFree() in regExpNew()."/>
<commit subject="Use contextParentIdx instead of a loop when moving a context."/>
<commit subject="Allow additional memory to be allocated with a mem context."/>
<commit subject="Use temp mem context when calling command handlers."/>
<commit subject="Add missing asserts and move temp mem context block."/>
<commit subject="More efficient memory allocation for Strings and String Variants."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve memory allocation and mem context handling.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add configurable storage helpers to create repository storage.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>More efficient generation of diff/incr backup label.</p>
</release-item>
<release-item>
<commit subject="Set most compiler flags as late as possible in configure."/>
<commit subject="Add -Werror -Wfatal-errors -g flags to configure --enable-test."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add -Werror -Wfatal-errors -g flags to configure --enable-test.</p>
</release-item>
<release-item>
<github-pull-request id="1500"/>
<release-item-contributor-list>
<release-item-contributor id="john.terrell"/>
</release-item-contributor-list>
<p>Add required header for Illumos.</p>
</release-item>
<release-item>
<commit subject="Add missing header."/>
<commit subject="Remove invalid comment block."/>
<commit subject="Automatically include all PostgreSQL version interface files."/>
<commit subject="Copy data page before verifying checksum."/>
<commit subject="Fix comment typos."/>
<commit subject="Add note to comment for int64 typedef."/>
<commit subject="Sort WAL segment names when reporting duplicates."/>
<commit subject="Add state to ProtocolClient."/>
<commit subject="Rename strNewN() to strNewZN()."/>
<commit id="980b777a4" subject="Fix indentation."/>
<commit subject="Rename PostgreSQL pid file constants and tests."/>
<commit subject="Update comments referring to the PostgreSQL primary."/>
<commit id="4c2d89eb6" subject="Fix typos."/>
<commit id="b11ab9f79" subject="Fix typos."/>
<commit subject="Fix outdated comment."/>
<commit subject="Fix typos in error messages."/>
<commit subject="Use externed instead of extern&#x27;d in comments."/>
<commit subject="Add assertion for Coverity."/>
<commit subject="Add missing assert."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-contributor id="reid.thompson"/>
<release-item-contributor id="stefan.fercot"/>
</release-item-contributor-list>
<p>Clean up code and comments.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Finalize catalog number for PostgreSQL 14 release.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update config.guess and config.sub to latest versions.</p>
</release-item>
</release-development-list>
</release-core-list>
<release-doc-list>
<release-bug-list>
<release-item>
<github-pull-request id="1544"/>
<release-item-contributor-list>
<release-item-contributor id="reid.thompson"/>
</release-item-contributor-list>
<p>Fix incorrect host name in user guide.</p>
<p>The replication setup used the IP address of <host>pg-primary</host> in <file>pg_hba.conf</file> rather than the IP address of <host>pg-standby</host>.</p>
</release-item>
</release-bug-list>
<release-improvement-list>
<release-item>
<commit subject="Move archive-header-check option to the archive reference section."/>
<commit subject="Improve documentation for buffer-size option."/>
<commit subject="Improve documentation for cmd-ssh, repo-host-cmd, pg-host-cmd options."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve option documentation.</p>
<p>The help for <br-option>buffer-size</br-option> now describes all the operations that use it, the descriptions of <br-option>cmd-ssh</br-option>, <br-option>repo-host-cmd</br-option>, and <br-option>pg-host-cmd</br-option> are consistent, and <br-option>archive-header-check</br-option> moved to the archive section of the configuration reference.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<commit subject="Eliminate linefeed formatting from documentation."/>
@@ -193,6 +399,88 @@
<p>Eliminate linefeed formatting from documentation.</p>
</release-item>
<release-item>
<commit subject="Revert Azurite version for testing to 3.14.0."/>
<commit subject="Improve instructions for rebuilding pgbackrest during stress testing."/>
<commit subject="Do not show output of PostgreSQL upgrade status check in user guide."/>
<commit subject="Allow S3/Azure Docker images to be specified in user guide."/>
<commit id="a63e73298" subject="Fix indentation."/>
<commit subject="Adjustments for new breaking change in Azurite."/>
<commit subject="Use Rocky Linux for documentation builds instead of CentOS."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update the user guide and documentation build.</p>
</release-item>
<release-item>
<commit subject="Add analytics to the HTML documentation."/>
<commit subject="Make analytics optional for HTML documentation."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add analytics to the HTML documentation.</p>
</release-item>
<release-item>
<commit subject="Remove repository format 6 notes."/>
<commit subject="Update documentation/links to main branch."/>
<commit subject="Add GitHub repository link to index.html and README.md."/>
<commit subject="Move v1 documentation links out of the introduction."/>
<commit subject="Fix typo in contributing guide."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update the index page, README.md, and contributing documentation.</p>
</release-item>
</release-development-list>
</release-doc-list>
<release-test-list>
<release-development-list>
<release-item>
<commit subject="Do not use certs in container for testing."/>
<commit subject="Limit valgrind error output to the first error."/>
<commit subject="Update file mode in info/manifest test to 0600."/>
<commit subject="Use constant string for user/group in performance/type test."/>
<commit subject="Increase tolerance for 0ms sleep in common/time test."/>
<commit subject="Rename manifest file primary flag in tests."/>
<commit subject="Rename SSH connection control parameters in integration tests."/>
<commit subject="Add debug options to code generation make in test.pl."/>
<commit subject="Update RHEL package URL."/>
<commit subject="Allow error buffer to be resized for testing."/>
<commit subject="Add missing static keywords in test modules."/>
<commit subject="Increase some storage test timeouts."/>
<commit subject="Add coverage for empty CATCH() blocks."/>
<commit subject="Fix test descriptions in common/typeVariantTest."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve unit tests and test tools.</p>
</release-item>
<release-item>
<commit subject="Build newer valgrind and move CA cert install in test containers."/>
<commit subject="Add arm64 testing on Cirrus CI."/>
<commit subject="Add libc6-dbg required by updated valgrind to Vagrantfile/Dockerfile."/>
<commit subject="Update Vagrantfile to Ubuntu 20.04."/>
<commit subject="Update 32-bit test container to Debian 9."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>CI updates.</p>
</release-item>
</release-development-list>
</release-test-list>
</release>

View File

@@ -16,6 +16,8 @@
</release-item-contributor-list>
<p>Fix <cmd>restore</cmd> delta link mapping when path/file already exists.</p>
<p>When <br-option>link-map</br-option> or <br-option>link-all</br-option> mapped a path or file that already existed to a link, a delta restore left the existing path or file in place. It is now replaced by the link.</p>
</release-item>
<release-item>
@@ -29,6 +31,8 @@
</release-item-contributor-list>
<p>Fix socket leak on connection retries.</p>
<p>In optimized builds the socket of a failed connection attempt was not closed, and each retry leaked a socket.</p>
</release-item>
</release-bug-list>
@@ -46,11 +50,12 @@
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="stephen.frost"/>
<release-item-reviewer id="reid.thompson"/>
<!-- Actually tester, but we don't have a tag for that yet -->
<release-item-reviewer id="andrew.lecuyer"/>
<release-item-tester id="andrew.lecuyer"/>
</release-item-contributor-list>
<p>Add <proper>TLS</proper> server.</p>
<p>The <cmd>server</cmd> command starts a TLS server that can be used instead of SSH to reach repository and <postgres/> hosts. Set <br-option>repo-host-type=tls</br-option> or <br-option>pg-host-type=tls</br-option> on the client, and configure certificates and client authorization with the <br-option>tls-server-*</br-option> options. <id>SIGHUP</id> reloads the configuration and <id>SIGTERM</id> stops the server.</p>
</release-item>
<release-item>
@@ -65,6 +70,8 @@
</release-item-contributor-list>
<p>Add <br-option>--cmd</br-option> option.</p>
<p>Set <br-option>cmd</br-option> to the <backrest/> executable used in commands that <backrest/> writes, e.g. <id>restore_command</id> in <file>recovery.conf</file>.</p>
</release-item>
</release-feature-list>
@@ -80,6 +87,8 @@
</release-item-contributor-list>
<p>Check archive immediately after backup start.</p>
<p>A backup failed because WAL archiving was not working only after all files were copied. The archive is now checked right after the backup starts. On an idle system a restore point is created to switch the WAL segment.</p>
</release-item>
<release-item>
@@ -92,6 +101,8 @@
</release-item-contributor-list>
<p>Add timeline and checkpoint checks to backup.</p>
<p>The backup now checks that <file>pg_control</file> has the checkpoint and timeline of the backup start, and that a standby is following the primary, i.e. it is on the same timeline and its checkpoint is not later than the backup checkpoint.</p>
</release-item>
<release-item>
@@ -103,6 +114,8 @@
</release-item-contributor-list>
<p>Check that clusters are alive and correctly configured during a backup.</p>
<p>A backup now fails as soon as a cluster stops or the standby is promoted. Before, a stopped primary was detected only at the end of the backup and a promoted standby was not detected.</p>
</release-item>
<release-item>
@@ -117,6 +130,8 @@
</release-item-contributor-list>
<p>Error when <cmd>restore</cmd> is unable to find a backup to match the time target.</p>
<p>This was a warning that was easy to miss, and a lot of time could be lost restoring a backup that cannot reach the target.</p>
</release-item>
<release-item>
@@ -129,6 +144,8 @@
</release-item-contributor-list>
<p>Parse protocol/port in <proper>S3</proper>/<proper>Azure</proper> endpoints.</p>
<p><br-option>repo-s3-endpoint</br-option>, <br-option>repo-azure-endpoint</br-option>, and <br-option>repo-storage-host</br-option> may now include a protocol and port, e.g. <id>https://host:9000</id>.</p>
</release-item>
<release-item>
@@ -140,6 +157,8 @@
</release-item-contributor-list>
<p>Add warning when <pg-setting>checkpoint_timeout</pg-setting> exceeds <br-option>db-timeout</br-option>.</p>
<p>With <br-option>start-fast=n</br-option>, a backup can time out waiting for the checkpoint when <pg-setting>checkpoint_timeout</pg-setting> is greater than <br-option>db-timeout</br-option>. The backup now warns in this case.</p>
</release-item>
<release-item>
@@ -185,6 +204,8 @@
</release-item-contributor-list>
<p>Make backup size logging exactly match <cmd>info</cmd> command output.</p>
<p>The logged backup size now includes only the files copied, plus <file>backup_label</file> and <file>tablespace_map</file>. Before, e.g. an incremental backup after a switchover logged the size of every file checked.</p>
</release-item>
</release-improvement-list>
@@ -218,6 +239,53 @@
<p>Add <code>StringId</code> as an option type.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Do not delete manifests individually during stanza delete.</p>
</release-item>
<release-item>
<commit subject="Use ASSERT() or TEST_RESULT*() instead of CHECK() in test modules."/>
<commit subject="Ensure ASSERT() macro is always available in test modules."/>
<commit subject="Add error type and message to CHECK() macro."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add error type and message to CHECK() macro.</p>
</release-item>
<release-item>
<commit subject="Remove placeholder bz2 helper data."/>
<commit subject="Remove unused protocol log level."/>
<commit subject="Use void * instead of List * to avoid Coverity false positives."/>
<commit subject="Refactor switch statements in strIdBitFromZN()."/>
<commit subject="Optional parameters for tlsClientNew()."/>
<commit subject="Refactor postgres/client module with inline getters/setters."/>
<commit subject="Fix parameter test logging in parseOptionIdxValue()."/>
<commit subject="Add linefeed and remove space."/>
<commit subject="Add infoBackupLabelExists()."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-contributor id="reid.thompson"/>
</release-item-contributor-list>
<p>Clean up and refactor code.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update LICENSE.txt and PostgreSQL copyright for 2022.</p>
</release-item>
</release-development-list>
</release-core-list>
@@ -254,7 +322,52 @@
</release-item-contributor-list>
<p>Remove obsolete statement about future multi-repository support.</p>
<p>The documentation stated that only one repository was allowed, but multiple repositories have been supported since v2.33.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<commit subject="Add path to pgbench used for stress test in user guide."/>
<commit subject="Add findutils package to RHEL 8 documentation container."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update the user guide.</p>
</release-item>
<release-item>
<commit subject="Update automake version."/>
<commit subject="Add release note regarding IANA approval of the default TLS port."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update the release notes and RELEASE.md.</p>
</release-item>
</release-development-list>
</release-doc-list>
<release-test-list>
<release-development-list>
<release-item>
<commit subject="Revive archive performance test."/>
<commit subject="Add tablespace_map file to command/backup test module."/>
<commit subject="Autogenerate test system identifiers."/>
<commit subject="Add HRN_PG_CONTROL_PUT() and HRN_PG_CONTROL_TIME()."/>
<commit subject="Close expect log file when unit test completes."/>
<commit subject="Remove dead test code."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve unit and performance tests.</p>
</release-item>
</release-development-list>
</release-test-list>
</release>

View File

@@ -16,6 +16,8 @@
</release-item-contributor-list>
<p>Retry errors in S3 batch file delete.</p>
<p>A failed batch delete was retried, but errors for individual files in the batch were not, and <backrest/> could terminate during expire or when removing a backup that could not be resumed. Files that fail in a batch are now deleted individually with the usual HTTP retries.</p>
</release-item>
<release-item>
@@ -29,6 +31,8 @@
</release-item-contributor-list>
<p>Allow case-insensitive matching of <proper>HTTP</proper> <id>connection</id> header values.</p>
<p>The HTTP specification allows <id>connection</id> header values in any case, e.g. <id>Close</id>.</p>
</release-item>
</release-bug-list>
@@ -40,11 +44,12 @@
<release-item-contributor-list>
<release-item-contributor id="christoph.berg"/>
<release-item-reviewer id="david.steele"/>
<!-- Actually tester, but we don't have a tag for that yet -->
<release-item-reviewer id="tharindu.amila"/>
<release-item-tester id="tharindu.amila"/>
</release-item-contributor-list>
<p>Add support for <proper>AWS</proper> <proper>S3</proper> server-side encryption using <proper>KMS</proper>.</p>
<p>Set <br-option>repo-s3-kms-key-id</br-option> to encrypt objects with a key managed by <proper>AWS KMS</proper>.</p>
</release-item>
<release-item>
@@ -56,6 +61,8 @@
</release-item-contributor-list>
<p>Add <br-option>archive-missing-retry</br-option> option.</p>
<p>By default <cmd>archive-get</cmd> retries a WAL segment it already reported as missing, which ignores missing notifications left in the spool path by a prior restore. With <br-option>archive-missing-retry=n</br-option>, <postgres/> can detect the end of the archive and switch to streaming even while WAL is being archived. The spool path must then be empty when recovery starts.</p>
</release-item>
<release-item>
@@ -68,6 +75,8 @@
</release-item-contributor-list>
<p>Add backup type filter to <cmd>info</cmd> command.</p>
<p>Set <br-option>type</br-option> to show only backups of that type, e.g. <br-option>type=full</br-option>.</p>
</release-item>
</release-feature-list>
@@ -90,6 +99,8 @@
</release-item-contributor-list>
<p>Retry on page validation failure during <cmd>backup</cmd>.</p>
<p>A page that fails checksum validation is now read again. It is reported as an error only when it has not changed. A changed page is being written by <postgres/>, and the WAL contains a full page image. Zero pages are now checked to be all zeroes rather than only by the <id>pd_upper</id> field.</p>
</release-item>
<release-item>
@@ -98,13 +109,14 @@
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<!-- Actually tester, but we don't have a tag for that yet -->
<release-item-reviewer id="remi.vidier"/>
<release-item-reviewer id="david.christensen"/>
<release-item-reviewer id="stephen.frost"/>
<release-item-tester id="remi.vidier"/>
</release-item-contributor-list>
<p>Handle <proper>TLS</proper> servers that do not close connections gracefully.</p>
<p>Some servers close the socket rather than the TLS connection. When a response has no content length or chunked encoding and its content can be parsed, the closed socket is now treated as EOF. These servers stopped working in v2.35.</p>
</release-item>
<release-item>
@@ -116,6 +128,8 @@
</release-item-contributor-list>
<p>Add backup LSNs to <cmd>info</cmd> command output.</p>
<p>The start and stop LSNs of a backup are shown with <br-option>set</br-option> and in JSON output, for use with LSN-based Point-in-Time Recovery.</p>
</release-item>
<release-item>
@@ -127,12 +141,16 @@
</release-item-contributor-list>
<p>Automatically strip trailing slashes for <cmd>repo-ls</cmd> paths.</p>
<p>A trailing slash on the path made <cmd>repo-ls</cmd> show no content on some repository storage types.</p>
</release-item>
<release-item>
<commit subject="Improve protocol module error test for protocolClientFree()."/>
<commit subject="Use normal error for protocol module error retry test."/>
<commit subject="Do not retry fatal errors."/>
<commit subject="Do not retry fatal errors.">
<github-pull-request id="1658"/>
</commit>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
@@ -140,6 +158,8 @@
</release-item-contributor-list>
<p>Do not retry fatal errors.</p>
<p>Retrying fatal errors, especially out of memory errors, may cause lockups. Assertion and memory errors are now reported without retrying.</p>
</release-item>
<release-item>
@@ -152,6 +172,8 @@
</release-item-contributor-list>
<p>Remove support for <proper>PostgreSQL</proper> <id>8.3</id>/<id>8.4</id>.</p>
<p>There is no evidence that these versions are still in use and supporting them costs development and test time. Use an older version of <backrest/> to back up or migrate from these versions.</p>
</release-item>
<release-item>
@@ -164,6 +186,8 @@
</release-item-contributor-list>
<p>Remove logic that tried to determine additional file system compression.</p>
<p>After a file was copied, <backrest/> checked its size on disk to detect compression by the file system, e.g. ZFS. This was untested, slow with many small files, and blocked file bundling. The repository size in <cmd>info</cmd> is now what <backrest/> wrote.</p>
</release-item>
</release-improvement-list>
@@ -172,7 +196,6 @@
<commit subject="Disconnect help.auto.c from build-help in Makefile.">
<github-pull-request id="1672"/>
</commit>
<commit subject="Fix release note attribution in cacfdd94 and f798458e."/>
<release-item-contributor-list>
<release-item-contributor id="daniel.gustafsson"/>
@@ -183,18 +206,29 @@
</release-item>
<release-item>
<commit subject="Add read range to all storage drivers."/>
<release-note version="2.39" subject="Backup file bundling for improved small file support."/>
<commit subject="Add read range to all storage drivers.">
<github-pull-request id="1619"/>
</commit>
<commit subject="Implement restore ownership without updating manifest internals."/>
<commit subject="Fix issue with Posix read offset handling after an error."/>
<commit subject="Refactor backupProcessQueue() to use BackupJobData struct."/>
<commit subject="Use the PG_FILE_POSTMTRPID constant where appropriate."/>
<commit subject="Remove primary flag from manifest."/>
<commit subject="Remove primary flag from manifest.">
<github-pull-request id="1630"/>
</commit>
<commit subject="Simplify base path mode in mock/all integration tests."/>
<commit subject="Simplify manifest defaults."/>
<commit subject="Simplify manifest defaults.">
<github-pull-request id="1631"/>
</commit>
<commit subject="Convert varNewUInt64() to VARUINT64() where possible in manifest."/>
<commit subject="Pack manifest file structs to save memory."/>
<commit subject="Pack manifest file structs to save memory.">
<github-pull-request id="1626"/>
</commit>
<commit subject="Optimization for jsonFromStrInternal()."/>
<commit subject="Simplify manifest file defaults."/>
<commit subject="Simplify manifest file defaults.">
<github-pull-request id="1632"/>
</commit>
<commit subject="Simplify filename construction in command/verify module."/>
<commit subject="Bundle files in the repository during backup.">
<github-issue id="1149"/>
@@ -216,14 +250,17 @@
</release-item>
<release-item>
<release-note version="2.39" subject="Show backup percent complete in info output."/>
<commit subject="Add ioBufferReadNewOpen() and ioBufferWriteNewOpen()."/>
<commit subject="Refactor lock code."/>
<commit subject="Refactor lock code.">
<github-pull-request id="1643"/>
</commit>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add percent complete to lock file.</p>
<p>Refactor lock code.</p>
</release-item>
<release-item>
@@ -242,6 +279,53 @@
<p>Configuration refactoring.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add XML to invalid XML error message.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Fix invalid file descriptor being passed to close().</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add ioCopy().</p>
</release-item>
<release-item>
<commit id="226cfbdcd" subject="Fix typo."/>
<commit subject="Fix comment missed in 6bd280f7."/>
<commit subject="Fix typo in error message."/>
<commit id="91721e391" subject="Fix typo."/>
<commit subject="Remove extra spaces."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-contributor id="reid.thompson"/>
</release-item-contributor-list>
<p>Clean up code and comments.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update config.guess and config.sub to latest versions.</p>
</release-item>
</release-development-list>
</release-core-list>
@@ -254,6 +338,8 @@
</release-item-contributor-list>
<p>Move <id>repo</id> options in <proper>TLS</proper> documentation to the <id>global</id> section.</p>
<p>The user guide set these options in the stanza section, which works in some cases but is not best practice.</p>
</release-item>
<release-item>
@@ -263,6 +349,8 @@
</release-item-contributor-list>
<p>Remove unused <br-option>backup-standby</br-option> option from stanza commands.</p>
<p><cmd>stanza-create</cmd> and <cmd>stanza-upgrade</cmd> listed <br-option>backup-standby</br-option> in the command reference and help, but did not use it.</p>
</release-item>
<release-item>
@@ -288,6 +376,8 @@
</release-item-contributor-list>
<p>Add aliveness check to <proper>systemd</proper> service configuration.</p>
<p>The <file>pgbackrest.service</file> example now checks that the server is still running shortly after it starts. Before, a server that failed to start reported no error while <proper>systemd</proper> retried in the background.</p>
</release-item>
<release-item>
@@ -301,6 +391,8 @@
</release-item-contributor-list>
<p>Add FAQ explaining WAL archive suffix.</p>
<p>The suffix on a WAL file in the repository is its SHA1 checksum, which is used to verify the file. It cannot be omitted.</p>
</release-item>
<release-item>
@@ -317,5 +409,67 @@
<p>Note that replications slots are not restored.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<commit subject="Create create_test_table() function earlier in user guide."/>
<commit subject="Centralize common PostgreSQL options in the user guide."/>
<commit subject="Download correct key on aarch64 in the user guide."/>
<commit subject="Revert PGDG yum repo workaround for aarch64."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update the user guide.</p>
</release-item>
<release-item>
<commit subject="Use vagrant user in the Docker container."/>
<commit subject="Suppress errors when there is stderr output for Docker builds."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve the documentation build.</p>
</release-item>
<release-item>
<commit subject="Remove release note about the default port being provisional."/>
<commit subject="Most recent news for postgresql.org."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update the release notes and NEWS.md.</p>
</release-item>
</release-development-list>
</release-doc-list>
<release-test-list>
<release-development-list>
<release-item>
<commit subject="Combine encrypted backupFile() tests with unencrypted tests."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve unit tests.</p>
</release-item>
<release-item>
<commit subject="Fix language in rh7 test container for aarch64."/>
<commit subject="Revert Minio to prior release."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>CI updates.</p>
</release-item>
</release-development-list>
</release-test-list>
</release>

View File

@@ -5,7 +5,6 @@
<commit subject="Fix error thrown from FINALLY() causing an infinite loop.">
<github-pull-request id="1732"/>
</commit>
<commit subject="Remove unnecessary TRY() block in common/regExp module."/>
<commit subject="Use variable instead of function to track FINALLY() state.">
<github-pull-request id="1744"/>
</commit>
@@ -16,6 +15,8 @@
</release-item-contributor-list>
<p>Fix error thrown from <code>FINALLY()</code> causing an infinite loop.</p>
<p>An error thrown in a <code>FINALLY()</code> block returned to the same block, where the error was likely thrown again and caused an infinite loop. <code>FINALLY()</code> now runs only once.</p>
</release-item>
<release-item>
@@ -26,11 +27,12 @@
<release-item-ideator id="geir.raness"/>
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="reid.thompson"/>
<!-- Actually tester, but we don't have a tag for that yet -->
<release-item-reviewer id="geir.raness"/>
<release-item-tester id="geir.raness"/>
</release-item-contributor-list>
<p>Error on all lock failures except another process holding the lock.</p>
<p><cmd>archive-get</cmd>/<cmd>archive-push</cmd> did not error when the lock could not be taken for another reason, e.g. permissions, and the async process was not launched. The user got a generic failure message and there was no async log. These failures are now errors.</p>
</release-item>
</release-bug-list>
@@ -60,6 +62,8 @@
</release-item-contributor-list>
<p>Backup file bundling for improved small file support.</p>
<p>Bundling stores small files together in the repository to save time and space during backup, especially on object stores where creating each file is expensive. Enable it with <br-option>repo-bundle</br-option> and tune it with <br-option>repo-bundle-size</br-option> and <br-option>repo-bundle-limit</br-option>. Restore reads adjacent files in a bundle with a single read.</p>
</release-item>
<release-item>
@@ -75,6 +79,8 @@
</release-item-contributor-list>
<p>Verify command to validate the contents of a repository.</p>
<p>The <cmd>verify</cmd> command checks that the backups and WAL in the repository are valid. Set <br-option>output=text</br-option> to print the results and <br-option>verbose</br-option> to include what was verified successfully along with errors.</p>
</release-item>
<release-item>
@@ -91,10 +97,12 @@
</release-item-contributor-list>
<p><postgres/> 15 support.</p>
<p><postgres/> 15 removes exclusive backup, renames the backup start/stop functions, and drops <id>pg_database.datlastsysoid</id>, which <backrest/> no longer uses.</p>
</release-item>
<release-item>
<commit subject="Remove dependency on pg_database.datlastsysoid.">
<commit subject="Show backup percent complete in info output.">
<github-issue id="1490"/>
<github-pull-request id="1621"/>
</commit>
@@ -106,6 +114,8 @@
</release-item-contributor-list>
<p>Show backup percent complete in <cmd>info</cmd> output.</p>
<p><cmd>info</cmd> shows the percent complete of a running backup on the host where the backup is running. JSON output reports it as an integer, the percent times 100.</p>
</release-item>
<release-item>
@@ -122,6 +132,8 @@
</release-item-contributor-list>
<p>Auto-select backup for <cmd>restore</cmd> command <br-option>--type=lsn</br-option>.</p>
<p>With <br-option>type=lsn</br-option>, restore now selects the most recent backup that stopped at or before the <br-option>target</br-option> LSN.</p>
</release-item>
<release-item>
@@ -133,6 +145,8 @@
</release-item-contributor-list>
<p>Suppress existing WAL warning when <br-option>archive-mode-check</br-option> is disabled.</p>
<p>With <br-option>archive-mode-check=n</br-option> and WAL pushed from multiple hosts, a WAL file already in the archive with the same checksum is expected and no longer logs a warning. A different checksum is still an error.</p>
</release-item>
<release-item>
@@ -145,6 +159,8 @@
</release-item-contributor-list>
<p>Add <proper>AWS</proper> <proper>IMDSv2</proper> support.</p>
<p><proper>IMDSv2</proper> protects the instance metadata that provides credentials for <br-option>repo-s3-key-type=auto</br-option>. <backrest/> falls back to <proper>IMDSv1</proper> when the <proper>IMDSv2</proper> token request fails.</p>
</release-item>
</release-feature-list>
@@ -158,6 +174,8 @@
</release-item-contributor-list>
<p>Allow <br-option>repo-hardlink</br-option> option to be changed after full backup.</p>
<p>Changing <br-option>repo-hardlink</br-option> required a new full backup. It can now be changed at any time, e.g. to disable it for file bundling.</p>
</release-item>
<release-item>
@@ -169,6 +187,8 @@
</release-item-contributor-list>
<p>Increase precision of percent complete logging for <cmd>backup</cmd> and <cmd>restore</cmd>.</p>
<p>Percent complete is now logged with hundredths, which gives more frequent updates for large backups and restores.</p>
</release-item>
<release-item>
@@ -185,6 +205,8 @@
</release-item-contributor-list>
<p>Improve path validation for <cmd>repo-*</cmd> commands.</p>
<p>A path may not contain <id>//</id>, a trailing <id>/</id> is removed, and an absolute path must be in the repository path.</p>
</release-item>
<release-item>
@@ -198,6 +220,8 @@
</release-item-contributor-list>
<p>Improve <cmd>stop</cmd> command to honor <br-option>stanza</br-option> option.</p>
<p><cmd>stop</cmd> with <br-option>force</br-option> and <br-option>stanza</br-option> now terminates only the processes holding locks for that stanza. Before, it terminated processes for all stanzas.</p>
</release-item>
<release-item>
@@ -211,6 +235,8 @@
</release-item-contributor-list>
<p>Improve error message for invalid <br-option>repo-azure-key</br-option>.</p>
<p>With <br-option>repo-azure-key-type=shared</br-option>, <br-option>repo-azure-key</br-option> is now checked for valid base64.</p>
</release-item>
<release-item>
@@ -222,6 +248,8 @@
</release-item-contributor-list>
<p>Add hint to check the log on <cmd>archive-get</cmd>/<cmd>archive-push</cmd> async error.</p>
<p>When the async process cannot write its status files, <cmd>archive-get</cmd>/<cmd>archive-push</cmd> times out with a generic error. The error now includes a hint with the path of the async log, which contains the actual error.</p>
</release-item>
<release-item>
@@ -246,6 +274,8 @@
</release-item-contributor-list>
<p>Strip extensions from history manifest before showing in error message.</p>
<p>When a new backup label was not later than the latest label from the backup history, the error showed the history manifest name, e.g. <id>20220504-222042F_20220504-222141I.manifest.gz</id>. It now shows only the label.</p>
</release-item>
<release-item>
@@ -258,6 +288,16 @@
<p>Add user:group to lock permission error.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add hint when unable to find the primary cluster.</p>
<p>The <quote>unable to find primary cluster</quote> error now includes a hint asking whether all available clusters are in recovery.</p>
</release-item>
</release-improvement-list>
<release-development-list>
@@ -298,7 +338,7 @@
<commit subject="Add lockRead*() functions for reading locks from another process.">
<github-pull-request id="1712"/>
</commit>
<commit subject="Throw error when unable to read process from lock file.">
<commit subject="Throw error when unable to read lock process.">
<github-pull-request id="1715"/>
</commit>
@@ -336,6 +376,161 @@
<p>Refactor <code>PgClient</code> to return results in <code>Pack</code> format.</p>
</release-item>
<release-item>
<commit subject="Fix incorrect struct type in list initialization."/>
<commit subject="Use strNewZ() in cases where STRDEF() assignment goes out of scope."/>
<commit subject="Align checksum page error list in manifest file packs."/>
<commit subject="Do not pass NULL to bsearch()/qsort() in List object."/>
<commit subject="Do not pass NULL to memcpy() in Buffer/String objects."/>
<commit subject="Prevent signed integer overflow in cfgParseSize()."/>
<commit subject="Check that sha1 checksum is not empty in manifestFileUpdate()."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Fix undefined behavior found by sanitizers.</p>
</release-item>
<release-item>
<commit subject="Remove unnecessary mem contexts in the Manifest object."/>
<commit subject="Remove unnecessary TRY() block in common/regExp module."/>
<commit subject="Add temporary mem context to removeExpiredBackup()."/>
<commit subject="Add temporary mem contexts and fix a leak in the command/restore module."/>
<commit subject="Add temporary mem contexts in the command/help module."/>
<commit subject="Fix memory leak in archiveAsyncErrorClear()."/>
<commit subject="Fix memory leaks in archivePushDrop()."/>
<commit subject="Fix memory leaks in archivePushFile()."/>
<commit subject="Improve result declaration in backupRegExp()."/>
<commit subject="Remove useless context switches in archiveGetFile()/archivePushFile()."/>
<commit subject="Combine functions in the command/stanza module into one function."/>
<commit subject="Mem allocation cleanup in command/verify module."/>
<commit subject="Fix leak in cipherBlockNew()."/>
<commit subject="Fix leak in httpHeaderPutRange()."/>
<commit subject="Fix leak in ioFilterGroupResultAllSet()."/>
<commit subject="Fix leak in pckReadStrLst()."/>
<commit subject="Improved memory management in the common/exit module."/>
<commit subject="Refactor httpRequestNew()."/>
<commit subject="Fix object allocations in incorrect mem context in execOpen()."/>
<commit subject="Fix leak in cfgCommandJobRetry()."/>
<commit subject="Fix leak in configOptionRemote()."/>
<commit subject="Fix leaks in db module."/>
<commit subject="Fix leaks in info module."/>
<commit subject="Refactor functions in postgres/interface module and fix leak."/>
<commit subject="Fix leaks in protocol module."/>
<commit subject="Fix leaks in the storage/azure module."/>
<commit subject="Refactor and fix leak in storageRepoPathExpression()."/>
<commit subject="Use OBJ_NEW*() macros in SocketServer object."/>
<commit subject="Fix leak in varLstNewStrLst()."/>
<commit subject="Fix leaks in common/json, common/keyValue, and common/variantList."/>
<commit subject="Reuse Strings in iniLoad()."/>
<commit subject="Fix leaked String in cfgParseSize()."/>
<commit subject="Fix leaks in the storage/gcs module."/>
<commit subject="Fix leaks in the storage/posix module."/>
<commit subject="Fix leaks in the storage/remote module."/>
<commit subject="Fix leaks in the storage/s3 module."/>
<commit subject="Exclude mem context name from production builds."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Fix memory leaks and improve memory context usage.</p>
</release-item>
<release-item>
<commit subject="Add LENGTH_OF() macro."/>
<commit subject="Add FUNCTION_TEST_NO_RETURN() macro."/>
<commit subject="Add STR_SIZE() macro."/>
<commit subject="Add ASSERT_DECLARE() macro."/>
<commit subject="Allow *RETURN*() macros to accept struct initializers."/>
<commit subject="Add SIZE_OF_STRUCT_MEMBER() macro."/>
<commit subject="Require type for FUNCTION_TEST_RETURN*() macros."/>
<commit subject="Add ASSERT_PARAM() macro."/>
<commit subject="Add MEM_CONTEXT_OBJ_*() macros."/>
<commit subject="Remove THIS_MEM_CONTEXT() macro."/>
<commit subject="Add missing FUNCTION_TEST*() macros."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add and improve macros.</p>
</release-item>
<release-item>
<commit subject="Use bufUsed() instead of struct member in Buffer object."/>
<commit subject="Replace strCatFmt() with strCat()/strCatZ() where appropriate."/>
<commit subject="Fix instances where STRDEF() was used instead of STR()."/>
<commit subject="Use STRDEF() instead of STR() in command/help module."/>
<commit subject="Add strLstNewFmt()."/>
<commit subject="Add strLstAddSub*() and strLstAddSubZ*() functions."/>
<commit subject="Use strLstAddZ() instead of strLstAdd() where possible."/>
<commit subject="Add cvtZSubNTo*() functions."/>
<commit subject="Remove COLON_STR and separator parameter from cfgParseCommandRoleName()."/>
<commit subject="Remove most _Z constants."/>
<commit subject="Convert strNewFmt() to THROW_FMT() in config/parse module."/>
<commit subject="Add zNewFmt()."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add and improve string functions.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Refactor remote storage protocol to use Packs instead of JSON.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Fix reported error line number when ini key length is zero.</p>
</release-item>
<release-item>
<commit id="91b718bd4" subject="Fix comment typo."/>
<commit subject="Fix incorrect comment."/>
<commit subject="Remove extraneous double spaces in code and comments."/>
<commit id="d4954fcbf" subject="Fix comment typo."/>
<commit subject="Fix whitespace."/>
<commit subject="Add static keywords."/>
<commit subject="Update comment in pack module to cover a more common use case."/>
<commit id="e699402f9" subject="Remove extra linefeed."/>
<commit subject="Fix formatting in common/string module."/>
<commit subject="Fix outdated comment."/>
<commit subject="Fix spacing."/>
<commit subject="Fix comment formatting."/>
<commit id="ceb303f9e" subject="Fix comment typo."/>
<commit subject="Remove unused header."/>
<commit id="302e0c092" subject="Remove extra linefeed."/>
<commit subject="Fix comment wrapping."/>
<commit subject="Use uint8_t for optionResolveOrder."/>
<commit subject="Remove excessive const usage in build module."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-contributor id="reid.thompson"/>
</release-item-contributor-list>
<p>Clean up code and comments.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update config.guess and config.sub to latest versions.</p>
</release-item>
</release-development-list>
</release-core-list>
@@ -357,6 +552,8 @@
</release-item-contributor-list>
<p>Fix example for <br-option>repo-gcs-key-type</br-option> option in configuration reference.</p>
<p>The example was <id>none</id>, which is not a valid value. It is now <id>auto</id>.</p>
</release-item>
<release-item>
@@ -366,6 +563,8 @@
</release-item-contributor-list>
<p>Fix <br-option>tls-server-auth</br-option> example and add clarifications.</p>
<p>The example was missing the client CN and is now <id>client-cn=stanza1</id>. The help also states that wildcards are not allowed for the client CN.</p>
</release-item>
</release-bug-list>
@@ -381,6 +580,8 @@
</release-item-contributor-list>
<p>Simplify messaging around supported versions in the documentation.</p>
<p>The user guides listed <postgres/> version ranges, which made it look like other versions were not supported, e.g. <postgres/> 12 on RHEL. The ranges were removed and the introduction now explains which versions the user guides cover.</p>
</release-item>
<release-item>
@@ -392,6 +593,8 @@
</release-item-contributor-list>
<p>Add option type descriptions.</p>
<p>The configuration reference now describes each option type, e.g. the units for size options, rather than repeating the description for each option.</p>
</release-item>
<release-item>
@@ -403,10 +606,12 @@
</release-item-contributor-list>
<p>Add FAQ about backup types and restore speed.</p>
<p>A new FAQ explains that the backup type affects only the backup and not how fast a restore runs.</p>
</release-item>
<release-item>
<github-pull-request id="1722"/>
<github-pull-request id="1733"/>
<release-item-contributor-list>
<release-item-contributor id="david.christensen"/>
@@ -414,8 +619,30 @@
</release-item-contributor-list>
<p>Document required base branch for pull requests.</p>
<p>The contributing guide now states that pull requests must be based on the <id>integration</id> branch.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<commit subject="Fix typo in db-timeout help."/>
<commit subject="Fix URL for apt.p.o archives."/>
<commit subject="Clean up dividers in the documentation."/>
<commit subject="Remove key dividers in help.xml."/>
<commit subject="Add br tag for documentation."/>
<commit subject="Fix &quot;that that&quot; typos."/>
<commit subject="Fix typos in help."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-contributor id="reid.thompson"/>
<release-item-contributor id="stefan.fercot"/>
</release-item-contributor-list>
<p>Fix typos and formatting in the documentation and help.</p>
</release-item>
</release-development-list>
</release-doc-list>
<release-test-list>
@@ -430,6 +657,51 @@
<p>Remove integration expect log testing.</p>
</release-item>
<release-item>
<commit subject="Replace percentage and size with a constant in restore test logs."/>
<commit subject="Cleanup output to stderr in unit tests."/>
<commit subject="Show Docker output when building containers if --log-level=detail."/>
<commit subject="Handle NULL path in TEST_STORAGE_LIST when remove is specified."/>
<commit subject="Fix incorrect test param."/>
<commit subject="Improvements to test harness memory debugging."/>
<commit subject="Fix leaked String and Variant in harnessPqScriptRun()."/>
<commit subject="Fix leaks in common/io unit test."/>
<commit subject="Fix obsolete variable naming."/>
<commit subject="Replace strNewFmt() with TEST_ERROR_FMT() in command/archive-push module."/>
<commit subject="Use TEST_ERROR_FMT() rather than strNewFmt() in common/lock module."/>
<commit subject="Fix indentation."/>
<commit subject="Remove useless test in config/parse unit test."/>
<commit subject="Remove obsolete test in common/memContext."/>
<commit subject="Fix typo."/>
<commit subject="Move some PostgreSQL integration tests to rh7."/>
<commit subject="Reduce encrypted WAL segments sizes in command tests."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-contributor id="reid.thompson"/>
</release-item-contributor-list>
<p>Improve unit tests and test tools.</p>
</release-item>
<release-item>
<commit subject="Disable FreeBSD builds on Cirrus CI."/>
<commit subject="Update FreeBSD and MacOS images for Cirrus CI."/>
<commit subject="Move issue locking to Github actions."/>
<commit subject="Add PRs to thread locking on Github actions."/>
<commit subject="Remove legacy Travis-CI configuration."/>
<commit subject="Update Docker test image for Debian 9."/>
<commit subject="Split 32-bit CI tests."/>
<commit subject="Add limited CI for ppc64le/s390x using emulation."/>
<commit subject="Move 32-bit CI testing from Debian 9 to Ubuntu 18.04."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>CI updates.</p>
</release-item>
</release-development-list>
</release-test-list>
</release>

View File

@@ -14,11 +14,18 @@
</release-item-contributor-list>
<p><proper>OpenSSL 3</proper> support.</p>
<p><backrest/> now builds with <proper>OpenSSL 3</proper>. Deprecation warnings are suppressed, and an unexpected EOF is detected with the error codes that <proper>OpenSSL 3</proper> reports.</p>
</release-item>
<release-item>
<github-issue id="1754"/>
<github-pull-request id="1805"/>
<commit subject="Replace hrnStorageInfoListCallback() with TEST_STORAGE_LIST() in tests."/>
<commit subject="Reorder null user/group checks in remote protocol and add tests."/>
<commit subject="Rename strTrunc() to strTruncIdx() and add strTrunc()."/>
<commit subject="Create snapshot when listing contents of a path.">
<github-issue id="1754"/>
<github-pull-request id="1805"/>
</commit>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
@@ -27,6 +34,8 @@
</release-item-contributor-list>
<p>Create snapshot when listing contents of a path.</p>
<p>A path listed without sorting was read while its entries were processed. When files were deleted during the listing, some filesystems skipped files that still existed and the path could not be removed. Listings now always use a snapshot of the path.</p>
</release-item>
<release-item>
@@ -38,6 +47,8 @@
</release-item-contributor-list>
<p>Force <br-option>target-timeline=current</br-option> when restore <br-option>type=immediate</br-option>.</p>
<p>On <postgres/> &gt;= 12 the default target timeline is <id>latest</id>, and recovery could fail when the latest timeline in the repository cannot be reached from the backup. Restore with <br-option>type=immediate</br-option> does not change timelines, so it now sets the target timeline to <id>current</id>.</p>
</release-item>
<release-item>
@@ -49,6 +60,8 @@
</release-item-contributor-list>
<p>Truncate files during delta <cmd>restore</cmd> when they are larger than expected.</p>
<p>Delta restore copied a file from the repository whenever its size differed from the manifest. A larger file is now truncated to the size in the manifest and copied only when its checksum does not match. Files that were only appended to, e.g. logs, are no longer copied.</p>
</release-item>
<release-item>
@@ -60,6 +73,8 @@
</release-item-contributor-list>
<p>Disable incremental manifest save when <br-option>resume=n</br-option>.</p>
<p>During a backup the manifest is saved periodically for use by resume. These saves are now skipped when <br-option>resume=n</br-option>.</p>
</release-item>
<release-item>
@@ -71,6 +86,8 @@
</release-item-contributor-list>
<p>Set backup percent complete to zero before copy start.</p>
<p>The progress of a running backup was not reported until the first file was copied. It is now set to zero when copying starts.</p>
</release-item>
<release-item>
@@ -81,11 +98,12 @@
<release-item-ideator id="christian.montagne"/>
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="john.morris"/>
<!-- Actually tester, but we don't have a tag for that yet -->
<release-item-reviewer id="soulou"/>
<release-item-tester id="soulou"/>
</release-item-contributor-list>
<p>Use <proper>S3</proper> <id>IsTruncated</id> flag to determine list continuation.</p>
<p>Recent versions of <proper>Scality</proper> send an empty <id>NextContinuationToken</id> when a list is not truncated, which caused an infinite loop. The <id>IsTruncated</id> flag now determines whether a list continues, and a missing or empty token for a truncated list is an error.</p>
</release-item>
</release-improvement-list>
@@ -144,6 +162,77 @@
<p>Fix hard-coded WAL size assertion in <code>walSegmentNext()</code>.</p>
</release-item>
<release-item>
<commit subject="Add labels in parse.auto.c to make diffs easier to read."/>
<commit subject="Udpate parse.auto.c with labels from 4dcc9df2."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add labels in parse.auto.c to make diffs easier to read.</p>
</release-item>
<release-item>
<commit subject="Make all repo-* options visible for stanza create/update/delete."/>
<commit subject="Remote repo options should not be valid for the backup command."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Fix repository option definitions for the backup and stanza commands.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Use storagePathP() instead of cfgOptionStr() to get base repo path.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add additional detail to warnings when delta checksum is auto-enabled.</p>
</release-item>
<release-item>
<commit subject="Fix comment indentation."/>
<commit subject="Add missing static keywords."/>
<commit subject="Remove unused errors."/>
<commit subject="Use StringId for type in cryptoHash() and cryptoHmacOne()."/>
<commit subject="Add missing build.auto.h includes."/>
<commit subject="Fix continuation character spacing."/>
<commit subject="Add comment to indicate that type is in a different info level."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-contributor id="stefan.fercot"/>
</release-item-contributor-list>
<p>Clean up code and comments.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Replace AC_PROG_CC_C99 configure macro with AC_PROG_CC.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update config.guess to latest version.</p>
</release-item>
</release-development-list>
</release-core-list>
@@ -156,11 +245,15 @@
</release-item-contributor-list>
<p>Skip internal options in the configuration reference.</p>
<p>Options that are internal only for some commands were listed in the configuration reference. The command-line help was not affected.</p>
</release-item>
</release-bug-list>
<release-improvement-list>
<release-item>
<github-pull-request id="1809"/>
<release-item-contributor-list>
<release-item-ideator id="julien.cigar"/>
<release-item-contributor id="david.steele"/>
@@ -170,12 +263,40 @@
<p>Add link to <postgres/> configuration in repository host section.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Fix RHEL container build for documentation.</p>
</release-item>
<release-item>
<commit subject="Update contributor name."/>
<commit subject="Fix typo."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update release notes.</p>
</release-item>
</release-development-list>
</release-doc-list>
<release-test-list>
<release-improvement-list>
<release-item>
<github-pull-request id="1765"/>
<commit subject="Add .inc extension to C files included in other C files."/>
<commit subject="Add experimental Meson build.">
<github-pull-request id="1765"/>
</commit>
<commit subject="Update meson.build include comment to be more general."/>
<commit subject="Disable meson for all but debug builds."/>
<commit subject="Generate -fmacro-prefix-map to strip relative path from __FILE__."/>
<commit subject="Meson builds work on version 0.45."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
@@ -184,6 +305,8 @@
</release-item-contributor-list>
<p>Add experimental <proper>Meson</proper> build.</p>
<p><proper>Meson</proper> has simpler syntax and better performance than <proper>autoconf</proper>/<proper>make</proper>. It is used for code generation and test builds, and errors on anything but a debug build. Packagers should continue to use <proper>autoconf</proper>/<proper>make</proper>.</p>
</release-item>
<release-item>
@@ -206,7 +329,53 @@
</release-item-contributor-list>
<p>Fix compile error when <code>DEBUG_EXEC_TIME</code> is defined without <code>DEBUG</code>.</p>
<p>Without <code>DEBUG</code> the <code>ASSERT()</code> that used the start time expanded to nothing, and the unused variable caused a compile error. The check now uses <code>CHECK()</code>.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<commit subject="Move bldEnum() to the build/common/render module."/>
<commit subject="Remove storageLocal() dependency from common/lock module."/>
<commit subject="Move protocol module from common to command."/>
<commit subject="Add higher level YAML functions."/>
<commit subject="Add strReplace()."/>
<commit subject="Use constants rather than replacements when possible in test.c."/>
<commit subject="Used DEBUG instead of NDEBUG in common/stackTrace module."/>
<commit subject="Add experimental unit test harness written in C."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add experimental unit test harness written in C.</p>
</release-item>
<release-item>
<commit subject="Skip stopping PostgreSQL 9.1 in real/all integration test."/>
<commit subject="Remove useless command/check unit test."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve unit and integration tests.</p>
</release-item>
<release-item>
<commit subject="New CI container builds for PostgreSQL 15 beta1 and minor releases."/>
<commit subject="Run remaining Github Actions CI on Ubuntu 20.04."/>
<commit subject="Update CodeQL to version 2."/>
<commit subject="Update CI to use Ubuntu 22.04 and Fedora 36."/>
<commit subject="Add valgrind to Dockerfile missed in a16cf5ea."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>CI updates.</p>
</release-item>
</release-development-list>
</release-test-list>
</release>

View File

@@ -12,6 +12,8 @@
</release-item-contributor-list>
<p>Fix incorrect time expiration being used for non-default repositories.</p>
<p>When <cmd>expire</cmd> ran without <br-option>repo</br-option>, the time-based <br-option>repo-retention-full</br-option> for every repository was read from the lowest-numbered repository. Each repository now uses its own value.</p>
</release-item>
<release-item>
@@ -25,6 +27,8 @@
</release-item-contributor-list>
<p>Fix issue when listing directories recursively with a filter.</p>
<p><cmd>repo-ls</cmd> with <br-option>recurse</br-option> and <br-option>filter</br-option> could fail with a double free or segfault when the last entry in a directory was a directory that had entries. A parent list was freed before the entries of its subdirectories were processed.</p>
</release-item>
</release-bug-list>
@@ -40,6 +44,8 @@
</release-item-contributor-list>
<p>Backup key/value annotations.</p>
<p>Add key/value annotations to a backup with the <br-option>annotation</br-option> option of the <cmd>backup</cmd> command, and add, modify, or remove them later with the new <cmd>annotate</cmd> command. The <cmd>info</cmd> command shows annotations in text output when <br-option>set</br-option> is specified and always includes them in JSON output.</p>
</release-item>
</release-feature-list>
@@ -55,11 +61,16 @@
</release-item-contributor-list>
<p>Support <br-option>--set</br-option> in JSON output for <cmd>info</cmd> command.</p>
<p>With <br-option>set</br-option>, JSON output from <cmd>info</cmd> now includes the details that text output already showed, e.g. the error and tablespace lists.</p>
</release-item>
<release-item>
<github-issue id="1843"/>
<github-pull-request id="1847"/>
<commit subject="Allow quote tag in command-line help."/>
<commit subject="Allow upload chunk size to be configured for object stores.">
<github-issue id="1843"/>
<github-pull-request id="1847"/>
</commit>
<release-item-contributor-list>
<release-item-ideator id="anton.glushakov"/>
@@ -68,6 +79,8 @@
</release-item-contributor-list>
<p>Allow upload chunk size to be configured for object stores.</p>
<p>Set <br-option>repo-storage-upload-chunk-size</br-option> to change the size of each upload chunk for S3, GCS, or Azure. Larger chunks can improve performance but use more memory. The defaults are unchanged.</p>
</release-item>
<release-item>
@@ -81,6 +94,8 @@
</release-item-contributor-list>
<p>Update archive.info timestamps after a successful backup.</p>
<p><file>archive.info</file> and its copy were written only by <cmd>stanza-create</cmd> and <cmd>stanza-upgrade</cmd>, and an object store lifecycle policy that expires old files could remove them. Their timestamps are now updated after each successful backup.</p>
</release-item>
<release-item>
@@ -91,11 +106,12 @@
<release-item-ideator id="keith.fiske"/>
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="stefan.fercot"/>
<!-- Actually tester, but we don't have a tag for that yet -->
<release-item-reviewer id="keith.fiske"/>
<release-item-tester id="keith.fiske"/>
</release-item-contributor-list>
<p>Move standby timeline check after checkpoint.</p>
<p>The check that the standby is on the expected timeline used <file>pg_control</file> as it was before the backup started. Right after a promotion the standby may not have written the new timeline to <file>pg_control</file> yet, and the backup failed with <quote>standby is on timeline ... but expected ...</quote>. The check now runs after the checkpoint.</p>
</release-item>
<release-item>
@@ -105,6 +121,8 @@
</release-item-contributor-list>
<p>Improve warning message on backup resume.</p>
<p>The warning read as if the user needed to take action. It now states that invalid files will be removed and then the backup will resume.</p>
</release-item>
</release-improvement-list>
@@ -145,6 +163,33 @@
<p>Add <code>FN_INLINE_ALWAYS</code> macro.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Clear ProtocolClient callback after connection error.</p>
</release-item>
<release-item>
<commit subject="Unify code builder binaries into a single binary."/>
<commit subject="Fix incorrect storage for rendering errors."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve the code builder.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update config.guess to latest version.</p>
</release-item>
</release-development-list>
</release-core-list>
@@ -157,7 +202,82 @@
</release-item-contributor-list>
<p>Add absolute path for <id>kill</id> in <file>pgbackrest.service</file>.</p>
<p>The <file>pgbackrest.service</file> example now uses <file>/bin/kill</file> in <id>ExecReload</id>. Older versions of <proper>systemd</proper> require an absolute path.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Allow host memory limits in the user guide to be disabled.</p>
</release-item>
<release-item>
<commit subject="Add reviewer for c267ba51."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add missed reviewer to the release notes.</p>
</release-item>
</release-development-list>
</release-doc-list>
<release-test-list>
<release-development-list>
<release-item>
<commit subject="Add module harness and shim support to the C test harness."/>
<commit subject="C test harness improvements."/>
<commit subject="More C test harness improvements and CI."/>
<commit subject="Move release build check to src/meson.build."/>
<commit subject="Integrate C test harness with Perl test harness."/>
<commit subject="Add coverage to C test harness."/>
<commit subject="Add profiling, performance, and optimization to C test harness."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Build unit and performance tests with the C test harness.</p>
</release-item>
<release-item>
<commit subject="Copy repository links as files for testing."/>
<commit subject="Fix common/lock test creating &quot;750&quot; path."/>
<commit subject="Test Dockerfile improvements."/>
<commit subject="Remove Debian package patch now that it has been merged upstream."/>
<commit subject="Fix comment typos in command/expire unit test."/>
<commit subject="Fix comment typo."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve unit tests and test tools.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update Minio test/documentation container version.</p>
</release-item>
<release-item>
<commit subject="Update Cirrus CI FreedBSD 13 image version."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>CI updates.</p>
</release-item>
</release-development-list>
</release-test-list>
</release>

View File

@@ -9,15 +9,19 @@
<release-item-ideator id="MannerMan"/>
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="john.morris"/>
<!-- Actually tester, but we don't have a tag for that yet -->
<release-item-reviewer id="MannerMan"/>
<release-item-tester id="MannerMan"/>
</release-item-contributor-list>
<p>Fix memory leak in file bundle <cmd>backup</cmd>/<cmd>restore</cmd>.</p>
<p>Restore freed some I/O objects for bundled files only after every file in the bundle was restored. With many small files in a bundle, memory use grew until restore failed with <quote>unable to allocate</quote>. Backup had a similar, smaller leak when resuming.</p>
</release-item>
<release-item>
<github-pull-request id="1900"/>
<commit subject="Move storageReadRemoteOpen() in storage/remote/read module."/>
<commit subject="Fix protocol error on short read of remote file.">
<github-pull-request id="1900"/>
</commit>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
@@ -25,6 +29,8 @@
</release-item-contributor-list>
<p>Fix protocol error on short read of remote file.</p>
<p>A remote file read that stopped early or failed partway left the protocol in a bad state. The next command failed with <quote>client state is 'data-get' but expected 'idle'</quote> and the original error was lost. The rest of the file is now read when the file is closed.</p>
</release-item>
</release-bug-list>
@@ -38,6 +44,8 @@
</release-item-contributor-list>
<p>Do not store references for zero-length files when bundling.</p>
<p>Bundled diff/incr backups stored a reference to a prior backup for zero-length files, which are not stored in any backup. The reference was ignored on restore but used space in the manifest.</p>
</release-item>
<release-item>
@@ -51,11 +59,14 @@
</release-item-contributor-list>
<p>Use more generic descriptions for <code>pg_start_backup()</code>/<code>pg_stop_backup()</code>.</p>
<p><postgres/> 15 renamed these functions to <code>pg_backup_start()</code>/<code>pg_backup_stop()</code>. The logs and documentation now use descriptions that do not depend on the <postgres/> version.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<release-note version="2.45" subject="Block incremental backup (BETA)."/>
<commit subject="Improve manifest file updates.">
<github-pull-request id="1888"/>
</commit>
@@ -65,6 +76,7 @@
<commit subject="Add persistent reference list to manifest.">
<github-pull-request id="1890"/>
</commit>
<commit subject="Add bufferSize to cvtUInt64FromVarInt128() to further limit reads."/>
<commit subject="Add varint-128 encode/decode to IoRead/IoWrite.">
<github-pull-request id="1891"/>
</commit>
@@ -88,10 +100,11 @@
<release-item-reviewer id="stephen.frost"/>
</release-item-contributor-list>
<p>Block incremental backup.</p>
<p>Block incremental backup groundwork.</p>
</release-item>
<release-item>
<release-note version="2.46" subject="SFTP support for repository storage."/>
<github-pull-request id="1879"/>
<release-item-contributor-list>
@@ -102,9 +115,69 @@
<p>Move link creation to storage interface.</p>
</release-item>
<release-item>
<commit subject="Add test for differential file bundles to the command/backup unit."/>
<commit subject="Do not log bundle info when a file is delta matched from a prior backup."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Do not log bundle info when a file is delta matched from a prior backup.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Return binary as result from CryptoHash filter.</p>
</release-item>
<release-item>
<commit subject="Fix assert message and add a clarifying comment."/>
<commit subject="Fix comment typo."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Clean up code and comments.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Finalize catalog number for PostgreSQL 15 release.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update config.guess and config.sub to latest versions.</p>
</release-item>
</release-development-list>
</release-core-list>
<release-doc-list>
<release-development-list>
<release-item>
<commit subject="Add missed release note for b05d31f5."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add missed release note for v2.41.</p>
</release-item>
</release-development-list>
</release-doc-list>
<release-test-list>
<release-improvement-list>
<release-item>
@@ -116,7 +189,34 @@
</release-item-contributor-list>
<p>Update <file>test.pl</file> <setting>--psql-bin</setting> option to match command-line help.</p>
<p>The help showed <setting>--psql-bin</setting> but the option was named <setting>--pgsql-bin</setting>. The option now has the name shown in the help.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<commit subject="Add zero-length chunked content test to common/ioHttp unit."/>
<commit subject="Use large error/log buffers in test harness."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve unit tests and test tools.</p>
</release-item>
<release-item>
<commit subject="Disable FreeBSD 13 builds on Cirrus CI."/>
<commit subject="Disable FreeBSD 12 builds on Cirrus CI."/>
<commit subject="Enable FreeBSD 12/13 builds on Cirrus CI."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>CI updates.</p>
</release-item>
</release-development-list>
</release-test-list>
</release>

View File

@@ -2,8 +2,11 @@
<release-core-list>
<release-bug-list>
<release-item>
<github-issue id="1933"/>
<github-pull-request id="1935"/>
<commit subject="Move manifestBackupLabelSet() test in info/manifest unit."/>
<commit subject="Fix missing reference in diff/incr backup.">
<github-issue id="1933"/>
<github-pull-request id="1935"/>
</commit>
<release-item-contributor-list>
<release-item-ideator id="marcel.borger"/>
@@ -14,6 +17,8 @@
</release-item-contributor-list>
<p>Fix missing reference in diff/incr backup.</p>
<p>In v2.42 a diff or incr backup failed with <quote>unable to find '...' in string list</quote> when its prior backup was made by an earlier version. The reference list built for a manifest from an earlier version now includes the backup's own label.</p>
</release-item>
</release-bug-list>
@@ -28,7 +33,19 @@
</release-item-contributor-list>
<p>Add hint when an option is specified without an index.</p>
<p>An option that requires an index, e.g. <setting>repo-storage-ca-file</setting>, now errors with a hint that shows the indexed name, e.g. <setting>repo1-storage-ca-file</setting>. A deprecated option also gets a hint with its current name.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update config.guess and config.sub to latest versions.</p>
</release-item>
</release-development-list>
</release-core-list>
</release>

View File

@@ -10,6 +10,8 @@
</release-item-contributor-list>
<p>Remove support for <proper>PostgreSQL</proper> <id>9.0</id>/<id>9.1</id>/<id>9.2</id>.</p>
<p><backrest/> now supports ten versions of <postgres/>: the five supported versions and the last five EOL versions. As of <postgres/> 15 that excludes <id>9.0</id>, <id>9.1</id>, and <id>9.2</id>.</p>
</release-item>
<release-item>
@@ -23,6 +25,8 @@
</release-item-contributor-list>
<p>Restore errors when no backup matches the current version of <postgres/>.</p>
<p>After a <cmd>stanza-upgrade</cmd> with no new backup, restore used the latest backup, which was made from the prior <postgres/> version. Replicas built this way could fail. Restore now errors in this case unless <br-option>set</br-option> or <br-option>type=time</br-option>/<br-option>type=lsn</br-option> is specified.</p>
</release-item>
<release-item>
@@ -38,11 +42,14 @@
</release-item-contributor-list>
<p>Add <br-option>compress-level</br-option> range checking for each <br-option>compress-type</br-option>.</p>
<p>The <br-option>compress-level</br-option> range was <id>0-9</id> for every <br-option>compress-type</br-option>. This is the range for <id>gz</id> but a subset of what <id>lz4</id> and <id>zst</id> allow. Each type now has its own range, e.g. <id>-7</id> to <id>22</id> for <id>zst</id>.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<release-note version="2.45" subject="Block incremental backup (BETA)."/>
<github-issue id="959"/>
<github-issue id="1806"/>
<github-issue id="1913"/>
@@ -91,6 +98,7 @@
<commit subject="Use memcpy() instead of strncpy when source size is known."/>
<commit subject="Put logging functions unused by release builds into DEBUG blocks."/>
<commit subject="Split VR_EXTERN/FN_EXTERN macros from FV_EXTERN."/>
<commit subject="Add meson unity build and tests."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
@@ -100,7 +108,10 @@
</release-item>
<release-item>
<github-pull-request id="1968"/>
<commit subject="Cleanup of common/ini module in preparation for a refactor."/>
<commit subject="Refactor common/ini module to remove callbacks and duplicated code.">
<github-pull-request id="1968"/>
</commit>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
@@ -109,6 +120,92 @@
<p>Refactor <id>common/ini</id> module to remove callbacks and duplicated code.</p>
</release-item>
<release-item>
<commit subject="Audit mem contexts returned from functions into the calling context."/>
<commit subject="Refactor logging functions to never allocate memory."/>
<commit subject="Remove mostly useless mem context in storageRemoteInfoProtocolPut()."/>
<commit subject="Fix leak in protocolServer()."/>
<commit subject="Fix leaks in db module."/>
<commit subject="Fix leak in configOptionRemote()."/>
<commit subject="Fix leak in jsonReadVarRecurse()."/>
<commit subject="Fix leak in archivePushDropWarning()."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Audit memory contexts returned from functions and fix leaks.</p>
</release-item>
<release-item>
<commit subject="Improve libbacktrace implementation."/>
<commit subject="Enhance libbacktrace to handle incomplete stack traces."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve libbacktrace implementation.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Fix error detail output to stderr.</p>
</release-item>
<release-item>
<commit subject="Remove duplication from FUNCTION_LOG_BEGIN_BASE() macro definitions."/>
<commit subject="Revert macro changes from 38d32045."/>
<commit subject="Add CHECK_FMT() macros and tests for CHECK*() macros."/>
<commit subject="Add BUFFER_EXTERN() and cleanup hash zero constants."/>
<commit subject="Cleanup terminology in Buffer/Variant/String macros."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve debug, check, and buffer macros.</p>
</release-item>
<release-item>
<commit subject="Fix comment indentation and wrapping."/>
<commit subject="Fix formatting of archiveGetFile()."/>
<commit subject="Remove extra linefeed."/>
<commit subject="Fix formatting of restoreFile() definition."/>
<commit subject="Fix formatting."/>
<commit subject="Clean up storage headers and move posix internal type."/>
<commit subject="Fix comment typo for strLower()."/>
<commit subject="Fix improper formatting in config/parse module."/>
<commit subject="Fix typo."/>
<commit subject="Improve comment on forced WAL switch at backup start."/>
<commit subject="Move function prototype to a better location in the header."/>
<commit subject="Add missing header in lock module."/>
<commit subject="Fix permissions on source files."/>
<commit subject="Fix incorrect return type in backupFile()."/>
<commit subject="Reduce log level of pgVersionFromStr() and pgVersionToStr()."/>
<commit subject="Simply return in pgVersionToStr()."/>
<commit subject="Minor optimizations on config/parse module."/>
<commit subject="Fix typos."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-contributor id="stefan.fercot"/>
</release-item-contributor-list>
<p>Clean up code and comments.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update LICENSE.txt and PostgreSQL copyright for 2023.</p>
</release-item>
</release-development-list>
</release-core-list>
@@ -127,6 +224,8 @@
</release-item-contributor-list>
<p>Add warning about enabling <quote>hierarchical namespace</quote> on Azure storage.</p>
<p>With <quote>hierarchical namespace</quote> enabled, Azure requires directories to be deleted separately and <cmd>expire</cmd> fails. The user guide now warns not to enable it.</p>
</release-item>
<release-item>
@@ -142,6 +241,8 @@
</release-item-contributor-list>
<p>Add replacement for linefeeds in monitoring example.</p>
<p>The monitoring example failed when <cmd>info</cmd> output contained a linefeed, e.g. in some error messages, because <code>COPY</code> converts <id>\n</id> to a linefeed that <id>jsonb</id> rejects. The example now replaces linefeeds before converting to <id>jsonb</id>.</p>
</release-item>
<release-item>
@@ -159,6 +260,8 @@
</release-item-contributor-list>
<p>Clarify <br-option>target-action</br-option> behavior on various <postgres/> versions.</p>
<p>The effect of <id>pause</id> depends on <setting>hot_standby</setting> and the <postgres/> version. With <setting>hot_standby=off</setting>, <id>pause</id> acts like <id>shutdown</id> on <postgres/> &gt;= 12 and like <id>promote</id> on earlier versions.</p>
</release-item>
<release-item>
@@ -170,6 +273,8 @@
</release-item-contributor-list>
<p>Updates and clarifications to index page.</p>
<p>The section about other backup solutions not supporting parallel processing was no longer accurate and has been reworded. Other sections were updated for current terminology and clarity.</p>
</release-item>
<release-item>
@@ -179,7 +284,50 @@
</release-item-contributor-list>
<p>Add dark mode to the website.</p>
<p>The website uses dark colors when the browser prefers a dark color scheme.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update RHEL user guide to PostgreSQL 11/12.</p>
</release-item>
</release-development-list>
</release-doc-list>
<release-test-list>
<release-development-list>
<release-item>
<commit subject="Add manifest test harness."/>
<commit subject="Add backup test harness."/>
<commit subject="Fix incorrect FUNCTION_TEST_END() in hrnPgWalToBuffer()."/>
<commit subject="Update missing flag in storage/posix test."/>
<commit subject="Add unit tests for the unit test build code."/>
<commit subject="Add --no-back-trace option to test.pl."/>
<commit subject="Skip test modules in coverage report."/>
<commit subject="Do not output stderr on unit/integration test errors."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve unit tests and test tools.</p>
</release-item>
<release-item>
<commit subject="Remove MacOS from CirrusCI."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>CI updates.</p>
</release-item>
</release-development-list>
</release-test-list>
</release>

View File

@@ -15,6 +15,8 @@
</release-item-contributor-list>
<p>Skip writing <file>recovery.signal</file> by default for restores of offline backups.</p>
<p>On <postgres/> &gt;= 12, <file>recovery.signal</file> makes <postgres/> fail to start when the backup was made offline with <setting>wal_level=minimal</setting>. Restore now skips writing it for offline backups unless <br-option>type</br-option> is set explicitly, e.g. for Point-in-Time Recovery from an offline backup made with a higher <setting>wal_level</setting>.</p>
</release-item>
</release-bug-list>
@@ -30,7 +32,7 @@
<commit subject="Add optional raw format for compression types."/>
<commit subject="Use raw compression/encryption to bundling and block incremental backup."/>
<commit subject="Block-level incremental backup super blocks.">
<github-pull-request id="2011"/>
<github-pull-request id="1996"/>
</commit>
<commit subject="Use xxHash instead of SHA-1 for block incremental checksums."/>
<commit subject="Exclude backup set size from info for block incremental backups."/>
@@ -41,6 +43,7 @@
<commit subject="Block incremental map fixes and improvements.">
<github-pull-request id="2026"/>
</commit>
<commit subject="Add beta feature infrastructure."/>
<commit subject="Add beta feature and documentation for block incremental backup."/>
<release-item-contributor-list>
@@ -51,6 +54,8 @@
</release-item-contributor-list>
<p>Block incremental backup (BETA).</p>
<p>Block incremental stores only the parts of a file that changed since the prior backup instead of the entire file. Enable it with <setting>repo-block</setting>, which requires <setting>repo-bundle</setting>. The feature is in beta and also requires the <setting>beta</setting> option. Do not use it in production: the on-disk format will change before the GA release.</p>
</release-item>
</release-feature-list>
@@ -64,6 +69,8 @@
</release-item-contributor-list>
<p>Keep only one all-default group index.</p>
<p>An option that does not apply, e.g. <setting>repo2-s3-key</setting> when <setting>repo2-type</setting> is not <id>s3</id>, could add a phantom repository that has only default values. Repository and <postgres/> indexes with only default values are now removed unless no other index remains.</p>
</release-item>
</release-improvement-list>
@@ -81,6 +88,72 @@
<p>Add <br-option>pg-version-force</br-option> option for fork integration.</p>
</release-item>
<release-item>
<commit subject="Prototype manifest command."/>
<commit subject="Updates required for new manifest command to work remotely."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add internal <cmd>manifest</cmd> command.</p>
</release-item>
<release-item>
<commit subject="Use uncrustify for code formatting."/>
<commit subject="Reformat code with uncrustify."/>
<commit subject="Fix formatting errors."/>
<commit subject="Refactor loop limit in removeExpiredArchive()."/>
<commit subject="Check for stray execute permissions in test.pl --code-format."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Use uncrustify for code formatting.</p>
</release-item>
<release-item>
<commit subject="Improved error handling in build-code binary."/>
<commit subject="Fix error handling in build-code binary."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve error handling in build-code binary.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve interface handling in storage module.</p>
</release-item>
<release-item>
<commit subject="Update comments missed in copy/paste."/>
<commit subject="Fix typo and remove extraneous linefeed."/>
<commit subject="Add FN_PRINTF() macro."/>
<commit subject="Refactor stackTraceToZ() to avoid multiple versions of the function."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-contributor id="stefan.fercot"/>
</release-item-contributor-list>
<p>Clean up code and comments.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update config.guess and config.sub to latest versions.</p>
</release-item>
</release-development-list>
</release-core-list>
@@ -96,6 +169,8 @@
</release-item-contributor-list>
<p>Add explicit instructions for upgrading between <id>2.x</id> versions.</p>
<p>A new user guide section explains that upgrading between <id>2.x</id> versions requires only installing the new binaries. Downgrading is also possible when no features unsupported by the older version were used.</p>
</release-item>
<release-item>
@@ -104,7 +179,34 @@
</release-item-contributor-list>
<p>Remove references to <proper>SSH</proper> made obsolete when <proper>TLS</proper> was introduced.</p>
<p>The help for <setting>repo-host</setting>, <setting>pg-host</setting>, and their port options no longer refers to <proper>SSH</proper> as the only remote protocol. Details about <proper>SSH</proper> compression were also removed.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Fix contributors in release notes.</p>
</release-item>
</release-development-list>
</release-doc-list>
<release-test-list>
<release-development-list>
<release-item>
<commit subject="Move backup pq test script generation to backup harness."/>
<commit subject="Add missing header."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve unit tests.</p>
</release-item>
</release-development-list>
</release-test-list>
</release>

View File

@@ -17,6 +17,8 @@
</release-item-contributor-list>
<p>Block incremental backup.</p>
<p>Block incremental stores only the parts of a file that changed since the prior backup, which saves space and time in diff and incr backups of large files. Enable it with <setting>repo-block</setting>, which requires <setting>repo-bundle</setting>.</p>
</release-item>
<release-item>
@@ -29,6 +31,8 @@
</release-item-contributor-list>
<p><proper>SFTP</proper> support for repository storage.</p>
<p>Set <br-option>repo-type=sftp</br-option> and <setting>repo-sftp-host</setting> to store the repository on an <proper>SFTP</proper> server.</p>
</release-item>
<release-item>
@@ -42,6 +46,8 @@
</release-item-contributor-list>
<p><postgres/> 16 support.</p>
<p>Adds the catalog version and WAL magic number for <postgres/> 16.</p>
</release-item>
</release-feature-list>
@@ -56,6 +62,8 @@
</release-item-contributor-list>
<p>Allow page header checks to be skipped.</p>
<p>The page header checks made while verifying page checksums can report false errors for encrypted pages. Set <br-option>page-header-check=n</br-option> to skip them. They are enabled by default.</p>
</release-item>
<release-item>
@@ -70,13 +78,22 @@
</release-item-contributor-list>
<p>Avoid <code>chown()</code> on recovery files during restore.</p>
<p>Restore skipped <code>chown()</code> for restored files that already had the right owner but not for the recovery files it writes. The <proper>Posix</proper> driver now also skips <code>chown()</code> when the owner is already correct.</p>
</release-item>
<release-item>
<commit subject="Move error modules to common/error directory."/>
<commit subject="Improve retry error messages."/>
<commit subject="Add error retry detail for HTTP retries."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add error retry detail for HTTP retries.</p>
<p>An error after HTTP retries now reports how many retries were made and for how long.</p>
</release-item>
</release-improvement-list>
@@ -90,6 +107,86 @@
<p>Improve internal <cmd>manifest</cmd> command.</p>
</release-item>
<release-item>
<commit subject="Clear buffer limit when buffer is limited to allocated size."/>
<commit subject="Improve interface handling in remaining modules."/>
<commit subject="Simplify object creation with OBJ_NEW_BEGIN() macro."/>
<commit subject="Cleanup for objects that do not require allocations."/>
<commit subject="Convert XmlNode from allocation to object."/>
<commit subject="Convert the result of zNewFmt() into an object."/>
<commit subject="Remove allocations from common crypto module."/>
<commit subject="Use Buffer object for page buffer in PageChecksum filter."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve object and allocation handling.</p>
</release-item>
<release-item>
<commit subject="Convert lockAcquire() to lockAcquireP()."/>
<commit subject="Add lock module initialization."/>
<commit subject="Parameterize configLoad() as cfgLoadP()."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Refactor the lock and configuration load modules.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Sleep using nanosleep() instead of select().</p>
</release-item>
<release-item>
<commit subject="Autogenerate PostgreSQL versions."/>
<commit subject="Rename PG_VERSION_*_STR constants to PG_VERSION_*_Z."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Autogenerate PostgreSQL versions.</p>
</release-item>
<release-item>
<commit subject="Update command/backup module to recent coding standards."/>
<commit subject="Update command/check module to recent coding standards."/>
<commit subject="Fix missing void parameter."/>
<commit subject="Use boolean variant constants where possible instead of redeclaring."/>
<commit subject="Fix groupId type in StorageInfo."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update modules to recent coding standards.</p>
</release-item>
<release-item>
<commit subject="Fix indentation in config.yaml."/>
<commit subject="Remove extra linefeed."/>
<commit subject="Add 1bd5530a (remove double spacing) to .git-blame-ignore-revs."/>
<commit subject="Remove double spaces from comments and documentation."/>
<commit subject="Remove extraneous space from error messages."/>
<commit subject="Add efac3474 (remove double spacing) to .git-blame-ignore-revs."/>
<commit subject="Remove double spaces missed in 1bd5530a."/>
<commit subject="Fix incorrect commit hash in 2f322e2a."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-contributor id="david.christensen"/>
</release-item-contributor-list>
<p>Remove double spaces and extraneous whitespace.</p>
</release-item>
</release-development-list>
</release-core-list>
@@ -105,6 +202,8 @@
</release-item-contributor-list>
<p>Add warning about using recovery <br-option>type=none</br-option>.</p>
<p>Recovery <br-option>type=none</br-option> does not increment the timeline at the end of recovery, which can cause <postgres/> to archive duplicate WAL that is rejected and fills the disk, and can make tools like <id>pg_rewind</id> fail or corrupt the cluster. The documentation now warns against it.</p>
</release-item>
<release-item>
@@ -113,7 +212,52 @@
</release-item-contributor-list>
<p>Add note about running <cmd>stanza-create</cmd> on already-created repositories.</p>
<p>Stanzas that already exist are skipped, so <cmd>stanza-create</cmd> is safe to run again, e.g. after a new repository is configured.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<commit subject="Remove extraneous spaces in user guide."/>
<commit subject="Update Debian user guide to build on Ubuntu 20.04."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update the user guide.</p>
</release-item>
</release-development-list>
</release-doc-list>
<release-test-list>
<release-development-list>
<release-item>
<commit subject="Fix command/manifest unit test title."/>
<commit subject="Remove unused strOS parameter in Common::HostTest."/>
<commit subject="Fix typos in test titles."/>
<commit subject="Increase check timeouts in real/all integration tests."/>
<commit subject="Add bundling and block incremental to stress testing."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve unit and integration tests.</p>
</release-item>
<release-item>
<commit subject="Update Github actions to new versions."/>
<commit subject="Update 32-bit CI host to Debian 10 from Ubuntu 18.04."/>
<commit subject="Add MacOS back to CirrusCI."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>CI updates.</p>
</release-item>
</release-development-list>
</release-test-list>
</release>

View File

@@ -15,6 +15,8 @@
</release-item-contributor-list>
<p>Preserve block incremental info in manifest during delta backup.</p>
<p>When a file changed so that it would not use block incremental if it were new, e.g. it shrank below the block incremental limit or its timestamp moved far enough into the past, its block incremental info was lost from the manifest of a delta backup even though the file could still be referenced to the prior backup.</p>
</release-item>
<release-item>
@@ -28,6 +30,8 @@
</release-item-contributor-list>
<p>Fix block incremental file names in <cmd>verify</cmd> command.</p>
<p>The <cmd>verify</cmd> command used the compression extension instead of <file>.pgbi</file> for block incremental files stored outside a bundle, so it could not find them.</p>
</release-item>
<release-item>
@@ -42,6 +46,8 @@
</release-item-contributor-list>
<p>Fix spurious automatic delta backup on backup from standby.</p>
<p>File sizes on the standby can differ from the primary, e.g. for free space maps, so the next incremental backup could see a size change on the primary and switch to a checksum delta, which can take much longer. The original size is now kept in the manifest and used for the comparison.</p>
</release-item>
<release-item>
@@ -55,6 +61,8 @@
</release-item-contributor-list>
<p>Skip <file>recovery.signal</file> for <postgres/> &gt;= 12 when recovery <br-option>type=none</br-option>.</p>
<p>With <br-option>type=none</br-option>, <file>recovery.signal</file> is no longer written for <postgres/> &gt;= 12, which matches the behavior for earlier versions.</p>
</release-item>
<release-item>
@@ -67,6 +75,8 @@
</release-item-contributor-list>
<p>Fix unique label generation for diff/incr backup.</p>
<p>With at least two full backups and the latest expired, a diff or incr backup failed as if the clock had gone backward, because its label was compared with the label of the expired full backup.</p>
</release-item>
<release-item>
@@ -79,6 +89,8 @@
</release-item-contributor-list>
<p>Fix time-based archive expiration when no backups are expired.</p>
<p>When time-based retention was met but no backups were expired, archive was not expired and <quote>time-based archive retention not met</quote> was logged. One more backup was then needed to expire the earlier WAL.</p>
</release-item>
</release-bug-list>
@@ -97,6 +109,8 @@
</release-item-contributor-list>
<p>Improve performance of <proper>SFTP</proper> storage driver.</p>
<p>The <proper>SFTP</proper> storage driver waited for a fixed time when <proper>libssh2</proper> could not continue. It now waits until the socket can be read or written.</p>
</release-item>
<release-item>
@@ -114,6 +128,8 @@
</release-item-contributor-list>
<p>Add timezone offset to <cmd>info</cmd> command date/time output.</p>
<p>Timestamps in the <cmd>info</cmd> command output now include the timezone offset, so they can be used directly as a recovery target, e.g. with <br-option>--target</br-option>.</p>
</release-item>
<release-item>
@@ -128,13 +144,64 @@
</release-item-contributor-list>
<p>Centralize error handling for unsupported features.</p>
<p>Errors for features that were not compiled in, e.g. <proper>lz4</proper>, are now more detailed and consistent. Specifying <proper>SFTP</proper> storage when it was not compiled in no longer fails an assertion.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Use new LibXML error handler.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Fix missed memory auditing in FUNCTION_LOG_RETURN_VOID().</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Increase protocolServerError() logging to debug level.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Log when file size changes during backup.</p>
</release-item>
<release-item>
<commit subject="Improve comments in protocol/command module."/>
<commit subject="Clarify comments for the handling of pg_control during restore."/>
<commit subject="Remove unresolved todo from 87087fac."/>
<commit subject="Update comments for removal of chunking and block numbers."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve comments.</p>
</release-item>
</release-development-list>
</release-core-list>
<release-doc-list>
<release-improvement-list>
<release-item>
<github-pull-request id="2090"/>
<release-item-contributor-list>
<release-item-ideator id="dr-kd"/>
<release-item-contributor id="david.steele"/>
@@ -144,5 +211,61 @@
<p>Clarify preference to install from packages in the user guide.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<commit subject="Explicitly create SSH directory in SFTP setup."/>
<commit subject="Fix sftp-all=y in the user guide so it creates a valid configuration."/>
<commit subject="Remove user-facing documentation references to --vm=none."/>
<commit subject="Move delete stanza section in user guide."/>
<commit subject="Fix typo in &quot;Upgrading PostgreSQL&quot; section of user guide."/>
<commit subject="Update NEWS.md for new version and features.">
<github-pull-request id="2077"/>
</commit>
<commit subject="Mention block-level backups in feature list."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update the user guide, feature list, and NEWS.md.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Build u20 image to speed contributing document generation.</p>
</release-item>
</release-development-list>
</release-doc-list>
<release-test-list>
<release-development-list>
<release-item>
<commit subject="Add missed --no-log-timestamp in unit tests and improved formatting."/>
<commit subject="Add --tz param missed in C unit test migration."/>
<commit subject="Add test for configuration hash type override behavior."/>
<commit subject="Rename macros in command/verify unit test."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve unit tests.</p>
</release-item>
<release-item>
<commit subject="New CI container build for PostgreSQL 16 beta1."/>
<commit subject="Update Fedora test image to Fedora 38."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>CI updates.</p>
</release-item>
</release-development-list>
</release-test-list>
</release>

View File

@@ -9,11 +9,12 @@
<release-item-ideator id="burak.yurdakul"/>
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="stephen.frost"/>
<!-- Actually tester, but we don't have a tag for that yet -->
<release-item-reviewer id="burak.yurdakul"/>
<release-item-tester id="burak.yurdakul"/>
</release-item-contributor-list>
<p>Fix issue restoring block incremental without a block list.</p>
<p>A block map with no blocks, which is written when a file timestamp changes but the file does not, was not decrypted when it followed a file stored without block incremental in the same bundle read. With enough affected files the retries were exhausted and the restore failed.</p>
</release-item>
</release-bug-list>
@@ -30,6 +31,8 @@
</release-item-contributor-list>
<p>Add <br-option>--repo-storage-tag</br-option> option to create object tags.</p>
<p>Set <setting>repo-storage-tag</setting> to add tags to the objects written to an <proper>S3</proper>, <proper>GCS</proper>, or <proper>Azure</proper> repository. Tags are set for each repository.</p>
</release-item>
<release-item>
@@ -42,6 +45,8 @@
</release-item-contributor-list>
<p>Add known hosts checking for <proper>SFTP</proper> storage driver.</p>
<p><proper>SFTP</proper> host keys are now checked against the known hosts files by default, i.e. <br-option>repo-sftp-host-key-check-type=strict</br-option>. Set <br-option>repo-sftp-host-key-check-type=accept-new</br-option> to add new hosts automatically, or <br-option>repo-sftp-host-key-check-type=none</br-option> to skip the check as before.</p>
</release-item>
<release-item>
@@ -61,6 +66,8 @@
</release-item-contributor-list>
<p>Support for dual stack connections.</p>
<p>Each address a host name resolves to is now tried in turn, e.g. an IPv6 address with no route to the host and then an IPv4 address, until one connects or the timeout expires. Repeated retry errors are also summarized in error messages.</p>
</release-item>
<release-item>
@@ -73,6 +80,8 @@
</release-item-contributor-list>
<p>Add backup size completed/total to <cmd>info</cmd> command <proper>JSON</proper> output.</p>
<p>The JSON output of the <cmd>info</cmd> command now includes the completed and total size of a backup in progress, so progress can be monitored by other programs.</p>
</release-item>
</release-feature-list>
@@ -86,6 +95,8 @@
</release-item-contributor-list>
<p>Multi-stanza check command.</p>
<p>When <setting>stanza</setting> is not specified, the <cmd>check</cmd> command now checks every stanza in the configuration.</p>
</release-item>
<release-item>
@@ -98,6 +109,8 @@
</release-item-contributor-list>
<p>Retry reads of <file>pg_control</file> until checksum is valid.</p>
<p>On some filesystems, e.g. ext4, a read of <file>pg_control</file> during a concurrent write can return torn data. The read is now retried until the checksum is valid.</p>
</release-item>
<release-item>
@@ -109,6 +122,8 @@
</release-item-contributor-list>
<p>Optimize WAL segment check after successful backup.</p>
<p>The check for WAL segments after a backup listed the storage once for each segment. Each WAL directory is now listed once and the list is reused.</p>
</release-item>
<release-item>
@@ -120,6 +135,8 @@
</release-item-contributor-list>
<p>Improve <proper>GCS</proper> multi-part performance.</p>
<p>Chunks of a multi-part upload are now uploaded as soon as they are available.</p>
</release-item>
<release-item>
@@ -131,6 +148,8 @@
</release-item-contributor-list>
<p>Allow <cmd>archive-get</cmd> command to run when stanza is stopped.</p>
<p>The <cmd>archive-get</cmd> command does not write to the repository, so it can now run while the stanza is stopped, as <cmd>restore</cmd> can.</p>
</release-item>
<release-item>
@@ -142,6 +161,8 @@
</release-item-contributor-list>
<p>Accept leading tilde in paths for SFTP public/private keys.</p>
<p>Paths for <setting>repo-sftp-private-key-file</setting> and <setting>repo-sftp-public-key-file</setting> may now begin with <path>~</path>, as documented.</p>
</release-item>
<release-item>
@@ -154,6 +175,8 @@
</release-item-contributor-list>
<p>Reload GCS credentials before renewing authentication token.</p>
<p>The service key file is now read again before the authentication token is renewed, so the key can be replaced while a command is running.</p>
</release-item>
</release-improvement-list>
@@ -168,6 +191,71 @@
<p>Add report option to <cmd>check</cmd> command.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update config.guess and config.sub to latest versions.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update xxHash to v0.8.2.</p>
</release-item>
<release-item>
<commit subject="Remove UNCONSTIFY() from gz compression module."/>
<commit subject="Adjust range check per Coverity complaint."/>
<commit subject="Refactor IoRead handling in backupFile()."/>
<commit subject="Encode key in HTTP query."/>
<commit subject="Add missing const qualifier to errorTypeList."/>
<commit subject="Use PROJECT_NAME constant instead of string literal."/>
<commit subject="Add missing comma in protocolParallelJobToLog()."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-contributor id="reid.thompson"/>
</release-item-contributor-list>
<p>Clean up code.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Finalize catalog number for PostgreSQL 16 release.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add prefix to meson build target to avoid conflicts.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Fix manifest command filter for files in a tablespace.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add block incremental info to restore detail logging.</p>
</release-item>
</release-development-list>
</release-core-list>
@@ -182,6 +270,8 @@
</release-item-contributor-list>
<p>Fix configuration reference example for the <br-option>tls-server-address</br-option> option.</p>
<p>The example <id>::*</id> was not valid. Use <id>*</id> for IPv4 or <id>::</id> for IPv6.</p>
</release-item>
<release-item>
@@ -192,6 +282,24 @@
<p>Fix command reference example for the <br-option>filter</br-option> option.</p>
</release-item>
</release-bug-list>
<release-development-list>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Split release notes into individual files.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update help title for the --annotation option.</p>
</release-item>
</release-development-list>
</release-doc-list>
<release-test-list>
@@ -209,5 +317,30 @@
<p>Allow <id>storage/sftp</id> unit test to run without <id>libssh2</id> installed.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<commit subject="Rename HRN_PG_CONTROL_OVERRIDE_PUT()."/>
<commit subject="Improve backup test harness to handle very large quantities of WAL."/>
<commit subject="Remove duplicate tests from storage/sftp unit test module."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve unit tests.</p>
</release-item>
<release-item>
<commit subject="Fix conflicting group in test containers."/>
<commit subject="New CI container build for PostgreSQL 16 rc1."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>CI updates.</p>
</release-item>
</release-development-list>
</release-test-list>
</release>

View File

@@ -19,6 +19,8 @@
</release-item-contributor-list>
<p>Fix regression in retries.</p>
<p>v2.48 dropped the retry that was made when an operation used up its whole timeout, so a timeout became an error, e.g. waiting for a socket to be writable on an object store. Two retries are now made even when the timeout has expired.</p>
</release-item>
<release-item>
@@ -32,6 +34,8 @@
</release-item-contributor-list>
<p>Fix recursive path remove in <proper>SFTP</proper> storage driver.</p>
<p>Some <proper>SFTP</proper> servers report permission denied instead of a failure when a directory is unlinked as a file, so removing a path recursively failed on those servers.</p>
</release-item>
</release-bug-list>
@@ -45,6 +49,8 @@
</release-item-contributor-list>
<p>Remove support for <proper>PostgreSQL</proper> <id>9.3</id>.</p>
<p><postgres/> 9.3 is no longer supported, per the policy of supporting five end-of-life versions of <postgres/>.</p>
</release-item>
</release-improvement-list>
@@ -59,6 +65,25 @@
<p>Fix <code>storageReadRemote()</code> to return actual read bytes.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update config.guess and config.sub to latest versions.</p>
</release-item>
<release-item>
<commit subject="More efficient/compact calculations for encoded sizes."/>
<commit subject="Remove unused parameter in backupProcess()."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Clean up code.</p>
</release-item>
</release-development-list>
</release-core-list>
@@ -73,6 +98,8 @@
</release-item-contributor-list>
<p>Document maintainer options.</p>
<p>Maintainer options are now documented in their own section with the caveats for using them, and <setting>pg-version-force</setting> is no longer internal.</p>
</release-item>
<release-item>
@@ -81,6 +108,8 @@
</release-item-contributor-list>
<p>Update point-in-time recovery documentation for <postgres/> &gt;= 13.</p>
<p>Since <postgres/> 13 recovery errors when the recovery target is not reached. The point-in-time recovery section now works for <postgres/> 13 and later as well as for earlier versions.</p>
</release-item>
</release-feature-list>
@@ -95,8 +124,31 @@
<commit subject="Simplify section titles in configuration reference."/>
<commit subject="Simplify description rendering in command and configuration reference."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Build command and configuration reference in C.</p>
</release-item>
<release-item>
<commit subject="Tidy and align site introduction and description."/>
<commit subject="Remove old version conditionals from user guide."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update the site introduction and the user guide.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update Minio test/documentation container version.</p>
</release-item>
</release-development-list>
</release-doc-list>
@@ -127,6 +179,32 @@
<p>Remove unused fields from <code>backupJobResult()</code> test in command/backup unit.</p>
</release-item>
<release-item>
<commit subject="Fix common/lock test failing with -Werror=unused-result.">
<github-pull-request id="2195"/>
</commit>
<commit subject="Adjust timeouts in the common/io/tls test to fix flapping coverage."/>
<commit subject="Refactor of pq shim to allow more flexible scripting."/>
<commit subject="Migrate backupFile() tests in command/backup module."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-contributor id="reid.thompson"/>
</release-item-contributor-list>
<p>Improve unit tests.</p>
</release-item>
<release-item>
<release-note version="2.50" subject="Skip files truncated during backup when bundling."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add test to show behavior of bundled files truncated during backup.</p>
</release-item>
</release-development-list>
</release-test-list>
</release>

View File

@@ -11,11 +11,12 @@
<release-item-ideator id="brent.graveland"/>
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="stephen.frost"/>
<!-- Actually tester, but we don't have a tag for that yet -->
<release-item-reviewer id="brent.graveland"/>
<release-item-tester id="brent.graveland"/>
</release-item-contributor-list>
<p>Fix short read in block incremental restore.</p>
<p>A compressed super block can end with bytes that are not needed to decompress it but mark the end of the data. Depending on how a buffer lined up with the data, these bytes were not read and the restore failed.</p>
</release-item>
<release-item>
@@ -30,6 +31,8 @@
</release-item-contributor-list>
<p>Fix overflow suppressing backup progress in <cmd>info</cmd> output.</p>
<p>The sizes in the lock file were read as 32-bit values, so the <cmd>info</cmd> command did not report progress for a backup larger than 4GiB.</p>
</release-item>
</release-bug-list>
@@ -43,6 +46,8 @@
</release-item-contributor-list>
<p>Preserve partial files during block incremental delta restore.</p>
<p>A file smaller than expected was not kept for a block incremental delta restore, although its blocks can be reused, e.g. when retrying a restore that failed or restoring over a smaller file.</p>
</release-item>
<release-item>
@@ -54,6 +59,8 @@
</release-item-contributor-list>
<p>Add support for alternate compile-time page sizes.</p>
<p><postgres/> can be built with a different page size, e.g. 4096, and forks such as <proper>Greenplum</proper> do this.</p>
</release-item>
<release-item>
@@ -69,6 +76,8 @@
</release-item-contributor-list>
<p>Skip files truncated during backup when bundling.</p>
<p>A file truncated to zero after the files were assigned to bundles was still stored in its bundle, and a debug build failed an assertion. These files are now skipped.</p>
</release-item>
<release-item>
@@ -99,6 +108,81 @@
<p>Refactor backup incremental manifest generation.</p>
</release-item>
<release-item>
<commit subject="Allow custom type/message for errRetryAdd()."/>
<commit subject="Refactor backupFile() to remove backupCopyResultReCopy."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Refactor backup and retry code.</p>
</release-item>
<release-item>
<commit subject="Use original file size to log size changes during backup."/>
<commit subject="Update warning for backup resume invalid repo file."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve logging of file size changes and resume warnings during backup.</p>
</release-item>
<release-item>
<commit subject="Improve comments in socket test harness."/>
<commit subject="Fix incorrect test comment."/>
<commit subject="Remove resolved comment."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-contributor id="reid.thompson"/>
</release-item-contributor-list>
<p>Fix comments.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update LICENSE.txt and PostgreSQL copyright for 2024.</p>
</release-item>
</release-development-list>
</release-core-list>
<release-test-list>
<release-development-list>
<release-item>
<commit subject="Use unique port for each server unit test."/>
<commit subject="Fix flapping test on older ninja versions in test unit."/>
<commit subject="Add block incremental test where timestamp changes but file is the same."/>
<commit subject="Add tests to command/backup and info/manifest modules."/>
<commit subject="Move block testBlockDelta() to harness module."/>
<commit subject="Break up scripts in db unit test module."/>
<commit subject="Cleanup tablespace tests in command/backup module."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve unit tests.</p>
</release-item>
<release-item>
<commit subject="Output coverage report on test failure in CI."/>
<commit subject="Remove FreeBSD 12 and add FreeBSD 14 to Cirrus CI."/>
<commit subject="Remove installation of old yum.p.o repository key."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>CI updates.</p>
</release-item>
</release-development-list>
</release-test-list>
</release>

View File

@@ -13,6 +13,8 @@
</release-item-contributor-list>
<p>Skip zero-length files for block incremental delta restore.</p>
<p>An existing zero-length file caused a block incremental delta restore to fail in the block checksum filter. These files are now skipped, since there is nothing in them to reuse.</p>
</release-item>
<release-item>
@@ -26,6 +28,8 @@
</release-item-contributor-list>
<p>Fix performance regression in storage list.</p>
<p>Listing a path requested detailed information for each file, which could be slow, e.g. on object stores. Only the information the list needs is now requested.</p>
</release-item>
<release-item>
@@ -54,6 +58,8 @@
</release-item-contributor-list>
<p>Improved support for dual stack connections.</p>
<p>When a host name resolves to more than one address, e.g. IPv4 and IPv6, the next address is tried once the prior address has had reasonable time to connect, following the <quote>happy eyeballs</quote> approach of RFC 8305. A connection attempt that neither fails nor connects no longer uses up all the available time.</p>
</release-item>
<release-item>
@@ -70,6 +76,8 @@
</release-item-contributor-list>
<p>Make meson the primary build system.</p>
<p><proper>meson</proper> is now the build system used for testing and for building the documentation. Functions not used outside their module are now hidden, which makes the binary smaller.</p>
</release-item>
<release-item>
@@ -81,6 +89,8 @@
</release-item-contributor-list>
<p>Detect files that have not changed during non-delta incremental backup.</p>
<p>During a non-delta diff or incr backup, a file that fits in a single buffer, or any block incremental file, is compared to the file in the prior backup and referenced instead of stored when it has not changed.</p>
</release-item>
<release-item>
@@ -92,6 +102,8 @@
</release-item-contributor-list>
<p>Prevent invalid recovery when <file>backup_label</file> removed.</p>
<p>When <file>backup_label</file> is removed from a restored cluster, <postgres/> uses the checkpoint in <file>pg_control</file> for crash recovery, which nearly always corrupts the cluster. Restore now invalidates the checkpoint in <file>pg_control</file>, so recovery fails instead. <file>pg_controldata</file> shows the checkpoint as <id>0/DEAD</id>.</p>
</release-item>
<release-item>
@@ -103,6 +115,8 @@
</release-item-contributor-list>
<p>Improve <cmd>archive-push</cmd> WAL segment queue handling.</p>
<p>The size of every WAL segment in the queue was read to measure the queue. The size of the first segment is now used for all of them.</p>
</release-item>
<release-item>
@@ -115,6 +129,8 @@
</release-item-contributor-list>
<p>Limit resume functionality to full backups.</p>
<p>Resume did not work correctly for delta diff and incr backups, and a file that changed since the prior backup is likely to change again before a resume. Only full backups are resumed now.</p>
</release-item>
<release-item>
@@ -126,6 +142,8 @@
</release-item-contributor-list>
<p>Update resume functionality for block incremental.</p>
<p>Resume removed block incremental files, so it worked but copied all of them again. Block incremental files are now kept on resume.</p>
</release-item>
<release-item>
@@ -138,6 +156,8 @@
</release-item-contributor-list>
<p>Allow <setting>--version</setting> and <setting>--help</setting> for version and help.</p>
<p><br-option>--version</br-option> and <br-option>--help</br-option> now work as they do for most programs. Use <cmd>help</cmd> for help on a specific command or option.</p>
</release-item>
<release-item>
@@ -149,6 +169,8 @@
</release-item-contributor-list>
<p>Add detailed backtrace to <proper>autoconf</proper>/<proper>make</proper> build.</p>
<p>Error stack traces in the <proper>autoconf</proper>/<proper>make</proper> build now include detail from <proper>libbacktrace</proper>, which performance tests showed has no noticeable cost.</p>
</release-item>
</release-improvement-list>
@@ -163,6 +185,52 @@
<p>Improve sort comparators.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Fix help not displaying help for the help command.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update config.guess and config.sub to latest versions.</p>
</release-item>
<release-item>
<commit subject="Add asserts to default switch cases in common/type/variant module."/>
<commit subject="Move assert in cmdServerSigChild()."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve asserts.</p>
</release-item>
<release-item>
<commit subject="Add validation for WAL segment size in pg_control."/>
<commit subject="Add validation for page checksum version in pg_control."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Validate more fields in <file>pg_control</file>.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Redact secure options in check --report.</p>
</release-item>
</release-development-list>
</release-core-list>
@@ -178,7 +246,68 @@
</release-item-contributor-list>
<p>Update references to <file>recovery.conf</file>.</p>
<p>References to <file>recovery.conf</file> now include <file>postgresql.auto.conf</file>, which newer versions of <postgres/> use.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Migrate man page generation to C.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add release instructions to update PostgreSQL ecosystem wiki.</p>
</release-item>
</release-development-list>
</release-doc-list>
<release-test-list>
<release-development-list>
<release-item>
<commit subject="Disable log expect testing for non-unit tests."/>
<commit subject="Remove mock integration tests."/>
<commit subject="Migrate integration tests to C."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Migrate integration tests to C.</p>
</release-item>
<release-item>
<commit subject="Simplify output in command/backup unit tests."/>
<commit subject="Remove unneeded backupTimeStart parameter from testBackupValidate()."/>
<commit subject="Add execOne() to simplify exec for build, documentation, and testing."/>
<commit subject="Remove obsolete valgrind suppression."/>
<commit subject="Make valgrind libssh2 leak check less specific."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve unit tests and test tools.</p>
</release-item>
<release-item>
<commit subject="Update Cirrus CI BSD image to 13.3."/>
<commit subject="Disable arm64 test in CirrusCI."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>CI updates.</p>
</release-item>
</release-development-list>
</release-test-list>
</release>

View File

@@ -15,6 +15,8 @@
</release-item-contributor-list>
<p>Fix issue with files larger on the replica than on the primary.</p>
<p>With block incremental, when a file was a different size on the primary than on the standby during a backup from standby, the next diff or incr backup stored the size from the primary. The backup after that failed with <quote>repo size must be &gt; 0</quote>.</p>
</release-item>
</release-bug-list>
</release-core-list>

View File

@@ -14,6 +14,8 @@
</release-item-contributor-list>
<p>Add <proper>GCS</proper> batch delete support.</p>
<p>Files are removed with batch requests instead of one request per file, which speeds up <cmd>expire</cmd> and other commands that remove files from the repository.</p>
</release-item>
<release-item>
@@ -27,6 +29,8 @@
</release-item-contributor-list>
<p><proper>S3</proper> <id>SSE-C</id> encryption support.</p>
<p>Set <setting>repo-s3-sse-customer-key</setting> to have <proper>S3</proper> encrypt the data with the provided key after it is transmitted. This is not as secure as encrypting the data before it is transmitted with <setting>repo-cipher-type</setting>.</p>
</release-item>
<release-item>
@@ -40,6 +44,8 @@
</release-item-contributor-list>
<p><proper>PostgreSQL</proper> 17beta1 support.</p>
<p>Adds the catalog version and WAL magic number for <postgres/> 17.</p>
</release-item>
</release-feature-list>
@@ -53,6 +59,8 @@
</release-item-contributor-list>
<p>Allow explicit disabling of optional dependencies in meson builds.</p>
<p>An optional feature can be disabled in the <proper>meson</proper> build even when its library is installed, as some platforms require, e.g. <proper>FreeBSD</proper>. By default a feature is enabled when its library is found.</p>
</release-item>
<release-item>
@@ -67,6 +75,8 @@
</release-item-contributor-list>
<p>Dynamically find <proper>python</proper> in <proper>meson</proper> build.</p>
<p>The <proper>meson</proper> build now finds the <proper>python</proper> installation instead of requiring a <file>python3</file> binary on the path, e.g. when only <file>python3.9</file> is installed. The minimum <proper>meson</proper> version is now 0.47.</p>
</release-item>
<release-item>
@@ -92,6 +102,46 @@
<p>Update Fedora test image to Fedora 38.</p>
</release-item>
<release-item>
<commit subject="Update command module to recent coding standards."/>
<commit subject="Update common module to recent coding standards."/>
<commit subject="Update config module to recent coding standards."/>
<commit subject="Update db/postgres modules to recent coding standards."/>
<commit subject="Update info module to recent coding standards."/>
<commit subject="Update storage (except remote) module to recent coding standards."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update modules to recent coding standards.</p>
</release-item>
<release-item>
<commit subject="Remove ASSERT() in sckClientOpen() to silence Coverity complaint."/>
<commit subject="Silence invalid Coverity complaint in jsonReadPush()."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Silence Coverity complaints.</p>
</release-item>
<release-item>
<commit subject="Remove extra space before colons in meson.build files."/>
<commit subject="Allow strIdToLog() to output &quot;null&quot; values."/>
<commit subject="Fix comment typo."/>
<commit subject="Replace erroneous THROW_SYS_ERROR_FMT() in storageInfo()."/>
<commit subject="Fix comment typos and formatting."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Clean up code and comments.</p>
</release-item>
</release-development-list>
</release-core-list>
@@ -110,5 +160,48 @@
<p>Update <cmd>start</cmd>/<cmd>stop</cmd> documentation to reflect actual functionality.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<commit subject="Update contributor name."/>
<commit subject="Move packager note about meson to new version."/>
<commit subject="Exclude documentation code coverage from metrics report."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update the contributors, release notes, and metrics report.</p>
</release-item>
</release-development-list>
</release-doc-list>
<release-test-list>
<release-development-list>
<release-item>
<commit subject="Remove test data files made obsolete by d41b21c8."/>
<commit subject="Improve unit testing of valid page sizes in pg_control."/>
<commit subject="Add hrnTzSet() to set timezone in tests."/>
<commit subject="Explicitly run test servers on ipv4 localhost."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve unit tests.</p>
</release-item>
<release-item>
<commit subject="Update Fedora test image to Fedora 40."/>
<commit subject="Update GitHub test checkout and codeql action versions."/>
<commit subject="New CI container build for PostgreSQL 17 beta1."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>CI updates.</p>
</release-item>
</release-development-list>
</release-test-list>
</release>

View File

@@ -12,6 +12,8 @@
</release-item-contributor-list>
<p>Fix permissions when <cmd>restore</cmd> run as root user.</p>
<p>When <cmd>restore</cmd> was run as root, <file>pg_control</file> was owned by root. A restore as root also failed when the base path did not exist.</p>
</release-item>
<release-item>
@@ -25,6 +27,8 @@
</release-item-contributor-list>
<p>Fix segfault on delayed connection errors.</p>
<p>A connection error that was delayed long enough to be reported on a later wait could cause a segfault.</p>
</release-item>
<release-item>
@@ -38,17 +42,45 @@
</release-item-contributor-list>
<p>Skip local repository duplicate check for <proper>SFTP</proper>.</p>
<p>The check for local repositories that are configured more than once was also applied to <proper>SFTP</proper> repositories, which are never local.</p>
</release-item>
</release-bug-list>
<release-improvement-list>
<release-item>
<commit subject="PostgreSQL 17beta3 support."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p><proper>PostgreSQL</proper> 17 support.</p>
<p><postgres/> 17beta3 changed the control and WAL formats, which is unusual for a beta.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Do not allow help for command roles other than main.</p>
</release-item>
</release-development-list>
</release-core-list>
<release-doc-list>
<release-development-list>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="aleksey.tsalolikhin"/>
</release-item-contributor-list>
<p>Fix typo in user guide.</p>
</release-item>
</release-development-list>
</release-doc-list>
</release>

View File

@@ -19,6 +19,8 @@
</release-item-contributor-list>
<p>Fix <proper>SFTP</proper> renaming failure when file already exists.</p>
<p>Some <proper>SFTP</proper> servers report that a file already exists with an error that was not handled, so renaming a file over an existing file failed.</p>
</release-item>
</release-bug-list>
@@ -39,6 +41,8 @@
</release-item-contributor-list>
<p>Allow backups to run concurrently on different repositories.</p>
<p>Backups of the same stanza can now run at the same time on different repositories, since locks are now per stanza and repository instead of per stanza. This is not possible for <postgres/> &lt;= 9.5.</p>
</release-item>
<release-item>
@@ -51,6 +55,8 @@
</release-item-contributor-list>
<p>Support IP-based SANs for <proper>TLS</proper> certificate validation.</p>
<p>Certificates with an IP address as the subject alternative name, e.g. <id>IP:1.2.3.4</id>, are now validated. IPv4 and IPv6 addresses must match exactly.</p>
</release-item>
</release-feature-list>
@@ -65,6 +71,8 @@
</release-item-contributor-list>
<p>Default <setting>log-level-stderr</setting> option to <id>off</id>.</p>
<p>Warnings and errors written to stderr were often lost when only stdout was redirected while collecting logs. An explicitly set <setting>log-level-stderr</setting> is not affected.</p>
</release-item>
<release-item>
@@ -78,6 +86,8 @@
</release-item-contributor-list>
<p>Allow alternative WAL segment sizes for PostgreSQL &amp;le; 10.</p>
<p><postgres/> &lt;= 10 can be built with a different WAL segment size, and forks such as <proper>Greenplum</proper> set it with <file>initdb</file>.</p>
</release-item>
<release-item>
@@ -91,8 +101,102 @@
</release-item-contributor-list>
<p>Add hint to check <proper>SFTP</proper> authorization log.</p>
<p>When <proper>SFTP</proper> authentication fails the error now hints that the authorization log on the server may have more detail.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Display time option defaults and allowed values with appropriate units.</p>
<p>Time option defaults and allowed values were shown in seconds, which was hard to read for large values. Fractional seconds are no longer allowed, so a value such as <br-option>archive-timeout=0.5</br-option> must be written as <br-option>archive-timeout=500ms</br-option>.</p>
</release-item>
<release-item>
<commit subject="Require OpenSSL &gt;= 1.1.1."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Require <proper>OpenSSL</proper> &gt;= 1.1.1.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<commit subject="Require compiler support for __builtin_clzl() and __builtin_bswap64()."/>
<commit subject="Require the lz4 library in the meson build."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Require the lz4 library and compiler builtins in the meson build.</p>
</release-item>
<release-item>
<commit subject="Fix invalid default inherited in job-retry-interval."/>
<commit subject="Add units to all option sizes."/>
<commit subject="Improve error messages for allow range and allow list options."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve option units, defaults, and error messages.</p>
</release-item>
<release-item>
<commit subject="Optimize assignment of command/option rules."/>
<commit subject="Remove PARSE_RULE_OPTION_GROUP_MEMBER() macro from parse.auto.c.inc."/>
<commit subject="Shorten enums used in parse.auto.c.inc."/>
<commit subject="Improve command/role parsing."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve option and command parsing.</p>
</release-item>
<release-item>
<commit subject="Avoid possible race condition while reading lock files in info command."/>
<commit subject="Simplify lock file scanning in stop command."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve reading lock files in the <cmd>info</cmd> and <cmd>stop</cmd> commands.</p>
</release-item>
<release-item>
<commit subject="Improve efficiency of incremental manifest build."/>
<commit subject="Refactor backup to use flag for backup standby state rather than option."/>
<commit subject="Replace strftime() with cvtTimeToZP() and strNew/CatTimeP()."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Refactor the backup and manifest code.</p>
</release-item>
<release-item>
<commit subject="Replace tabs with spaces in meson.build files."/>
<commit subject="Fix overly long lines."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Fix formatting.</p>
</release-item>
</release-development-list>
</release-core-list>
<release-doc-list>
@@ -106,7 +210,62 @@
</release-item-contributor-list>
<p>Clarify <cmd>archive-push</cmd> multi-repo behavior.</p>
<p>When one repository is failing, <cmd>archive-push</cmd> cannot push ahead to the other repositories unless <setting>archive-async</setting> is enabled.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<commit subject="Clarify when code generation is run when modifying config.yaml."/>
<commit subject="Remove references to mock integration tests."/>
<commit subject="Fix incorrect examples in doc/test help."/>
<commit subject="Improve config file handling in doc/test config load."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update the contributing documentation and the documentation and test tools.</p>
</release-item>
</release-development-list>
</release-doc-list>
<release-test-list>
<release-development-list>
<release-item>
<commit subject="Migrate coverage testing to C and remove dependency on lcov."/>
<commit subject="Fix --run and --scale options for unit tests."/>
<commit subject="Increase width of unsigned integration in performance/type module."/>
<commit subject="Auto-generate code before building test binary."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Migrate coverage testing to C and remove dependency on lcov.</p>
</release-item>
<release-item>
<commit subject="Migrate CentOS 7 integration tests to Rocky 8."/>
<commit subject="Specify test images that get valgrind installed."/>
<commit subject="Remove obsolete vm constants."/>
<commit subject="Update EOL Debian 10 to Debian 11/Ubuntu 20.04 in CI."/>
<commit subject="Update Minio test/documentation container version."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>CI updates.</p>
</release-item>
</release-development-list>
</release-test-list>
<release-backpatch-list>
<release-backpatch version="2.52.1">
<commit subject="Add unit tests for backup from standby with block incremental."/>
<commit subject="Fix issue with files larger on the replica than on the primary."/>
</release-backpatch>
</release-backpatch-list>
</release>

View File

@@ -19,11 +19,12 @@
<release-item-contributor id="thibault.vincent"/>
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="david.christensen"/>
<!-- Actually tester, but we don't have a tag for that yet -->
<release-item-reviewer id="antoine.millet"/>
<release-item-tester id="antoine.millet"/>
</release-item-contributor-list>
<p>Fix <postgres/> query performance for large datasets.</p>
<p>The query timeout logic delayed reading query results, which could make a query that returned a large result take up to <setting>db-timeout</setting>. Results are now read as soon as they are available.</p>
</release-item>
</release-bug-list>
@@ -38,6 +39,8 @@
</release-item-contributor-list>
<p>Allow repositories on versioned storage to be read at a target time.</p>
<p>The <cmd>archive-get</cmd>, <cmd>info</cmd>, <cmd>repo-get</cmd>, <cmd>repo-ls</cmd>, <cmd>restore</cmd>, and <cmd>verify</cmd> commands can read a repository on versioned <proper>Azure</proper>, <proper>GCS</proper>, or <proper>S3</proper> storage as it was at <setting>repo-target-time</setting>. This allows recovery even when the repository has been deleted or corrupted, accidentally or maliciously.</p>
</release-item>
<release-item>
@@ -49,6 +52,8 @@
</release-item-contributor-list>
<p>Allow requested standby backup to proceed with no standby.</p>
<p>Set <br-option>backup-standby=prefer</br-option> to back up from a standby when one is available and from the primary otherwise. This does not help when the standby responds but fails to sync with the primary after the backup starts.</p>
</release-item>
</release-feature-list>
@@ -62,6 +67,8 @@
</release-item-contributor-list>
<p>Summarize backup reference list for <cmd>info</cmd> command text output.</p>
<p>The backup reference list can be very long, so the text output of the <cmd>info</cmd> command now summarizes it. The full list is shown when <br-option>--set</br-option> is specified.</p>
</release-item>
<release-item>
@@ -74,6 +81,8 @@
</release-item-contributor-list>
<p>Refresh web-id token for each <proper>S3</proper> authentication.</p>
<p>The token file named by <id>AWS_WEB_IDENTITY_TOKEN_FILE</id> was read once at startup, so the token could expire during a long operation. The token is now read for each authentication.</p>
</release-item>
<release-item>
@@ -85,6 +94,8 @@
</release-item-contributor-list>
<p>Correctly display current values for indexed options in help.</p>
<p>The current value shown for an indexed option was always the value for the first index, e.g. <setting>pg1-path</setting>. The option help now lists the value for each index, and the option list shows <id>&lt;multi&gt;</id> when there is more than one.</p>
</release-item>
<release-item>
@@ -96,10 +107,17 @@
</release-item-contributor-list>
<p>Save <file>backup.info</file> only when contents have changed.</p>
<p><cmd>expire</cmd> saved <file>backup.info</file> even when it had not changed. Fewer saves also make it easier to choose a target time on versioned storage.</p>
</release-item>
<release-item>
<github-pull-request id="2436"/>
<commit subject="Protocol command multiplexing.">
<github-pull-request id="2108"/>
</commit>
<commit subject="Remove limitation on reading files in parallel during restore.">
<github-pull-request id="2436"/>
</commit>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
@@ -107,6 +125,8 @@
</release-item-contributor-list>
<p>Remove limitation on reading files in parallel during restore.</p>
<p>The protocol could only read or write one file at a time on a remote, so a restore read one file at a time from the repository. Protocol commands can now be multiplexed, so a restore can read more than one file at a time, e.g. a bundle and the block incremental data for a file in it.</p>
</release-item>
<release-item>
@@ -118,19 +138,54 @@
</release-item-contributor-list>
<p>Improve <proper>SFTP</proper> error messages.</p>
<p><proper>SFTP</proper> errors were reported as numbers only. They now include a description of the error.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<github-pull-request id="2108"/>
<commit subject="Remove internal repo-create command."/>
<commit subject="Refactor config parse to remove none command, add version/help options."/>
<commit subject="Simplify main() functions in core, doc, and test."/>
<commit subject="Reduce logging for help functions."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="david.christensen"/>
</release-item-contributor-list>
<p>Protocol command multiplexing.</p>
<p>Refactor config parsing and the help and version commands.</p>
</release-item>
<release-item>
<commit subject="Update protocol and storage/remote modules to recent coding standards."/>
<commit subject="Use Posix driver to complete dummy storage driver."/>
<commit subject="Move getEpoch() to cvtZToTime() and refactor."/>
<commit subject="Refactor interface/driver getters for IoRead/Write and StorageRead/Write."/>
<commit subject="Update comment in storage/list module."/>
<commit subject="Remove invalid const keywords from info/infoBackup module."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Refactor the storage and protocol modules.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Finalize catalog number for PostgreSQL 17 release.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Retry socket bind.</p>
</release-item>
</release-development-list>
</release-core-list>
@@ -146,6 +201,8 @@
</release-item-contributor-list>
<p>Add performance tuning section to user guide.</p>
<p>The options that commonly improve performance were spread through the documentation. The quickstart now has a section that lists them.</p>
</release-item>
</release-feature-list>
@@ -161,6 +218,8 @@
</release-item-contributor-list>
<p>Clarify source for <setting>data_directory</setting>.</p>
<p><setting>pg-path</setting> should match the <setting>data_directory</setting> reported by <postgres/>, which may differ from the value in <file>postgresql.conf</file>.</p>
</release-item>
<release-item>
@@ -172,7 +231,80 @@
</release-item-contributor-list>
<p>Better logic for deciding when a summary should be lower-cased.</p>
<p>Summaries that start with a proper name or an acronym, e.g. <postgres/>, are no longer lower-cased in the documentation.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<commit subject="Skip command-line options in configuration reference."/>
<commit subject="Use `uname -m` to get architecture for RHEL package in user guide."/>
<commit subject="Render command help summaries the same as option help summaries."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update documentation.</p>
</release-item>
<release-item>
<commit subject="Use output path for temp config files during documentation build."/>
<commit subject="Use systemctl replacement to generate documentation."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve documentation build.</p>
</release-item>
</release-development-list>
</release-doc-list>
<release-test-list>
<release-development-list>
<release-item>
<commit subject="Improve TEST_STORAGE_GET() to allow testing of missing files."/>
<commit subject="Improve file removal performed after each unit test."/>
<commit subject="Improve reporting of partial reads in server test harness."/>
<commit subject="Add hrnSleepRemainder() to time test harness."/>
<commit subject="Refactor storage/remote module to move more repository storage tests."/>
<commit subject="Refactor storage/remote module to move repository storage tests."/>
<commit subject="Simplify command/repo tests."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve test harness and unit tests.</p>
</release-item>
<release-item>
<commit subject="Update Cirrus CI MacOS running to Sonoma."/>
<commit subject="Shuffle PostgreSQL versions between test containers."/>
<commit subject="Move SFTP test off of PostgreSQL version tested by 32-bit."/>
<commit subject="Update CI containers to include newest PostgreSQL patch releases."/>
<commit subject="Update CI tests for ppc64le/s390x architectures."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>CI updates.</p>
</release-item>
</release-development-list>
</release-test-list>
<release-backpatch-list>
<release-backpatch version="2.53.1">
<commit subject="Do not allow help for command roles other than main."/>
<commit subject="Fix typo in user guide."/>
<commit subject="Fix permissions when restore run as root user."/>
<commit subject="PostgreSQL 17beta3 support."/>
<commit subject="Skip local repository duplicate check for SFTP."/>
<commit subject="Fix segfault on delayed connection errors."/>
<commit subject="Merge v2.53.1 release."/>
</release-backpatch>
</release-backpatch-list>
</release>

View File

@@ -13,10 +13,42 @@
</release-item-contributor-list>
<p>Fix issue with <cmd>version</cmd>/<cmd>help</cmd> commands attempting to load <file>pgbackrest.conf</file>.</p>
<p>In v2.54.0 the <cmd>version</cmd> and <cmd>help</cmd> commands loaded <file>pgbackrest.conf</file> and failed when it could not be read or parsed.</p>
</release-item>
</release-bug-list>
<release-development-list>
<release-item>
<commit subject="Exclude function logging macros from coverage reporting."/>
<commit subject="Exclude function void return logging macros from coverage reporting."/>
<commit subject="Fix misplaced volatile qualifiers in GCS authorization JWT generation."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Exclude logging macros from coverage reporting and fix volatile qualifiers.</p>
</release-item>
</release-development-list>
</release-core-list>
<release-doc-list>
<release-development-list>
<release-item>
<commit subject="Update release notes for PostgreSQL 17 support."/>
<commit subject="Change &quot;find&quot; to &quot;visit&quot; in introduction."/>
<commit subject="Rephrase invitation to star on Github."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update documentation and release notes.</p>
</release-item>
</release-development-list>
</release-doc-list>
<release-test-list>
<release-improvement-list>
<release-item>
@@ -29,7 +61,23 @@
</release-item-contributor-list>
<p>Stabilize async archiving in integration tests.</p>
<p>An async <cmd>archive-get</cmd> left running by one integration test could write an error to the queue of the next test and fail its recovery.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<commit subject="Add wait for async archive log exists check in integration test."/>
<commit subject="Update Cirrus MacOS runner to OpenSSL 3."/>
<commit subject="Update Fedora test image to Fedora 41."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update CI and integration tests.</p>
</release-item>
</release-development-list>
</release-test-list>
</release>

View File

@@ -10,8 +10,20 @@
</release-item-contributor-list>
<p>Fix issue after disabling bundling with block incremental enabled.</p>
<p>When bundling was disabled after backups were made with bundling and block incremental enabled, the prior backups could not be read. The setting needed to read them is now preserved.</p>
</release-item>
</release-bug-list>
<release-development-list>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update LICENSE.txt and PostgreSQL copyright for 2025.</p>
</release-item>
</release-development-list>
</release-core-list>
<release-doc-list>
@@ -24,7 +36,34 @@
</release-item-contributor-list>
<p>Clarify behavior of multiple configuration files.</p>
<p>Each configuration file must be valid on its own, so a section must be specified in each file that sets an option in it. The documentation also notes that quoting is not supported, whitespace is trimmed from keys and values, and repeated sections are merged.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Clarify that unhandled errors may occur in edge cases.</p>
</release-item>
</release-development-list>
</release-doc-list>
<release-test-list>
<release-development-list>
<release-item>
<commit subject="Fix compression type in integration tests."/>
<commit subject="Update runner versions on Github actions."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update CI and integration tests.</p>
</release-item>
</release-development-list>
</release-test-list>
</release>

View File

@@ -9,11 +9,12 @@
<release-item-ideator id="aleksander.lukasz"/>
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="david.christensen"/>
<!-- Actually tester, but we don't have a tag for that yet -->
<release-item-reviewer id="aleksander.lukasz"/>
<release-item-tester id="aleksander.lukasz"/>
</release-item-contributor-list>
<p>Fix block incremental restore issue on non-default repository.</p>
<p>When the backup being restored used block incremental and was not in the lowest numbered repository, the restore read part of the block incremental data from the lowest numbered repository. Setting <setting>repo</setting> worked around the problem.</p>
</release-item>
<release-item>
@@ -25,6 +26,8 @@
</release-item-contributor-list>
<p>Do not set <br-option>recovery_target_timeline=current</br-option> for PostgreSQL &amp;lt; 12.</p>
<p>Before <postgres/> 12, explicitly setting <pg-setting>recovery_target_timeline</pg-setting> to <id>current</id> behaves as <id>latest</id>, although <id>current</id> is the default. The setting is now left out of <file>recovery.conf</file> when it is set to <id>current</id> for these versions.</p>
</release-item>
<release-item>
@@ -38,6 +41,8 @@
</release-item-contributor-list>
<p>Fix expire archive range logging.</p>
<p>Only the last archive path removed was logged as the start of the range, so the log suggested that far fewer files were expired than were.</p>
</release-item>
<release-item>
@@ -50,6 +55,8 @@
</release-item-contributor-list>
<p>Fix error reporting for queries with no results.</p>
<p>An error from a query that expected no results was reported as an unexpected result instead of as the error.</p>
</release-item>
</release-bug-list>
@@ -63,9 +70,12 @@
</release-item-contributor-list>
<p>Verify recovery target timeline.</p>
<p>A backup that cannot follow the target timeline, e.g. one made after a standby was promoted and the new timeline forked off, failed only when recovery started, with a <postgres/> error that is hard to interpret. The timeline is now checked against the history files before the restore starts.</p>
</release-item>
<release-item>
<github-issue id="2419"/>
<github-pull-request id="2544"/>
<release-item-contributor-list>
@@ -74,6 +84,8 @@
</release-item-contributor-list>
<p>Allow verification of a specified backup.</p>
<p>The <cmd>verify</cmd> option <br-option>--set</br-option> verifies only the specified backup and the WAL required to make it consistent.</p>
</release-item>
<release-item>
@@ -90,6 +102,8 @@
</release-item-contributor-list>
<p>Add support for S3/GCS requester pays.</p>
<p>Set <setting>repo-s3-requester-pays</setting> or <setting>repo-gcs-user-project</setting> to bill the requester instead of the bucket owner, e.g. so a hosted service can give customers access to their backups.</p>
</release-item>
<release-item>
@@ -103,6 +117,8 @@
</release-item-contributor-list>
<p><proper>PostgreSQL</proper> 18 support.</p>
<p>This release was made before <postgres/> 18 had a beta, so support was initially experimental. Nothing that affects <backrest/> changed before <postgres/> 18.0.</p>
</release-item>
<release-item>
@@ -112,11 +128,12 @@
<release-item-contributor-list>
<release-item-ideator id="chris.bandy"/>
<release-item-contributor id="david.steele"/>
<!-- Actually tester, but we don't have a tag for that yet -->
<release-item-reviewer id="chris.bandy"/>
<release-item-tester id="chris.bandy"/>
</release-item-contributor-list>
<p>Allow connections to <postgres/> on abstract domain sockets.</p>
<p><setting>pg-socket-path</setting> no longer has to be an absolute path, so it can name an abstract domain socket. <proper>libpq</proper> reports a path that is not valid.</p>
</release-item>
<release-item>
@@ -129,12 +146,17 @@
</release-item-contributor-list>
<p>Add numeric output to <cmd>version</cmd> command.</p>
<p>Set <br-option>--output=num</br-option> to output the version as a number, e.g. 2055000, which is easier to compare.</p>
</release-item>
</release-feature-list>
<release-improvement-list>
<release-item>
<github-pull-request id="2512"/>
<commit subject="Refactor protocol helper."/>
<commit subject="Allow backup command to operate on remote repositories.">
<github-pull-request id="2512"/>
</commit>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
@@ -142,6 +164,8 @@
</release-item-contributor-list>
<p>Allow backup command to operate on remote repositories.</p>
<p>The <cmd>backup</cmd> command can now run on a host where the repository is remote, which allows more flexibility in where backups are run.</p>
</release-item>
<release-item>
@@ -156,6 +180,8 @@
</release-item-contributor-list>
<p>Use <proper>lz4</proper> for protocol compression.</p>
<p><proper>lz4</proper> compresses much faster than gz and gives similar ratios at the low levels used for protocol compression. Setting <br-option>compress-level-network=0</br-option> no longer disables protocol compression.</p>
</release-item>
<release-item>
@@ -167,6 +193,8 @@
</release-item-contributor-list>
<p>Calculate <id>content-md5</id> on <proper>S3</proper> only when required.</p>
<p>The <id>content-md5</id> header is only calculated for batch delete requests, which require it, to save CPU when files are uploaded. This change was reverted in v2.55.1.</p>
</release-item>
<release-item>
@@ -180,6 +208,8 @@
</release-item-contributor-list>
<p>Warn when a value for a multi-key option is overwritten.</p>
<p>Options with key/value pairs, e.g. <setting>recovery-option</setting>, silently overwrote a value when its key was specified again. A warning is now logged.</p>
</release-item>
<release-item>
@@ -195,6 +225,8 @@
</release-item-contributor-list>
<p>Add detail logging for expired archive path.</p>
<p>Removing a large number of archive files could look like a hang. A message at detail level now shows progress.</p>
</release-item>
<release-item>
@@ -206,6 +238,8 @@
</release-item-contributor-list>
<p>Remove support for <proper>PostgreSQL</proper> <id>9.4</id>.</p>
<p><postgres/> 9.4 is no longer supported, per the policy of supporting five end-of-life versions of <postgres/>. Backups of 9.4 clusters can still be expired.</p>
</release-item>
<release-item>
@@ -217,6 +251,8 @@
</release-item-contributor-list>
<p>Remove <proper>autoconf</proper>/<proper>make</proper> build.</p>
<p>v2.54.0 was the last release to support the <proper>autoconf</proper>/<proper>make</proper> build. Use <proper>meson</proper> to build.</p>
</release-item>
</release-improvement-list>
@@ -225,7 +261,7 @@
<commit subject="Full/incremental backup method.">
<github-pull-request id="2306"/>
</commit>
<commit subject='Revert "full/incremental backup method."'>
<commit subject='Revert "full/incremental backup method".'>
<github-pull-request id="2588"/>
</commit>
@@ -268,6 +304,129 @@
<p>Remove extraneous const from <code>cvtIntToZ()</code> prototype.</p>
</release-item>
<release-item>
<commit subject="Enable cast-qual compiler warning."/>
<commit subject="Enable missing-prototypes compiler warning."/>
<commit subject="Enable redundant-decls compiler warning."/>
<commit subject="Fix misplaced volatile qualifiers in GCS authorization JWT generation."/>
<commit subject="Update String, Buffer, and Variant constants to work with cast-qual."/>
<commit subject="Enable float-equal and init-self compiler warnings."/>
<commit subject="Enable missing-variable-declarations compiler warning."/>
<commit id="d96966065" subject="Add missing const qualifier."/>
<commit id="690c9803c" subject="Add missing const qualifier."/>
<commit subject="Remove extraneous const qualifier."/>
<commit subject="Enable format-overflow=2 compiler warning."/>
<commit subject="Remove -Wno-implicit-fallthrough and explicitly mark fallthrough."/>
<commit subject="Remove implied -Wformat-nonliteral warning."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Enable additional compiler warnings.</p>
</release-item>
<release-item>
<commit subject="Exclude function logging macros from coverage reporting."/>
<commit subject="Fix incorrect log macros."/>
<commit subject="Exclude function void return logging macros from coverage reporting."/>
<commit subject="Lower log level of backupDbPing()/dbPing() to trace."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve logging macros and their coverage.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Allow negative values for integer options.</p>
</release-item>
<release-item>
<commit subject="Remove conditional compilation for lz4."/>
<commit subject="Move compression driver param list management to a common module."/>
<commit subject="Move linkCreate interface function to alphabetical order."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Refactor the compression and protocol modules.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update LICENSE.txt and PostgreSQL copyright for 2025.</p>
</release-item>
<release-item>
<commit subject="Separate version into component parts."/>
<commit subject="Use three part version in development builds."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Separate version into component parts.</p>
</release-item>
<release-item>
<commit subject="Specify length of encoding strings."/>
<commit subject="Add StringId linter."/>
<commit subject="Convert 5-bit test StringId to 6-bit."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add StringId linter.</p>
</release-item>
<release-item>
<commit subject="Add assertions to satisfy Coverity about possible underflows."/>
<commit subject="Add Coverity build to release instructions."/>
<commit subject="Add cast to suppress Coverity complaint about volatile used in assert()."/>
<commit subject="Refactor backupBlockIncrMapSize() range handling to satisfy Coverity."/>
<commit subject="Refactor loop in restoreManifestMap() to satisfy Coverity."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Refactor code to satisfy Coverity.</p>
</release-item>
<release-item>
<github-pull-request id="2493"/>
<release-item-contributor-list>
<release-item-contributor id="kian-meng.ang"/>
</release-item-contributor-list>
<p>Fix typos.</p>
</release-item>
<release-item>
<commit subject="Remove makefile formatting from editor config."/>
<commit subject="Fix typo."/>
<commit subject="Add LSTDEF() macro."/>
<commit subject="Remove unmaintained/unused development environment build files."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Clean up code.</p>
</release-item>
</release-development-list>
</release-core-list>
@@ -285,6 +444,8 @@
</release-item-contributor-list>
<p>Fix documentation for specifying multiple stanzas with <setting>tls-server-auth</setting>.</p>
<p>Multiple stanzas are specified for <setting>tls-server-auth</setting> as a comma-separated list. The documentation said to repeat the option.</p>
</release-item>
<release-item>
@@ -296,9 +457,12 @@
</release-item-contributor-list>
<p>Clarify incremental backup expiration.</p>
<p>The documentation implied that incremental backups are expired by count. It now explains how incremental backups are expired and that full backups count as differential backups for differential retention.</p>
</release-item>
<release-item>
<github-issue id="2540"/>
<github-pull-request id="2541"/>
<release-item-contributor-list>
@@ -318,6 +482,8 @@
</release-item-contributor-list>
<p>Add FAQ about exporting self-contained cluster.</p>
<p>The FAQ explains how to create a self-contained export of a cluster with a backup made with <br-option>--archive-copy</br-option> and restored with <br-option>--type=none</br-option>.</p>
</release-item>
<release-item>
@@ -331,6 +497,8 @@
</release-item-contributor-list>
<p>Caveat <setting>--tablespace-map-all</setting> regarding tablespace creation.</p>
<p>A tablespace created after the backup starts is not in the manifest, so <setting>tablespace-map-all</setting> cannot map it.</p>
</release-item>
<release-item>
@@ -355,6 +523,8 @@
</release-item-contributor-list>
<p>Change <setting>--process-max</setting> recommendation for object stores to <setting>--repo-bundle</setting>.</p>
<p>On object stores <setting>repo-bundle</setting> reduces the time spent creating files far more than <setting>process-max</setting> does, because fewer files are created.</p>
</release-item>
<release-item>
@@ -366,10 +536,12 @@
</release-item-contributor-list>
<p>Update <setting>unix_socket_directory</setting> to <setting>unix_socket_directories</setting>.</p>
<p><pg-setting>unix_socket_directory</pg-setting> has not been valid since <postgres/> 9.2, so only <pg-setting>unix_socket_directories</pg-setting> is documented.</p>
</release-item>
<release-item>
<github-issue id="2600"/>
<github-pull-request id="2600"/>
<release-item-contributor-list>
<release-item-ideator id="martin.marques"/>
@@ -379,6 +551,8 @@
</release-item-contributor-list>
<p>Recommend not placing <setting>spool-path</setting> within <path>pg_xlog</path>/<path>pg_wal</path>.</p>
<p>A spool path inside <path>pg_xlog</path> or <path>pg_wal</path> can cause problems for <postgres/> tools such as <file>pg_rewind</file>.</p>
</release-item>
</release-improvement-list>
@@ -393,6 +567,26 @@
<p>Fix instances of <quote>of of</quote>.</p>
</release-item>
<release-item>
<commit subject="Update release notes for PostgreSQL 17 support."/>
<commit subject="Change &quot;find&quot; to &quot;visit&quot; in introduction."/>
<commit subject="Rephrase invitation to star on Github."/>
<commit subject="Clarify that unhandled errors may occur in edge cases."/>
<commit subject="Remove &quot;Additional Notes&quot; header from release notes."/>
<commit subject="Fix case in option summary."/>
<commit subject="Remove unneeded verbiage from option descriptions."/>
<commit subject="Strip version from RHEL label in user guide."/>
<commit subject="Update PostgresQL versions in user guide."/>
<commit subject="Update verify command summary."/>
<commit subject="Fix highlight error in user guide."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update and correct the documentation.</p>
</release-item>
</release-development-list>
</release-doc-list>
@@ -419,6 +613,52 @@
<p>Fix tests, logging, and comments in unit tests.</p>
</release-item>
<release-item>
<commit subject="Update Cirrus MacOS runner to OpenSSL 3."/>
<commit subject="Update Fedora test image to Fedora 41."/>
<commit subject="Update runner versions on Github actions."/>
<commit subject="Update CI containers to include newest PostgreSQL patch releases."/>
<commit subject="Update Cirrus-CI FreeBSD runner versions."/>
<commit subject="Fix multi-architecture unit testing."/>
<commit subject="Use latest Minio image for testing."/>
<commit subject="Fix integration tests on alternate architectures."/>
<commit subject="Another fix for integration tests on alternate architectures."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>CI updates.</p>
</release-item>
<release-item>
<commit subject="Add wait for async archive log exists check in integration test."/>
<commit subject="Remove --min-gen option from test.pl."/>
<commit subject="Fix compression type in integration tests."/>
<commit subject="Replace constant version with macro in backup test module."/>
<commit subject="Set noResetLogLevel in config/parse unit tests where required."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve the integration and unit tests.</p>
</release-item>
</release-development-list>
</release-test-list>
<release-backpatch-list>
<release-backpatch version="2.54.1">
<commit subject="Fix issue with version/help commands attempting to load pgbackrest.conf."/>
<commit subject="Stabilize async archiving in integration tests."/>
<commit subject="Merge v2.54.1 release."/>
</release-backpatch>
<release-backpatch version="2.54.2">
<commit subject="Fix issue after disabling bundling with block incremental enabled."/>
<commit subject="Clarify behavior of multiple configuration files."/>
<commit subject="Merge v2.54.2 release."/>
</release-backpatch>
</release-backpatch-list>
</release>

View File

@@ -12,6 +12,8 @@
</release-item-contributor-list>
<p>Revert <quote>calculate content-md5 on S3 only when required</quote>.</p>
<p><proper>S3</proper> requires either <id>content-md5</id> or an <id>x-amz-content-*</id> checksum for uploads when object lock is enabled, and <proper>Scality</proper> did not accept the alternate checksums, so uploads failed. <id>content-md5</id> is calculated for all requests with content again.</p>
</release-item>
<release-item>
@@ -26,7 +28,21 @@
</release-item-contributor-list>
<p>Fix lower bounds checking for option keys.</p>
<p>An indexed option with a key of 0, e.g. <setting>pg0-path</setting>, caused a segfault. It is now an error.</p>
</release-item>
</release-bug-list>
</release-core-list>
<release-doc-list>
<release-development-list>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add details about notifying packagers to release instructions.</p>
</release-item>
</release-development-list>
</release-doc-list>
</release>

View File

@@ -12,6 +12,8 @@
</release-item-contributor-list>
<p>Fix issue with adhoc expiration when no backups in a repository.</p>
<p>Adhoc expiration failed with <quote>cannot get index 0 from list with 0 value(s)</quote> when a repository had no backups.</p>
</release-item>
</release-bug-list>
@@ -27,6 +29,8 @@
</release-item-contributor-list>
<p>Add restore progress to <cmd>info</cmd> command output.</p>
<p>The <cmd>restore</cmd> command now records its progress, which the <cmd>info</cmd> command reports alongside backup progress. A restore is also no longer terminated by the <cmd>stop</cmd> command.</p>
</release-item>
<release-item>
@@ -39,6 +43,8 @@
</release-item-contributor-list>
<p>Add progress-only detail level for <cmd>info</cmd> command output.</p>
<p>Set <br-option>--detail-level=progress</br-option> to report only progress, which is faster because the repository is not read. The default is <id>full</id>.</p>
</release-item>
</release-feature-list>
@@ -52,6 +58,8 @@
</release-item-contributor-list>
<p>Retry failed reads on object stores.</p>
<p>A read from an object store that failed after it started was fatal, which could restart an expensive job, e.g. during restore. A failed read is now retried from where it left off.</p>
</release-item>
<release-item>
@@ -64,6 +72,8 @@
</release-item-contributor-list>
<p>Fix defaults in command-line help.</p>
<p>When an option has more than one default, e.g. <setting>repo-storage-upload-chunk-size</setting> with an <proper>S3</proper> and an <proper>Azure</proper> repository, the option list shows <id>&lt;multi&gt;</id> and the help for the option lists each default. Defaults are not shown for options that are not valid in the current configuration.</p>
</release-item>
</release-improvement-list>
@@ -78,6 +88,36 @@
<p>Improve the predictability of floating point numbers formatted as strings.</p>
</release-item>
<release-item>
<commit subject="Remove context wrapper when processing defaults during config parsing."/>
<commit subject="Flag pg-host-config-include-path and pg-host-config-path as required."/>
<commit subject="Rename cfgExe() to cfgBin()."/>
<commit subject="Add default type for current pgbackrest binary."/>
<commit subject="Make default-literal option configuration with default-type."/>
<commit subject="Improve defaults and allow lists with option value dependencies."/>
<commit subject="Remove cfgParseOptionDefault() and cfgParseOptionRequired()."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve option defaults and dependencies.</p>
</release-item>
<release-item>
<commit subject="Fix typo in comment."/>
<commit subject="Rename unsigned char to uint8_t."/>
<commit subject="Fix issue with calling lstClear() twice."/>
<commit subject="Add VR_NON_STRING macro for nonstring attribute."/>
<commit subject="Move variable to scope where it is used."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Clean up code.</p>
</release-item>
</release-development-list>
</release-core-list>
@@ -92,6 +132,8 @@
</release-item-contributor-list>
<p>Describe discrete option values in a list where appropriate.</p>
<p>The values of options such as <setting>output</setting> for the <cmd>verify</cmd> and <cmd>version</cmd> commands are now described as a list, as for other options.</p>
</release-item>
<release-item>
@@ -105,5 +147,59 @@
<p>Fix <quote>less than</quote> in help output for <setting>archive-mode</setting> option.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<commit subject="Add details about notifying packagers to release instructions."/>
<commit subject="Update support and recognition documentation."/>
<commit subject="Add funding information."/>
<commit subject="Update contributing guide to Ubuntu 22.04."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update the contributing, release, and support documentation.</p>
</release-item>
</release-development-list>
</release-doc-list>
<release-test-list>
<release-development-list>
<release-item>
<commit subject="New CI container build for PostgreSQL 18 beta1."/>
<commit subject="Use &#x27;x86_64&#x27; instead of &#x27;amd64&#x27; for container testing."/>
<commit subject="Fix architecture labeling for multi-architecture container builds."/>
<commit subject="Update Fedora test image to Fedora 42."/>
<commit subject="New CI container build for PostgreSQL 18 beta2."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>CI updates.</p>
</release-item>
<release-item>
<commit subject="Use dup2() to redirect stderr in the common/error unit test."/>
<commit subject="Update invalid address check in common/io-tls unit test."/>
<commit subject="Add TEST_ERROR_MULTI() macro."/>
<commit subject="Update unit tests to work with Alpine Linux and musl libc."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve unit tests.</p>
</release-item>
</release-development-list>
</release-test-list>
<release-backpatch-list>
<release-backpatch version="2.55.1">
<commit subject="Fix lower bounds checking for option keys."/>
<commit subject="Revert &quot;calculate content-md5 on S3 only when required&quot;."/>
<commit subject="Merge v2.55.1 release."/>
</release-backpatch>
</release-backpatch-list>
</release>

View File

@@ -11,6 +11,8 @@
</release-item-contributor-list>
<p>Unnest HTTP/TLS/socket timeouts.</p>
<p>A failed socket connection was also retried by the TLS and HTTP layers, so with the default <setting>io-timeout</setting> of 60 seconds a connection took nine minutes to time out. Each layer now retries only its own failures.</p>
</release-item>
<release-item>
@@ -22,6 +24,18 @@
</release-item-contributor-list>
<p>Fix possible segfault in page checksum error message.</p>
<p>The error message for invalid page checksums used a string that was out of scope, which could log garbage or crash. This was most likely with <proper>pg_tde</proper>, since every encrypted file fails the page checksum.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Fix possible segfault in backup resume messages.</p>
<p>The message that reports why a backup cannot be resumed used a string that was out of scope, which could log garbage or crash.</p>
</release-item>
</release-bug-list>
@@ -37,6 +51,8 @@
</release-item-contributor-list>
<p>Add <setting>repo-symlink</setting> option to suppress creation of repository symlinks.</p>
<p>Some filesystems that are otherwise <proper>Posix</proper>-compatible do not support symlinks. Set <br-option>repo-symlink=n</br-option> to keep the <path>latest</path> and tablespace symlinks from being created in the repository.</p>
</release-item>
</release-feature-list>
@@ -50,7 +66,74 @@
</release-item-contributor-list>
<p>Add HTTP retries for 408 and 429 errors.</p>
<p>HTTP 408 (Request Timeout) and 429 (Too Many Requests) errors are now retried. 429 errors are common on <proper>Cloudflare R2</proper>.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<commit subject="Finalize catalog number for PostgreSQL 18 release."/>
<commit subject="Update release note for PostgreSQL 18 experimental support."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Finalize catalog number for PostgreSQL 18 release.</p>
</release-item>
<release-item>
<commit subject="Fix comment typo."/>
<commit subject="Remove unused pathSync parameter in SFTP storage driver."/>
<commit subject="Remove no longer used GLUE() macro."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Remove unused code and fix comments.</p>
</release-item>
</release-development-list>
</release-core-list>
<release-doc-list>
<release-development-list>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update user guide and tests to Ubuntu 22.04.</p>
</release-item>
</release-development-list>
</release-doc-list>
<release-test-list>
<release-development-list>
<release-item>
<commit subject="New CI container build for PostgreSQL 18 beta3."/>
<commit subject="Allow multi-architecture tests to continue if one fails."/>
<commit subject="Improve support for multi-architecture builds."/>
<commit subject="Move aarch64 test to Github Actions."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>CI updates.</p>
</release-item>
<release-item>
<commit subject="Fix errant STRDEF() in command/backup unit test."/>
<commit subject="Use FN_NO_RETURN macro consistently in tests."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Clean up unit tests.</p>
</release-item>
</release-development-list>
</release-test-list>
</release>

View File

@@ -15,6 +15,8 @@
</release-item-contributor-list>
<p>Fix deadlock due to logging in signal handler.</p>
<p>A signal that arrived while a lock was held by <code>gmtime_r()</code>, e.g. the SIGTERM sent by <cmd>stop</cmd> with <br-option>--force</br-option>, could deadlock when the signal handler logged. The signal handler now logs with only async-signal-safe functions.</p>
</release-item>
</release-bug-list>
@@ -29,6 +31,8 @@
</release-item-contributor-list>
<p>HTTP support for <proper>S3</proper>, <proper>GCS</proper>, and <proper>Azure</proper>.</p>
<p>An object store endpoint can now begin with <id>http://</id> to connect without TLS. HTTPS is still used when the endpoint does not specify a protocol.</p>
</release-item>
<release-item>
@@ -42,6 +46,8 @@
</release-item-contributor-list>
<p>Allow expiration of oldest full backup regardless of current retention.</p>
<p>The <cmd>expire</cmd> option <br-option>--oldest</br-option> expires the oldest full backup and the backups that depend on it regardless of the retention settings, e.g. when the repository is running out of space. WAL before the oldest remaining full backup is expired as well.</p>
</release-item>
<release-item>
@@ -55,6 +61,8 @@
</release-item-contributor-list>
<p>Support for <proper>Azure</proper> managed identities.</p>
<p>Set <br-option>repo-azure-key-type=auto</br-option> to fetch credentials automatically using managed identities instead of configuring them. The credentials are refreshed before they expire.</p>
</release-item>
<release-item>
@@ -69,6 +77,8 @@
</release-item-contributor-list>
<p><i><b>Experimental</b></i> support for <proper>S3</proper> EKS pod identity.</p>
<p>Set <br-option>repo-s3-key-type=pod-id</br-option> to fetch credentials automatically using EKS pod identity instead of configuring them. The credentials are refreshed before they expire.</p>
</release-item>
<release-item>
@@ -84,6 +94,8 @@
</release-item-contributor-list>
<p>Allow configuration of TLS cipher suites.</p>
<p>Set <setting>tls-cipher-12</setting> for TLS 1.2 and <setting>tls-cipher-13</setting> for TLS 1.3, e.g. for compliance. The cipher suites apply to every connection a process makes.</p>
</release-item>
<release-item>
@@ -95,6 +107,8 @@
</release-item-contributor-list>
<p>Allow process priority to be set.</p>
<p><setting>priority</setting> sets the scheduling priority of <backrest/> processes from -20 to 19, as with <file>nice</file>. A higher value makes <backrest/> less likely to interfere with <postgres/>.</p>
</release-item>
</release-feature-list>
@@ -108,6 +122,8 @@
</release-item-contributor-list>
<p>Allow dots in S3 bucket names when using path-style URIs.</p>
<p>Dots in a bucket name only cause a certificate host name mismatch with host-style URIs, so they are now allowed with <br-option>repo-s3-uri-style=path</br-option>, which most self-hosted <proper>S3</proper> services use.</p>
</release-item>
<release-item>
@@ -120,6 +136,8 @@
</release-item-contributor-list>
<p>Require TLS &gt;= 1.2 unless verification is disabled.</p>
<p>TLS 1.0 and 1.1 have been deprecated since 2021. Verification is always enabled for connections between <backrest/> hosts. When verification is disabled for an object store with <setting>repo-storage-verify-tls</setting>, e.g. for a self-signed certificate, every protocol version is allowed.</p>
</release-item>
<release-item>
@@ -133,6 +151,8 @@
</release-item-contributor-list>
<p>Dynamically size <proper>S3</proper>/<proper>GCS</proper>/<proper>Azure</proper> chunks for large uploads.</p>
<p>The number of chunks in an upload is limited, so with the default <setting>repo-storage-upload-chunk-size</setting> the largest file that could be uploaded was 50GiB to <proper>S3</proper>, 40GiB to <proper>GCS</proper>, and 200GiB to <proper>Azure</proper>. The chunk size now grows during an upload, so files up to 5TiB can be uploaded to <proper>S3</proper> and <proper>GCS</proper> and up to 45TiB to <proper>Azure</proper>.</p>
</release-item>
<release-item>
@@ -144,6 +164,8 @@
</release-item-contributor-list>
<p>Optimize <proper>S3</proper>/<proper>GCS</proper>/<proper>Azure</proper> chunk size for small files.</p>
<p>The whole chunk buffer was allocated when a file was opened, although many files are smaller than a chunk. The buffer now grows as data arrives, which saves memory when small files are uploaded.</p>
</release-item>
<release-item>
@@ -155,6 +177,8 @@
</release-item-contributor-list>
<p>Remove support for <proper>PostgreSQL</proper> <id>9.5</id>.</p>
<p><postgres/> 9.5 is no longer supported, per the policy of supporting five end-of-life versions of <postgres/>.</p>
</release-item>
<release-item>
@@ -167,8 +191,91 @@
</release-item-contributor-list>
<p>Improve logging of default for options with an unresolved dependency.</p>
<p>An option set in the configuration file was logged at the start of a command when its dependency was not resolved, although its default value was used. The option is no longer logged in this case.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<commit subject="Remove explicit versioning from macros using versioned PostgreSQL types."/>
<commit subject="Remove unused BlockNumber type."/>
<commit subject="Remove versioning from static types used by versioned PostgreSQL types."/>
<commit subject="Simplify macros in db/db unit test."/>
<commit subject="Fix incorrect pg_control struct used for PostgreSQL 9.5."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Simplify the versioned <postgres/> types.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Use get_option() for tasks supported by the new meson version.</p>
</release-item>
<release-item>
<commit subject="Remove redundant command lists from src/build/config/config.yaml."/>
<commit subject="Remove overly verbose command role rules."/>
<commit subject="Remove unused start/stop commands on repo options."/>
<commit subject="Show internal state for commands/options in parse.auto.c.inc."/>
<commit subject="Add new defines to help with option command maintenance."/>
<commit subject="Cleanup pg-host options for unsupported remote restore."/>
<commit subject="Cleanup repo-host options for remote backup."/>
<commit subject="Move PostgreSQL connection options to the same section."/>
<commit subject="Rearrange options for clarity."/>
<commit subject="Use roles to simplify option command lists."/>
<commit subject="Simplify log-level options in config.yaml."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Simplify the option definitions in config.yaml.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Use JsonRead for all info JSON parsing.</p>
</release-item>
<release-item>
<commit subject="Move constants required for debug logging."/>
<commit subject="Move object code out of StringId module."/>
<commit subject="Remove prefix functionality from StringId."/>
<commit subject="Add PARSE_RULE_VAL_STR_IDX() to simplify logic in config/parse.c."/>
<commit subject="Remove generated StringIds from parse.auto.c.inc."/>
<commit subject="Throw errors on invalid StringIds in config/parse.c."/>
<commit subject="Remove unused error parameter from strIdFromZN()."/>
<commit subject="Update strIdFromZN() comment missed in 6e11d650."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Refactor StringId and option parsing.</p>
</release-item>
<release-item>
<commit subject="Fix missing parameter logging in storageS3New()."/>
<commit subject="Fix test comment."/>
<commit subject="Fix minor formatting issue."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Fix logging, formatting, and comments.</p>
</release-item>
</release-development-list>
</release-core-list>
<release-doc-list>
@@ -182,6 +289,8 @@
</release-item-contributor-list>
<p>Remove explicit <setting>max_wal_senders</setting>/<setting>wal_level</setting> configuration from user guide.</p>
<p><pg-setting>max_wal_senders</pg-setting> and <pg-setting>wal_level</pg-setting> have defaulted to the values the user guide requires since <postgres/> 10.</p>
</release-item>
<release-item>
@@ -193,7 +302,62 @@
</release-item-contributor-list>
<p>Clarify that bundling is useful for filesystems with large block sizes.</p>
<p>Bundling saves space on filesystems with large block sizes, where each small file takes a whole block.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<commit subject="Move release notes to decade directories."/>
<commit subject="Migrate document command/option description preprocessing to C."/>
<commit subject="Remove PDF documentation output."/>
<commit subject="Removed redundant documentation variables and references."/>
<commit subject="Suppress Azurite API version checking in documentation builds."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve the documentation build.</p>
</release-item>
<release-item>
<commit subject="Fix typo in bundling section of user guide."/>
<commit subject="Improve wording in performance tuning section of user guide."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve wording in the user guide.</p>
</release-item>
</release-development-list>
</release-doc-list>
<release-test-list>
<release-development-list>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="stefan.fercot"/>
</release-item-contributor-list>
<p>Fix WAL segment numbering in command/expire unit test.</p>
</release-item>
<release-item>
<commit subject="Fix 32-bit CI testing."/>
<commit subject="Removed unused code in test container build."/>
<commit subject="Update Cirrus-CI FreeBSD 14 runner version."/>
<commit subject="Use more generic expression to fetch container IP addresses."/>
<commit subject="New CI container builds."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>CI updates.</p>
</release-item>
</release-development-list>
</release-test-list>
</release>

View File

@@ -20,6 +20,8 @@
</release-item-contributor-list>
<p>Fix <cmd>expire</cmd> removing a backup in progress on another host.</p>
<p>A backup is not added to <file>backup.info</file> until it completes, so when <cmd>expire</cmd> ran on one host while a backup was running on another, e.g. <cmd>expire</cmd> on a standby while the primary is backed up, the backup in progress was removed. Expiration no longer removes the latest backup when it is in progress or resumable.</p>
</release-item>
<release-item>
@@ -33,6 +35,8 @@
</release-item-contributor-list>
<p>Fix <setting>archive-push-queue-max</setting> not enforced when a WAL file errors.</p>
<p>In asynchronous mode the queue was measured against the WAL yet to be pushed. When a WAL file errored repeatedly the WAL files after it were pushed and no longer counted, although they stayed in <path>pg_wal</path>, so the queue limit was never reached and <path>pg_wal</path> could fill the disk. The queue is now measured against all the WAL <postgres/> is waiting to archive, as in synchronous mode.</p>
</release-item>
<release-item>
@@ -46,6 +50,8 @@
</release-item-contributor-list>
<p>Fix async <cmd>archive-get</cmd> failure during recovery across a timeline switch.</p>
<p>Two async processes could race for the archive lock, and the one that lost exited before fetching the segment it was started for. The <cmd>archive-get</cmd> that started it then waited for <setting>archive-timeout</setting> and returned an error for a segment that exists, which could end recovery early, especially across a timeline switch. The segment is now fetched directly when the async process that should fetch it is not running.</p>
</release-item>
<release-item>
@@ -59,6 +65,8 @@
</release-item-contributor-list>
<p>Fix potential buffer overrun in error module.</p>
<p>A stack trace too long for its buffer was not terminated and could be read past the end of the buffer, and an error message too long for its buffer could write past the end of it when a system error was appended. Both require an unusually long message.</p>
</release-item>
<release-item>
@@ -72,6 +80,8 @@
</release-item-contributor-list>
<p>Fix use-after-free of parallel protocol client.</p>
<p>A client that ran out of work was freed but left in the client list and freed again on a later call. With debug or trace logging this read freed memory and could crash, e.g. a parallel backup with <br-option>log-level-file=trace</br-option>.</p>
</release-item>
<release-item>
@@ -85,6 +95,20 @@
</release-item-contributor-list>
<p>Fix heap overflow when a pg option is set without pg1.</p>
<p>When <id>pg</id> options were set for other indexes without <setting>pg1-path</setting>, e.g. <setting>pg2-path</setting> and <setting>pg3-path</setting>, the index map was overwritten. This corrupted the heap on musl, e.g. <proper>Alpine</proper>, and caused a segmentation fault. The highest numbered <setting>pg-path</setting> was also dropped.</p>
</release-item>
<release-item>
<commit subject="Prevent recursive exit() on signal."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Fix crash when a signal arrives during exit on musl 1.2.6.</p>
<p>musl 1.2.6, e.g. on <proper>Alpine</proper> 3.24, crashes when <code>exit()</code> is called while an exit is already in progress. This happened when a signal arrived during exit, e.g. when the <cmd>server</cmd> command terminated a child process that was already exiting. A signal that arrives during exit is now ignored.</p>
</release-item>
</release-bug-list>
@@ -101,6 +125,8 @@
</release-item-contributor-list>
<p><proper>PostgreSQL 19beta2</proper> support.</p>
<p>Adds support for <postgres/> 19beta2. <postgres/> 19 can enable and disable page checksums online, and page checksums are not validated while either is in progress.</p>
</release-item>
<release-item>
@@ -115,6 +141,8 @@
</release-item-contributor-list>
<p>Add <setting>archive-expire-before</setting> option to clean up WAL archive.</p>
<p>The <cmd>expire</cmd> option <setting>archive-expire-before</setting> removes WAL before a given segment from the archive but never WAL that a retained backup requires. It can clean up the archive from the restartpoint of a standby with <pg-setting>archive_cleanup_command</pg-setting> instead of <file>pg_archivecleanup</file>, which does not know about retention.</p>
</release-item>
<release-item>
@@ -127,6 +155,8 @@
</release-item-contributor-list>
<p>Add batch delete for <proper>Azure</proper> storage.</p>
<p>Files are removed with the <proper>Azure</proper> Blob Batch API, up to 256 per request, instead of one request per file. This speeds up <cmd>expire</cmd> and other commands that remove files from the repository.</p>
</release-item>
<release-item>
@@ -139,6 +169,8 @@
</release-item-contributor-list>
<p>Add support for <proper>S3 Outposts</proper>.</p>
<p>Set <br-option>repo-s3-service=s3-outposts</br-option> when using an <proper>S3 Outposts</proper> endpoint. The option sets the service name used for request signing and defaults to <id>s3</id>.</p>
</release-item>
<release-item>
@@ -151,14 +183,29 @@
</release-item-contributor-list>
<p>Add <proper>S3</proper> process authentication.</p>
<p>Set <br-option>repo-s3-key-type=process</br-option> and set <setting>repo-s3-process-cmd</setting> to a command that outputs temporary credentials in the JSON format of the <proper>AWS</proper> process credential provider. The credentials are refreshed before they expire.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Provide a distribution tarball with generated code and documentation.</p>
<p>The tarball includes the generated code and the rendered man page and HTML documentation, so it builds and installs without the code generation and documentation tooling, including <id>libyaml</id>.</p>
</release-item>
</release-feature-list>
<release-improvement-list>
<release-item>
<github-issue id="2739"/>
<github-issue id="2772"/>
<github-pull-request id="2793"/>
<commit subject="Fetch the libssh2 session from storage in SFTP read/write objects."/>
<commit subject="Reconnect SFTP storage after the server drops an idle connection.">
<github-issue id="2739"/>
<github-issue id="2772"/>
<github-pull-request id="2793"/>
</commit>
<release-item-contributor-list>
<release-item-ideator id="mustafa0x"/>
@@ -168,6 +215,8 @@
</release-item-contributor-list>
<p>Reconnect SFTP storage after the server drops an idle connection.</p>
<p><proper>SFTP</proper> servers and firewalls may drop a connection that has been idle for a while, e.g. the repository read connection during the copy phase of a backup, and the next use failed with a socket error. A dropped connection is now reopened and the operation is retried once.</p>
</release-item>
<release-item>
@@ -179,6 +228,8 @@
</release-item-contributor-list>
<p>Add user/group caching for faster manifest build.</p>
<p>When user and group names are looked up through a remote name service, e.g. <proper>sssd</proper> or <proper>LDAP</proper>, each lookup is a round trip, which dominated the manifest build for clusters with millions of files. User and group names are now cached.</p>
</release-item>
<release-item>
@@ -192,6 +243,8 @@
</release-item-contributor-list>
<p>Add per-repo backup progress to <cmd>info</cmd> command output.</p>
<p>When backups run on more than one repository at once, the <cmd>info</cmd> command now reports progress for each repository as well as overall progress. The JSON output has a <id>repo</id> array for each backup lock.</p>
</release-item>
<release-item>
@@ -205,6 +258,8 @@
</release-item-contributor-list>
<p>Add <file>backup.info</file> checks to <cmd>verify</cmd> command.</p>
<p>The <cmd>verify</cmd> command now warns when a backup in the repository is not in <file>backup.info</file> and when a backup in <file>backup.info</file> is missing from the repository. A missing backup is reported as having a missing manifest.</p>
</release-item>
<release-item>
@@ -217,6 +272,8 @@
</release-item-contributor-list>
<p>Allow the <proper>S3</proper> STS endpoint to be configured.</p>
<p>Set <setting>repo-s3-sts-host</setting> to use a regional STS endpoint with <br-option>repo-s3-key-type=web-id</br-option>, e.g. <id>sts.eu-central-2.amazonaws.com</id>. <proper>AWS</proper> opt-in regions do not accept credentials from the global endpoint, which is still the default.</p>
</release-item>
<release-item>
@@ -228,6 +285,8 @@
</release-item-contributor-list>
<p>Add <setting>archive-push-batch-size</setting> to limit WAL pushed per asynchronous run.</p>
<p>In asynchronous mode <setting>archive-push-queue-max</setting> is only checked at the start of a run, so a run working through a large backlog could let the queue grow well past the limit. <setting>archive-push-batch-size</setting> (default 16GiB) limits the WAL pushed per run, so the queue is checked again sooner.</p>
</release-item>
<release-item>
@@ -241,6 +300,8 @@
</release-item-contributor-list>
<p>Exit async <cmd>archive-push</cmd> on first error.</p>
<p>When the repository was unavailable the async process kept trying every ready WAL segment, so a run could take long enough for <path>pg_wal</path> to fill before <setting>archive-push-queue-max</setting> was checked again. The run now exits on the first error, after the jobs in progress finish.</p>
</release-item>
<release-item>
@@ -252,6 +313,8 @@
</release-item-contributor-list>
<p>Harden HTTP chunked response parsing.</p>
<p>Chunk extensions and trailers are now accepted, <id>transfer-encoding</id> is compared without regard to case, and a response with both <id>transfer-encoding</id> and <id>content-length</id> is rejected.</p>
</release-item>
<release-item>
@@ -264,6 +327,8 @@
</release-item-contributor-list>
<p>Error when running as root unless <setting>allow-root</setting> is enabled.</p>
<p>Running a command other than <cmd>restore</cmd> as root could create files in the repository, e.g. <file>backup.info</file>, that the <postgres/> user cannot access. <setting>allow-root</setting> is disabled by default for every command except <cmd>restore</cmd>, and the check also applies on remote hosts.</p>
</release-item>
<release-item>
@@ -275,6 +340,8 @@
</release-item-contributor-list>
<p>Fewer binary searches when building manifest.</p>
<p>The manifest build for a diff or incr backup searched the prior manifest three times for each file. It now searches once, which saves millions of searches for clusters with millions of files.</p>
</release-item>
<release-item>
@@ -287,6 +354,8 @@
</release-item-contributor-list>
<p>Improve seek performance during block incremental delta restore.</p>
<p>A seek and a flush of the write buffer were done for every block written during a block incremental delta restore, and blocks are often 8KiB. The file position is now tracked and the seek and flush are only done when needed.</p>
</release-item>
<release-item>
@@ -298,6 +367,8 @@
</release-item-contributor-list>
<p>Bundle backup files in order rather than scanning for a better fit.</p>
<p>A file that would push a bundle over <setting>repo-bundle-size</setting> was skipped for a smaller file later in the queue. Files are now added in order and a bundle is closed once it reaches <setting>repo-bundle-size</setting>, so a bundle may exceed it by up to <setting>repo-bundle-limit</setting>.</p>
</release-item>
<release-item>
@@ -311,6 +382,8 @@
</release-item-contributor-list>
<p>Report the underlying error when a query fails to complete.</p>
<p>When the connection was lost after the first result of a query was delivered, e.g. under load, the error was the generic <quote>NULL result required to complete request</quote>. The error from <postgres/> is now reported, with hints about a lost connection and about aggressive <pg-setting>idle_session_timeout</pg-setting> and <pg-setting>idle_in_transaction_session_timeout</pg-setting> settings.</p>
</release-item>
<release-item>
@@ -324,6 +397,8 @@
</release-item-contributor-list>
<p>Report the actual error when an <proper>S3</proper> credential request fails.</p>
<p>An error from <proper>AWS</proper> for a <id>web-id</id> or <id>pod-id</id> credential request was reported as a failure to parse the response. The error returned by <proper>AWS</proper> is now reported, and the tokens are redacted when the request is logged.</p>
</release-item>
<release-item>
@@ -337,6 +412,8 @@
</release-item-contributor-list>
<p>Report <cmd>archive-push</cmd> spool path errors to the PostgreSQL log.</p>
<p>When the async spool path could not be created, e.g. permission was denied, the error could not be written to the spool and <cmd>archive-push</cmd> failed with a generic timeout that pointed at the async log. The spool path is now created before the async process starts, so the error appears in the <postgres/> log.</p>
</release-item>
<release-item>
@@ -345,6 +422,8 @@
</release-item-contributor-list>
<p>Hint that pgBackRest may be out of date when a version is unsupported.</p>
<p>When <backrest/> does not recognize a <postgres/> version, e.g. an older <backrest/> on the restore host reading a backup of a newer cluster, the error now hints that <backrest/> may need to be updated on all hosts. The version is reported in user-facing form, e.g. 13 rather than 130000.</p>
</release-item>
<release-item>
@@ -357,6 +436,8 @@
</release-item-contributor-list>
<p>Add <proper>systemd</proper> notify integration.</p>
<p>When built with <id>libsystemd</id>, the <cmd>server</cmd> command notifies <proper>systemd</proper> when it is ready to accept connections and when it is stopping, as <postgres/> and PgBouncer do.</p>
</release-item>
<release-item>
@@ -368,6 +449,8 @@
</release-item-contributor-list>
<p>Suppress <id>unused parameter</id> errors in <proper>meson</proper> compiler probes.</p>
<p>The <proper>meson</proper> compiler probes declared <code>main()</code> parameters they did not use, which failed the probes when unused parameter warnings were errors.</p>
</release-item>
<release-item>
@@ -394,6 +477,148 @@
<p>Refactor restore module into included modules.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update LICENSE.txt and PostgreSQL copyright for 2026.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Enhance StringId with optional sequence information.</p>
</release-item>
<release-item>
<commit subject="Calculate limit for Posix/SFTP during read instead of when created."/>
<commit subject="Move initialization of StorageRead and StorageWrite to interface."/>
<commit subject="Invert storage read/write interface ownership."/>
<commit subject="Move ignoreMissing out of the storage read drivers."/>
<commit subject="Unify the file remove error message."/>
<commit subject="Use a storage feature to gate remove errorOnMissing."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Refactor the storage read and write interfaces.</p>
</release-item>
<release-item>
<commit subject="Bring SFTP storageRemove() in line with the other repository storage drivers."/>
<commit subject="Error on SFTP remove failures other than missing file."/>
<commit subject="Remove the unused sftpHandle field from the SFTP storage driver."/>
<commit subject="Simplify error handling in SFTP storageWriteSftpOpen()."/>
<commit subject="Throw real SFTP read-open errors instead of masking them as missing."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve error handling in the <proper>SFTP</proper> storage driver.</p>
</release-item>
<release-item>
<commit subject="Move info/manifest.c to info/manifest/manifest.c."/>
<commit subject="Refactor info/manifest module into included modules."/>
<commit subject="Update uncrustify to recognize .c.inc files."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Refactor the manifest module into included modules.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Reverse sort order in backup and restore comparators.</p>
</release-item>
<release-item>
<commit subject="Minor memory context optimization in restoreFile()."/>
<commit subject="Explicitly free block map read in restoreFile()."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Free memory sooner in <code>restoreFile()</code>.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Move archiveAsyncExec() to command/command module and rename.</p>
</release-item>
<release-item>
<commit subject="Prevent an out-of-bounds log buffer write on an oversized message."/>
<commit subject="Replace strncpy() with memcpy()/snprintf() and ban it."/>
<commit subject="Replace sprintf() with snprintf() and ban it."/>
<commit subject="Replace strcpy() with memcpy() and ban strcpy()/strcat()."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Ban unsafe string functions and limit an oversized log message.</p>
</release-item>
<release-item>
<commit subject="Add YAML helpers for the peek-type and empty-map idioms."/>
<commit subject="Fix parsing of the parameter-allowed command definition."/>
<commit subject="Simplify the build YAML parsers with iteration macros."/>
<commit subject="Store help data as a C string instead of a byte array."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve code generation for the configuration and help.</p>
</release-item>
<release-item>
<commit subject="Fix float-equal compiler warnings."/>
<commit subject="Use more specific warning for nonstring meson compiler probe."/>
<commit subject="Move static build defines to build.h."/>
<commit subject="Add meson check for __builtin_types_compatible_p()."/>
<commit subject="Update always_inline to __always_inline__."/>
<commit subject="Remove unused backtrace-supported.h include.">
<github-pull-request id="2755"/>
</commit>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-contributor id="yegor.zhmak"/>
</release-item-contributor-list>
<p>Improve compiler compatibility and build checks.</p>
</release-item>
<release-item>
<commit subject="Fix comments in common/pack module."/>
<commit subject="Improve designated initializers in data arrays."/>
<commit subject="Remove extraneous const."/>
<commit subject="Clarify zero-size chunk comment in HTTP response parsing."/>
<commit subject="Fix duplicated word in the file mode error message."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Clean up code and comments.</p>
</release-item>
</release-development-list>
</release-core-list>
@@ -408,6 +633,8 @@
</release-item-contributor-list>
<p>Make <setting>stanza</setting> option internal for the <cmd>repo-*</cmd> commands.</p>
<p>The <setting>stanza</setting> option only has an effect on the <cmd>repo-*</cmd> commands with undocumented storage path constants, so the documentation implied it did something it does not. The option is no longer documented for these commands and works as before.</p>
</release-item>
<release-item>
@@ -421,6 +648,8 @@
</release-item-contributor-list>
<p>Document that info reads encryption settings from global section.</p>
<p>When run without <setting>stanza</setting> the <cmd>info</cmd> command reads encryption settings only from the global section, so encryption settings configured for a stanza require <setting>stanza</setting>.</p>
</release-item>
<release-item>
@@ -434,6 +663,8 @@
</release-item-contributor-list>
<p>Document that <setting>expire-auto</setting> uses the <cmd>backup</cmd> command configuration.</p>
<p>Automatic expiration after a backup uses the configuration of the <cmd>backup</cmd> command, so options set only for the <cmd>expire</cmd> command are not applied. Disable <setting>expire-auto</setting> and run <cmd>expire</cmd> separately when it needs its own configuration.</p>
</release-item>
<release-item>
@@ -447,6 +678,8 @@
</release-item-contributor-list>
<p>Document adjusting the <proper>logrotate</proper> <id>su</id> directive for a dedicated user.</p>
<p>Packages may install a <proper>logrotate</proper> configuration that rotates the logs as the <id>postgres</id> user. When a dedicated user owns the repository and logs, the <id>su</id> directive must be changed to that user or rotation fails with a permission error.</p>
</release-item>
<release-item>
@@ -460,8 +693,76 @@
</release-item-contributor-list>
<p>Document that end-of-line comments are not supported in config files.</p>
<p>End-of-line comments have never been supported, although they may appear to work for some options. Only comments on a line of their own are supported.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<commit subject="Add support for sponsors in the documentation."/>
<commit subject="Comment out unused CSS elements."/>
<commit subject="Remove attribution for armchair icon since it is now licensed."/>
<commit subject="Add dark mode favicon."/>
<commit subject="Add news page."/>
<commit subject="Add sponsors and announcement that pgBackRest will continue."/>
<commit subject="Add sponsors."/>
<commit subject="Add ransomware and malware protection to the feature list."/>
<commit subject="Add logo, news, and sponsor toggles to the documentation."/>
<commit subject="Update the project URL to https://pgbackrest.org."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add the news page and sponsors to the website.</p>
</release-item>
<release-item>
<commit subject="Documentation no longer builds on PostgreSQL &lt; 10."/>
<commit subject="Update PostgresQL versions in user guide."/>
<commit subject="Remove information about v1 releases."/>
<commit subject="Fix documentation typos."/>
<commit subject="Add repo-s3-key-type=pod-id documentation missed in 79544f64."/>
<commit subject="Fix neutral-umask documentation to match actual lock/log modes"/>
<commit subject="Update RHEL documentation to Rocky Linux 9."/>
<commit subject="Remove out-of-date instructions for building documentation."/>
<commit subject="Download the distribution tarball rather than the source archive."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Update and correct the documentation.</p>
</release-item>
<release-item>
<commit subject="Update NEWS.md for new version and features."/>
<commit subject="Fix typo in NEWS.md."/>
<commit subject="Remove obsolete Perl code."/>
<commit subject="Migrate documentation block rendering to C."/>
<commit subject="Allow cmd-line-len to be overridden per command."/>
<commit subject="Remove NEWS.md in favor of generating it from news.xml."/>
<commit subject="Resolve markdown cross-page section links to the website."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve the documentation build.</p>
</release-item>
<release-item>
<commit subject="Replace Minio with Ceph for S3 documentation and testing."/>
<commit subject="Retry S3 bucket creation to allow time for Ceph to start up."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Replace Minio with Ceph for S3 documentation and testing.</p>
</release-item>
</release-development-list>
</release-doc-list>
<release-test-list>
@@ -475,7 +776,100 @@
</release-item-contributor-list>
<p>Fix Alpine group conflicts in CI containers.</p>
<p>Group entries with members are now handled when the test group is renamed, and the <proper>Alpine</proper> group is only created when it does not already exist.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<commit subject="Remove FreeBSD 13 and add FreeBSD 15 to Cirrus CI."/>
<commit subject="Update Fedora test image to Fedora 43."/>
<commit subject="Update GitHub Actions versions."/>
<commit subject="New CI container builds."/>
<commit subject="Update lock-threads action version."/>
<commit subject="Update (almost) EOL Debian 11 to Debian 12 in CI."/>
<commit subject="Update Fedora CI container to Fedora 44."/>
<commit subject="Run integration tests on Alpine 3.21 (musl libc)."/>
<commit subject="Update FreeBSD CI versions."/>
<commit subject="Add RHEL 9 and 10 tests and switch RHEL 8 to native PostgreSQL."/>
<commit subject="Remove package build testing."/>
<commit subject="Allow FreeBSD tests to continue running even if one fails."/>
<commit subject="Migrate Cirrus CI tests to Github Actions."/>
<commit subject="Limit CI permissions on the repository to read."/>
<commit subject="Remove CodeQL CI job."/>
<commit subject="Move issue template to new format required by Github."/>
<commit subject="Cache test container base images in GHCR."/>
<commit subject="Upload the coverage report as a CI artifact instead of logging it."/>
<commit subject="Allow container cache revisions to be set per architecture."/>
<commit subject="Split the test workflow into reusable workflows."/>
<commit subject="Untap non-official taps in the MacOS test job."/>
<commit subject="Update the systemctl replacement to 1.5.9063."/>
<commit subject="Use curl instead of wget."/>
<commit subject="Use the custom shell to run FreeBSD tests in the VM."/>
<commit subject="Persist the ccache across CI runs using a container registry."/>
<commit subject="Run more tests on the emulated architectures."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>CI updates.</p>
</release-item>
<release-item>
<commit subject="Add a smoke test to verify a build against installed PostgreSQL."/>
<commit subject="Log the full PostgreSQL version in the integration and smoke tests."/>
<commit subject="Run the smoke test in a container rather than on the runner."/>
<commit subject="Build and smoke test the distribution tarball on many distributions."/>
<commit subject="Output the architecture in the smoke test."/>
<commit subject="Run the smoke test on MacOS and FreeBSD."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add a smoke test to verify a build against installed PostgreSQL.</p>
</release-item>
<release-item>
<commit subject="Fix test error message typos and add error details."/>
<commit subject="Fix incorrect postgres/interface unit test title."/>
<commit subject="Add alternate error to common/io/tls test module for WSL."/>
<commit subject="Rename execOne() to execOneExpect()."/>
<commit subject="Add valgrind suppressions for libbacktrace unwind false positives."/>
<commit subject="Add code count exclusion for SVG files."/>
<commit subject="Report a readable status when a test system command fails."/>
<commit subject="Add linter check for hidden characters and binary files."/>
<commit subject="Report the actual error when a unit test fails during coverage testing."/>
<commit subject="Remove code count functionality from test.pl."/>
<commit subject="Normalize harness definitions in define.yaml to YAML lists."/>
<commit subject="Move test harness files to test/src/harness and drop the prefix."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-contributor id="yegor.zhmak"/>
</release-item-contributor-list>
<p>Improve the test harness.</p>
</release-item>
<release-item>
<commit subject="Ensure backup-timestamp-start is non-zero in unit tests."/>
<commit subject="Test changes in preparation for additional verification of backup.info."/>
<commit subject="Remove extraneous pathSync test in the SFTP storage driver."/>
<commit subject="Test the Posix driver for syncPath rather than StorageWrite."/>
<commit subject="Refactor SFTP unit tests."/>
<commit subject="Change storage for storageMoveP() call in storage/posix unit test."/>
<commit subject="Prevent a flaky command/control test when stop terminates a process."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-contributor id="denis.garsh"/>
</release-item-contributor-list>
<p>Improve unit tests.</p>
</release-item>
</release-development-list>
</release-test-list>
</release>

View File

@@ -13,6 +13,8 @@
</release-item-contributor-list>
<p>Fix hang when the chunk buffer is smaller than the input buffer.</p>
<p>A multi-part upload to <proper>S3</proper>, <proper>GCS</proper>, or <proper>Azure</proper> could loop forever when the chunk buffer was smaller than the input buffer, e.g. after the chunk size grew during the upload. The chunk buffer is now always large enough to hold the input buffer.</p>
</release-item>
<release-item>
@@ -26,6 +28,8 @@
</release-item-contributor-list>
<p>Compare a new backup label only against its own full backup set.</p>
<p>Some object stores keep listing a prefix after everything under it has been deleted, e.g. <proper>MinIO</proper> with object locking or <proper>SeaweedFS</proper>, so a full backup that was removed could still appear in the repository. Every diff and incr backup after it then failed with <quote>new backup label ... is not later than latest backup label ...</quote>. A new label is now compared only against the backups in its own full backup set.</p>
</release-item>
<release-item>
@@ -39,6 +43,8 @@
</release-item-contributor-list>
<p>Fix source archives generated by GitHub missing files required to build.</p>
<p>The source archives <proper>GitHub</proper> generates for a release were missing the code generation tooling and the files it reads, so they could not be built. Only the distribution tarball is trimmed now.</p>
</release-item>
</release-bug-list>
@@ -50,6 +56,8 @@
</release-item-contributor-list>
<p><proper>PostgreSQL 19beta3</proper> support.</p>
<p><postgres/> 19beta3 changed the WAL page magic number.</p>
</release-item>
</release-feature-list>
</release-core-list>
@@ -64,6 +72,8 @@
</release-item-contributor-list>
<p>Document exception for dots in <proper>S3</proper> bucket names when <setting>repo-s3-uri-style=path</setting>.</p>
<p>With <br-option>repo-s3-uri-style=path</br-option> the bucket is part of the path instead of the host name, so dots in the bucket name do not cause a certificate host name mismatch.</p>
</release-item>
<release-item>
@@ -74,7 +84,19 @@
</release-item-contributor-list>
<p>Remove explicit <pg-setting>hot_standby</pg-setting> configuration from user guide.</p>
<p><pg-setting>hot_standby</pg-setting> has been enabled by default since <postgres/> 10. The quickstart now notes that a standby does not accept read-only connections without it.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Fix broken release link in news.xml.</p>
</release-item>
</release-development-list>
</release-doc-list>
</release>

View File

@@ -12,6 +12,8 @@
</release-item-contributor-list>
<p>Fix empty block map when file is truncated to zero during backup.</p>
<p>A block incremental file larger than <setting>repo-bundle-limit</setting> and truncated to zero by <postgres/> during a backup was stored as a block map with no blocks. Every later backup that referenced the file failed with <quote>unexpected eof</quote> until the next full backup.</p>
</release-item>
<release-item>
@@ -25,6 +27,8 @@
</release-item-contributor-list>
<p>Disable read retry when filters are passed to the driver.</p>
<p>A retried read from a repository on an object store, accessed through a repository host, crashed. These reads are no longer retried by the client. The repository host still retries its read from the object store.</p>
</release-item>
<release-item>
@@ -39,6 +43,8 @@
</release-item-contributor-list>
<p>Fix pagination of <proper>S3</proper> version listing.</p>
<p>Reading a repository at a target time with <setting>repo-target-time</setting> failed with <quote>unable to find child 'NextContinuationToken'</quote> when more than a thousand versions were listed under a prefix.</p>
</release-item>
<release-item>
@@ -52,6 +58,8 @@
</release-item-contributor-list>
<p>Set the <proper>Azure</proper> version header for <id>SAS</id> authentication.</p>
<p>Batch deletes require the version header, so with <id>SAS</id> authentication every batch was rejected. The rejection looked like a single failed file, and the rest of each batch was not deleted while <cmd>expire</cmd> reported success, leaving expired backups and WAL in the repository.</p>
</release-item>
<release-item>
@@ -65,6 +73,8 @@
</release-item-contributor-list>
<p>Fix async <cmd>archive-push</cmd> stalling on a zero-size backup history file.</p>
<p>A zero-size backup history file, e.g. in a cluster copied from a storage snapshot, failed every asynchronous <cmd>archive-push</cmd> run, so no WAL was archived. <setting>archive-push-batch-size</setting> is now converted to a segment count using the size of the first ready WAL segment.</p>
</release-item>
<release-item>
@@ -76,6 +86,8 @@
</release-item-contributor-list>
<p>Fix <cmd>annotate</cmd> command on a remote encrypted repository.</p>
<p>When the repository was encrypted and the cipher was configured only on the repository host, <cmd>annotate</cmd> failed to load <file>backup.info</file>.</p>
</release-item>
</release-bug-list>
@@ -86,6 +98,8 @@
</release-item-contributor-list>
<p><proper>PostgreSQL 19beta4</proper> support.</p>
<p><postgres/> 19beta4 reverted online page checksum changes, so the page checksum version is again limited to 0 and 1. It also changed the <file>pg_control</file> version and the WAL page magic number.</p>
</release-item>
</release-feature-list>
</release-core-list>

View File

@@ -15,6 +15,8 @@
</release-item-contributor-list>
<p>Fix possible checksum error loading encrypted info and manifest files.</p>
<p>A large encrypted info or manifest file could lose its last lines when loaded, which failed the checksum. The lost lines had to fit in the final cipher block, so this is unlikely in practice.</p>
</release-item>
<release-item>
@@ -29,6 +31,8 @@
</release-item-contributor-list>
<p>Fix possible weak encryption subkeys/salts.</p>
<p>When <proper>OpenSSL</proper> could not get random data from the operating system the failure was ignored, and subkeys and salts were generated from memory that was not random. An error is now reported.</p>
</release-item>
</release-bug-list>
</release-core-list>

View File

@@ -19,6 +19,8 @@
</release-item-contributor-list>
<p>Add <br-option>checksum-page-error</br-option> option to error on invalid page checksums.</p>
<p>This option applies to the <cmd>backup</cmd>, <cmd>restore</cmd>, and <cmd>expire</cmd> commands. The <cmd>backup</cmd> command defaults to a warning for each file (as before) and now also reports the total number of checksum warnings at the end of the backup. The <cmd>restore</cmd> and <cmd>expire</cmd> commands default to an error. Previously the <cmd>restore</cmd> command did not report invalid page checksums at all.</p>
</release-item>
<release-item>
@@ -34,23 +36,17 @@
</release-item-contributor-list>
<p>Support for <proper>GCS</proper> Workload Identity Federation.</p>
</release-item>
</release-feature-list>
<release-improvement-list>
<release-item>
<github-pull-request id="2783"/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="andrew.pogrebnoi"/>
</release-item-contributor-list>
<p>Prefetch multi-file/range reads from object stores.</p>
<p>Set <br-option>repo-gcs-key-type=web-id</br-option> and set <br-option>repo-gcs-key</br-option> to an external account credential file, e.g. as generated by <code>gcloud iam workload-identity-pools create-cred-config</code>. The web identity token is exchanged for an access token without a service account key. The token file is reloaded on each exchange to pick up rotated tokens, e.g. <proper>Kubernetes</proper> projected service account tokens. Service account impersonation is not supported.</p>
</release-item>
<release-item>
<github-pull-request id="2816"/>
<commit subject="Prefetch multi-file/range reads from object stores.">
<github-pull-request id="2783"/>
</commit>
<commit subject="Combine prior block incremental map reads during backup.">
<github-pull-request id="2816"/>
</commit>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
@@ -58,7 +54,24 @@
<release-item-reviewer id="douglas.j.hunley"/>
</release-item-contributor-list>
<p>Combine prior block incremental map reads during backup.</p>
<p>Prefetch multi-file/range reads from object stores.</p>
<p>Requests are queued ahead of the current read so requests proceed while reading, and small gaps between files are read over instead of starting a new request. <cmd>Restore</cmd> uses this to read bundled files and block incremental maps, and <cmd>backup</cmd> uses it to read block incremental maps from the prior backup. <br-option>repo-storage-prefetch</br-option> (default 3) sets how many requests are queued and <br-option>repo-storage-read-over</br-option> (default 64KiB) sets the largest gap that is read over.</p>
</release-item>
</release-feature-list>
<release-improvement-list>
<release-item>
<commit subject="Send keep-alive noops only when the client has been idle."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="douglas.j.hunley"/>
</release-item-contributor-list>
<p>Reduce keep-alive requests to remote processes.</p>
<p>A keep-alive was sent to every remote each time a job completed in <cmd>archive-push</cmd> and <cmd>backup</cmd>, even when the remotes had just been sent a request. A keep-alive is now sent only when no request has been sent to the remote for 30 seconds.</p>
</release-item>
<release-item>
@@ -71,6 +84,8 @@
</release-item-contributor-list>
<p>Retry <proper>Azure</proper> batch sub-requests missing from the response.</p>
<p>When <proper>Azure</proper> fails a batch delete it may return a single response for the entire batch. The sub-requests with no response were treated as complete, so only one file per batch was removed while the command reported success. Sub-requests with no response are now retried.</p>
</release-item>
<release-item>
@@ -84,6 +99,8 @@
</release-item-contributor-list>
<p>Reduce the manifest checks made when reconstructing <file>backup.info</file>.</p>
<p>The <cmd>backup</cmd>, <cmd>expire</cmd>, and <cmd>annotate</cmd> commands no longer check for a <file>backup.manifest</file> when the repository listing shows the backup path does not exist, or when a diff or incr backup belongs to a full backup set that is not in <file>backup.info</file>. Each check is a request so on an object store the check for a missing manifest is logged as a 404.</p>
</release-item>
<release-item>
@@ -95,10 +112,17 @@
</release-item-contributor-list>
<p>Use original size to determine if a file should be bundled.</p>
<p>The size of a block incremental file in the prior backup was used to decide whether to bundle it, so a file that had grown past <br-option>repo-bundle-limit</br-option> could still be stored in a bundle. The current size of the file is now used.</p>
</release-item>
<release-item>
<github-pull-request id="2830"/>
<commit subject="Add context to block map read errors during backup.">
<github-issue id="2489"/>
<github-issue id="2829"/>
<github-pull-request id="2830"/>
</commit>
<commit subject="Fix option name in block incremental map errors."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
@@ -107,6 +131,21 @@
</release-item-contributor-list>
<p>Add context to block map read errors during backup.</p>
<p>An error reading the block map of a prior backup now reports the file, repository path, offset, and map size. A read that returns fewer bytes than expected is reported as such instead of as a parse error.</p>
</release-item>
<release-item>
<github-issue id="2873"/>
<release-item-contributor-list>
<release-item-contributor id="tiago.corcelli.de.oliveira"/>
<release-item-reviewer id="david.steele"/>
</release-item-contributor-list>
<p>Cast <id>current_timestamp</id> to <id>text</id> in the backup start label.</p>
<p>A user-defined implicit cast from <id>timestamptz</id> to <id>text</id> caused the backup to fail with <quote>operator is not unique: unknown || timestamp with time zone</quote>. The label text is unchanged.</p>
</release-item>
<release-item>
@@ -119,17 +158,48 @@
</release-item-contributor-list>
<p>Support building on <proper>illumos</proper>.</p>
<p>An <proper>OmniOS</proper> job has been added to CI. <proper>Solaris</proper> may also work but has not been tested.</p>
</release-item>
<release-item>
<github-issue id="2873"/>
<commit subject="Fix compilation with OpenSSL 4."/>
<release-item-contributor-list>
<release-item-contributor id="tiago.corcelli.de.oliveira"/>
<release-item-reviewer id="david.steele"/>
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="douglas.j.hunley"/>
</release-item-contributor-list>
<p>Cast <id>current_timestamp</id> to <id>text</id> in the backup start label.</p>
<p>Support <proper>OpenSSL</proper> 4.</p>
<p>Building against <proper>OpenSSL</proper> 4 failed because <code>X509_get_subject_name()</code> now returns a <code>const</code> name.</p>
</release-item>
<release-item>
<commit subject="Require the header when checking for libbacktrace."/>
<commit subject="Return the declared type from functions that return a StringId-based enum."/>
<commit subject="Return bool from a function declared to return bool."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="douglas.j.hunley"/>
</release-item-contributor-list>
<p>Fix clang builds.</p>
<p>On <proper>Linux</proper>, gcc installs <file>libbacktrace.a</file> where clang also looks for it but installs <file>backtrace.h</file> where only gcc can find it. A clang build found the library and then failed to compile. The library is now only used when its header is found. Return types that clang reports as narrowing conversions in debug builds are also fixed.</p>
</release-item>
<release-item>
<commit subject="Migrate the build and documentation code from C to Python."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Migrate code generation from <proper>C</proper> to <proper>Python</proper>.</p>
<p>Code is generated during the build from the option, error, help, and <postgres/> declarations by a <proper>Python</proper> tool instead of a <proper>C</proper> tool that had to be built first. Building from a git checkout requires <proper>PyYAML</proper> instead of <proper>libyaml</proper>. The release tarball includes the generated code and requires neither.</p>
</release-item>
</release-improvement-list>
@@ -147,14 +217,16 @@
</release-item>
<release-item>
<github-pull-request id="2836"/>
<commit subject="Derive the cipher key with SHA-256 at repository format 6.">
<github-pull-request id="2836"/>
</commit>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-reviewer id="douglas.j.hunley"/>
</release-item-contributor-list>
<p>Derive the cipher key with <id>SHA-256</id> at repository format 6</p>
<p>Derive the cipher key with <id>SHA-256</id> for repository format 6.</p>
</release-item>
<release-item>
@@ -214,15 +286,148 @@
</release-item>
<release-item>
<github-issue id="2858"/>
<github-pull-request id="2859"/>
<commit subject="Fix out-of-bounds read when decoding an empty base64 string."/>
<commit subject="Fix out-of-bounds read when adding to the protocol client session list."/>
<release-item-contributor-list>
<release-item-contributor id="stefan.fercot"/>
<release-item-reviewer id="david.steele"/>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Allow test user names that adduser on Debian rejects.</p>
<p>Fix out-of-bounds reads found by <proper>Fil-C</proper>.</p>
</release-item>
<release-item>
<commit subject="Add UNLIKELY() macro for error checks."/>
<commit subject="Check the mem context stack bounds in production builds."/>
<commit subject="Limit the depth of nested containers when reading JSON."/>
<commit subject="Fix reads past the end of JSON strings ending in an escape."/>
<commit subject="Reject unexpected commas when reading JSON."/>
<commit subject="Reject \u0000 when reading JSON strings."/>
<commit subject="Accept hex digits in JSON \u escapes when skipping."/>
<commit subject="Error on invalid field ids when reading packs."/>
<commit subject="Check pack field sizes against the bytes remaining in a buffer."/>
<commit subject="Error on zero-size pack fields."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Fix bugs in the <proper>JSON</proper> and pack readers found by fuzzing.</p>
</release-item>
<release-item>
<commit subject="Allow shimmed functions to be defined in included modules."/>
<commit subject="Refactor backup module into included modules."/>
<commit subject="Refactor backup file into an included module."/>
<commit subject="Refactor restore file module into an included module."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Refactor the backup and restore modules into included modules.</p>
</release-item>
<release-item>
<commit subject="Remove unused struct members."/>
<commit subject="Remove struct member that was only written."/>
<commit subject="Remove unused function parameters."/>
<commit subject="Remove parameters used only by an assert."/>
<commit subject="Do not log parameters that only an assert reads."/>
<commit subject="Cast unused interface parameters to void rather than logging them."/>
<commit subject="Add a unity build check for unused parameters."/>
<commit subject="Rename the unity job to lint and widen what it checks."/>
<commit subject="Remove unused arg_unity variable."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Remove unused parameters and struct members.</p>
</release-item>
<release-item>
<commit subject="Use the matching END macro to close MEM_CONTEXT_OBJ/PRIOR blocks."/>
<commit subject="Check that a block macro is closed by the macro that matches it."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Check that block macros are closed by the macro that matches them.</p>
</release-item>
<release-item>
<commit subject="Include the generated help data in the help command."/>
<commit subject="Generate the code meson builds into the build path."/>
<commit subject="Generate the PostgreSQL interfaces the test harness uses."/>
<commit subject="Regenerate the PostgreSQL interface when its headers change."/>
<commit subject="Render a PostgreSQL interface function once per set of types it uses."/>
<commit subject="Represent the values that vary by version as interface data."/>
<commit subject="Regenerate the built code when the generator changes."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve code generation for the help and <postgres/> interfaces.</p>
</release-item>
<release-item>
<commit subject="Name options with an index when not valid for the command."/>
<commit subject="Clear archive async errors from the correct spool queue."/>
<commit subject="Fix cvtDivToZ() rendering of a quotient less than one."/>
<commit subject="Fix mem context in GCS service key parsing."/>
<commit subject="Allow time option values greater than 49 days."/>
<commit subject="Check the result of EVP_BytesToKey() and HMAC()."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
<release-item-contributor id="stefan.fercot"/>
</release-item-contributor-list>
<p>Fix minor issues.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Store the file owner as an index rather than a pointer in the pack.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Increase the minimum meson version to 0.55.3.</p>
</release-item>
<release-item>
<commit subject="Build the expected symbol list into the unity check."/>
<commit subject="Check the unity build object rather than the binary."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Check the unity build object for unexpected exported symbols.</p>
</release-item>
<release-item>
<commit subject="Fix incorrect header comment."/>
<commit id="9b3831242" subject="Fix lines that exceed 132 characters."/>
<commit id="3f590f701" subject="Fix lines that exceed 132 characters."/>
<commit subject="Add a linter for lines that exceed 132 characters."/>
<commit subject="Add reformatting and rename commits to .git-blame-ignore-revs."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add a line length linter and fix formatting issues.</p>
</release-item>
</release-development-list>
</release-core-list>
@@ -230,6 +435,8 @@
<release-doc-list>
<release-improvement-list>
<release-item>
<commit subject="Shorten and disambiguate the documentation titles."/>
<commit subject="Move the sponsors down the index and shorten the appeal."/>
<commit subject="Modernize the website."/>
<commit subject="Show a card rather than the logo where a link is posted."/>
<commit subject="Remove the contents from the releases page and close up the date."/>
@@ -240,7 +447,6 @@
<commit subject="Copy a command as well as a config file."/>
<commit subject="Error when a config section changes nothing the reader can see."/>
<commit subject="Make the site logo a link home."/>
<commit subject="Stop setting hot_standby in the user guide."/>
<commit subject="Speed up the documentation build."/>
<commit subject="List the most recent news items on the index automatically."/>
<commit subject="Render option type examples as code blocks in the reference."/>
@@ -265,7 +471,268 @@
</release-item-contributor-list>
<p>Modernize the website. Special thanks to Jan for the insightful (and hilarious) logo.</p>
<p>The website has a new design with light and dark themes and a layout that works on phones. Pages with a table of contents show it beside the text and mark the section being read. Commands and config files can be copied with a button, config files mark the lines each section changes, and release notes can be expanded to show more detail.</p>
</release-item>
<release-item>
<commit subject="Document the release schedule."/>
<commit subject="Update release numbering in the release notes intro."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Document the release schedule.</p>
<p>Feature releases are scheduled for the third Monday of January, April, July, and October. Patch releases are scheduled for the third Monday of any other month as required. The release notes introduction also describes the major, minor, and patch parts of a release number.</p>
</release-item>
<release-item>
<commit subject="Migrate the build and documentation code from C to Python."/>
<commit subject="Migrate the remaining documentation code from Perl to Python."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Migrate the documentation tools from <proper>C</proper> and <proper>Perl</proper> to <proper>Python</proper>.</p>
<p>The documentation is built by <file>doc/doc.py</file> instead of a <proper>C</proper> tool run by <file>doc/doc.pl</file>, and building the documentation no longer requires <proper>Perl</proper>.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<commit subject="Add a blank line after code blocks in generated markdown."/>
<commit subject="Remove the blank line between list items in generated markdown."/>
<commit subject="Generate DIST.md from XML like the other markdown docs."/>
<commit subject="Share the build package list between the user guide and DIST.md."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Generate <file>DIST.md</file> from XML and improve the generated markdown.</p>
</release-item>
<release-item>
<commit subject="Verify that page/section links point at an existing section."/>
<commit subject="Check the allow list an option documents against the declaration."/>
<commit subject="Inherit an allow list documented under a command."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Check documentation links and option allow lists.</p>
</release-item>
<release-item>
<commit subject="Remove the pretty and compact documentation render modes."/>
<commit subject="Fix stale Perl script names in the dist script."/>
<commit subject="Update contributor github account."/>
<commit subject="Select the release documentation to build by distro rather than vm."/>
<commit subject="Skip deploying pages that differ from the site only in the release date."/>
<commit subject="Generate git-history.cache from git instead of committing it."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve the documentation build and deploy.</p>
</release-item>
<release-item>
<commit subject="Prune the GHCR container caches on a schedule."/>
<commit subject="Add retry to S3 put-bucket-versioning in the user guide build."/>
<commit subject="Cache the documentation build base images in a GHCR package."/>
<commit subject="Replace Ceph with SeaweedFS for the S3 documentation and test host."/>
<commit subject="Reduce RHEL documentation build exposure to slow package mirrors."/>
<commit subject="Update SeaweedFS to 4.41 in the documentation build."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve the documentation build containers.</p>
</release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Merge coding standards into the contributing guide.</p>
</release-item>
</release-development-list>
</release-doc-list>
<release-test-list>
<release-improvement-list>
<release-item>
<commit subject="Migrate the test harness from C to Python."/>
<commit subject="Migrate the rest of the test harness from Perl to Python."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Migrate the test harness from <proper>C</proper> and <proper>Perl</proper> to <proper>Python</proper>.</p>
<p>Tests are run with <file>test/test.py</file> instead of <file>test/test.pl</file>. The test containers and CI runners no longer require <proper>Perl</proper> and the harness is covered by tests.</p>
</release-item>
<release-item>
<commit subject="Add a workflow to compile and test on the runner without a container."/>
<commit subject="Add a Fil-C job to the compile workflow."/>
<commit subject="Use the Fil-C distribution as-is now that it ships every library needed."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add a <proper>Fil-C</proper> job to CI.</p>
<p><proper>Fil-C</proper> is a memory-safe implementation of <proper>C</proper> that checks every pointer access. It found two out-of-bounds reads that gcc, clang, and <proper>Valgrind</proper> missed. A new workflow also builds and tests on the CI runner with gcc and clang, with and without the optional libraries.</p>
</release-item>
<release-item>
<commit subject="Add fuzz testing for the JSON, ini, and pack readers."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Add fuzz testing for the <code>JSON</code>, <code>Ini</code>, and <code>Pack</code> readers.</p>
<p>The readers are fuzzed with libFuzzer, AddressSanitizer, and UndefinedBehaviorSanitizer in CI. Fuzzing found several bugs in how invalid input is read, e.g. deeply nested <proper>JSON</proper> arrays in an info file or an object store response could overflow the memory context stack.</p>
</release-item>
<release-item>
<github-issue id="2858"/>
<github-pull-request id="2859"/>
<release-item-contributor-list>
<release-item-contributor id="stefan.fercot"/>
<release-item-reviewer id="david.steele"/>
</release-item-contributor-list>
<p>Allow test user names that adduser on Debian rejects.</p>
<p>The test container is built with the same user name as the host user. Debian's <file>adduser</file> rejects names that contain a dot, e.g. <id>first.last</id>, so the container build failed on Debian-based images for these users.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<commit subject="Fix test harness build when libsystemd is not present."/>
<commit subject="Fix test harness build when libssh2 is not present."/>
<commit subject="Fix conversions in tests that clang reports as errors."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Fix test builds with clang and without optional libraries.</p>
</release-item>
<release-item>
<commit subject="Convert the shim list in define.yaml from a map to a sequence."/>
<commit subject="Convert the smoke test to the new Python comment style."/>
<commit subject="Show the coverage report location when coverage is incomplete."/>
<commit subject="Select tests by module path instead of module and test."/>
<commit subject="Lint the source once per test run rather than once per test."/>
<commit subject="Run the linter and coverage in the test command."/>
<commit subject="Move --vm-build to a new vm-build command."/>
<commit subject="Move the vm definitions to test/container.yaml."/>
<commit subject="Trim the stack trace the tools show and report ctrl-c as a signal."/>
<commit subject="Allow any PostgreSQL version installed on a vm to be tested."/>
<commit subject="Never run the tests or start a container on a dry run."/>
<commit subject="Move the archive tests into a command/archive path."/>
<commit subject="Mirror the repository into the copy the tests are built from."/>
<commit subject="Fix tool tests that depend on the environment they run in."/>
<commit subject="Allow test.py options before the command."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve the <proper>Python</proper> test harness.</p>
</release-item>
<release-item>
<commit subject="Replace the soon-to-be EOL Debian 11 dist build with Debian 12."/>
<commit subject="Update tests and documentation builds to Ubuntu 24.04."/>
<commit subject="Run the code format check on Ubuntu 24.04."/>
<commit subject="Reduce RHEL container and dist test exposure to slow package mirrors."/>
<commit subject="Work around a slow apt mirror on the runner."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>CI updates.</p>
</release-item>
<release-item>
<commit subject="Add missing vm_covered annotations to the socket and TLS modules."/>
<commit subject="Add a linter check that every test module is defined in define.yaml."/>
<commit subject="Add missing vm_covered annotations to the storage modules."/>
<commit subject="Add missing modules to unit test coverage."/>
<commit subject="Check that every code module is covered by a test module."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Check that every code and test module is defined and covered.</p>
</release-item>
<release-item>
<commit subject="Add missing format to the info files in the repo tests."/>
<commit subject="Test verify against an encrypted repository."/>
<commit subject="Invalidate memory that leaves a Buffer, String, or List for Valgrind."/>
<commit subject="Create the data path for a performance test."/>
<commit subject="Specify the repo for stanza-delete in the integration test."/>
<commit subject="Use a bogus test port outside the ephemeral port range."/>
<commit subject="Move the test server port range below the ephemeral port range."/>
<release-item-contributor-list>
<release-item-contributor id="david.steele"/>
</release-item-contributor-list>
<p>Improve unit and integration tests.</p>
</release-item>
</release-development-list>
</release-test-list>
<release-backpatch-list>
<release-backpatch version="2.59.1">
<commit subject="Fix hang when the chunk buffer is smaller than the input buffer."/>
<commit subject="Compare a new backup label only against its own full backup set."/>
<commit subject="Move the distribution trimming from .gitattributes to dist.sh."/>
<commit subject="Document exception for dots in S3 bucket names when uri-style=path."/>
<commit subject="Stop setting hot_standby in the user guide."/>
<commit subject="PostgreSQL 19beta3 support."/>
<commit subject="Merge v2.59.1 release."/>
</release-backpatch>
<release-backpatch version="2.59.2">
<commit subject="Fix annotate and manifest commands on a remote encrypted repository."/>
<commit subject="Fix empty block map when file is truncated to zero during backup."/>
<commit subject="Disable read retry when filters are passed to the driver."/>
<commit subject="Set the Azure version header for SAS authentication."/>
<commit subject="Fix pagination of S3 version listing."/>
<commit subject="Fix async archive-push stalling on a zero-size backup history file."/>
<commit subject="PostgreSQL 19beta4 support."/>
<commit subject="Merge v2.59.2 release."/>
</release-backpatch>
<release-backpatch version="2.59.3">
<commit subject="Fix possible checksum error loading encrypted info and manifest files."/>
<commit subject="Fix possible weak encryption subkeys/salts."/>
<commit subject="Merge v2.59.3 release."/>
</release-backpatch>
</release-backpatch-list>
</release>

View File

@@ -60,6 +60,11 @@
<contributor-id type="github">arogozin</contributor-id>
</contributor>
<contributor id="aleksey.tsalolikhin">
<contributor-name-display>Aleksey Tsalolikhin</contributor-name-display>
<contributor-id type="github">atsaloli</contributor-id>
</contributor>
<contributor id="ales.zeleny">
<contributor-name-display>Ale&amp;scaron; Zelen&amp;yacute;</contributor-name-display>
<contributor-id type="github">aleszeleny</contributor-id>
@@ -675,6 +680,11 @@
<contributor-id type="github">j-naylor</contributor-id>
</contributor>
<contributor id="john.terrell">
<contributor-name-display>John W. Terrell</contributor-name-display>
<contributor-id type="github">john-terrell</contributor-id>
</contributor>
<contributor id="jordan.english">
<contributor-name-display>Jordan English</contributor-name-display>
<contributor-id type="github">jordanenglish</contributor-id>
@@ -765,6 +775,11 @@
<contributor-id type="github">retrodood</contributor-id>
</contributor>
<contributor id="kian-meng.ang">
<contributor-name-display>Kian-Meng Ang</contributor-name-display>
<contributor-id type="github">kianmeng</contributor-id>
</contributor>
<contributor id="krmozejko">
<contributor-name-display>krmozejko</contributor-name-display>
<contributor-id type="github">krmozejko</contributor-id>

View File

@@ -67,6 +67,7 @@ RELEASE_LIST = """
<release-item>
<release-item-contributor-list>
<release-item-ideator id="other.person"/>
<release-item-tester id="third.person"/>
</release-item-contributor-list>
<p>Fix a bug.</p>
@@ -138,12 +139,15 @@ RELEASE_LIST = """
# Releases with details and the history they are checked against
DETAIL_HISTORY = [
("dB", "Merge v2.10.1 release."),
("dA", "Fix a bug on a branch."),
("d8", "Rework the internals."),
("d0", "Improve speed."),
("d1", "Add a feature."),
("d2", "Fix a bug."),
("d3", 'Fix a "quoted" <bug>.'),
("d4", "Begin v2.60.0 development."),
("d5", "v2.59.0: Prior."),
("d5", "v2.10.0: Prior."),
("d6", "Improve a thing."),
("d7", "v1.00: Initial."),
]
@@ -181,10 +185,23 @@ DETAIL_RELEASE_LIST = """
<p>Speed things up.</p>
</release-item>
</release-feature-list>
<release-development-list>
<release-item>
<p>Rework the internals.</p>
</release-item>
</release-development-list>
</release-core-list>
<release-backpatch-list>
<release-backpatch version="2.10.1">
<commit subject="Fix a bug on a branch."/>
<commit subject="Merge v2.10.1 release."/>
</release-backpatch>
</release-backpatch-list>
</release>
<release date="2026-09-15" version="2.59.1" title="Patch">
<release date="2026-09-15" version="2.10.1" title="Patch">
<release-core-list>
<release-bug-list>
<release-item>
@@ -194,7 +211,7 @@ DETAIL_RELEASE_LIST = """
</release-core-list>
</release>
<release date="2026-09-01" version="2.59.0" title="Prior">
<release date="2026-09-01" version="2.10.0" title="Prior">
<release-core-list>
<release-improvement-list>
<release-item>
@@ -227,18 +244,28 @@ def _doc(release_list=RELEASE_LIST, contributor=CONTRIBUTOR):
####################################################################################################################################
def _render(content=None, dev=False, history=HISTORY):
def _history(history):
"""The cached form of a history."""
return [{"commit": commit, "date": "2026-07-30 00:00:00 +0000", "subject": subject} for commit, subject in history]
####################################################################################################################################
def _render(content=None, dev=False, history=HISTORY, claim=True, history_tag=None):
"""Build the release document from a release list."""
with tempfile.TemporaryDirectory() as path:
file_write(
os.path.join(path, "resource/git-history.cache"),
json.dumps(
[{"commit": commit, "date": "2026-07-30 00:00:00 +0000", "subject": subject} for commit, subject in history]
{
"head": _history(history),
"tag": {} if history_tag is None else {version: _history(tag) for version, tag in history_tag.items()},
}
),
)
return release_render(xml_parse(_doc() if content is None else content, "test.xml"), path, dev)
return release_render(xml_parse(_doc() if content is None else content, "test.xml"), path, dev, claim)
####################################################################################################################################
@@ -342,7 +369,7 @@ def test_release_render_item():
item = xml_node_child(xml_node_child(release, "list"), "list-item")
# The default contributor is dropped where they are the only one, so their name is not on every line of the page
assert_equal(xml_node_content(item), "Fix a bug. (Reported by Other Person.)")
assert_equal(xml_node_content(item), "Fix a bug. (Tested by Third Person. Reported by Other Person.)")
# A release of the documentation says so, and an item written as more than one paragraph reads as one line
supported = xml_node_child_list(root, "section")[3]
@@ -460,7 +487,7 @@ def test_release_render_contributor():
_render(
_doc(
RELEASE_LIST.replace(
'id="other.person"/>\n </release-item-contributor-list>\n\n'
'id="third.person"/>\n </release-item-contributor-list>\n\n'
" <p>Fix a bug.",
'id="nobody"/>\n </release-item-contributor-list>\n\n'
" <p>Fix a bug.",
@@ -530,7 +557,7 @@ def test_release_render_commit_ambiguous():
####################################################################################################################################
def test_release_render_detail():
"""Releases with version >= 2.60 have the paragraphs after the first and the links of an item in details."""
"""Releases with version >= _DETAIL_VERSION_MIN have the paragraphs after the first and the links of an item in details."""
root = _render(_doc(DETAIL_RELEASE_LIST), history=DETAIL_HISTORY)
@@ -573,7 +600,7 @@ def test_release_render_detail():
],
)
# Releases with version < 2.60 have no details
# Releases with version < _DETAIL_VERSION_MIN have no details
supported = xml_node_child_list(root, "section")[2]
assert_equal(_item_html(xml_node_child_list(supported, "section")[1]), ["Improve a thing. Say more."])
@@ -640,26 +667,530 @@ def test_release_render_detail_dev():
)
####################################################################################################################################
def test_release_render_commit_id():
"""A commit can be named by id when more than one commit has the same subject."""
history = DETAIL_HISTORY[:3] + [("e1", "Fix lines."), ("e2", "Fix lines.")] + DETAIL_HISTORY[3:]
release_list = DETAIL_RELEASE_LIST.replace(
"</release-feature-list>",
"""<release-item>
<commit id="e1" subject="Fix lines."/>
<commit id="e2" subject="Fix lines."/>
<p>Fix lines.</p>
</release-item>
</release-feature-list>""",
1,
)
root = _render(_doc(release_list), history=history)
release = xml_node_child_list(xml_node_child_list(root, "section")[1], "section")[0]
assert_equal(
_item_html(release)[3],
"Fix lines."
+ DETAIL_HTML
+ '\n<div class="list-detail-ref">'
+ '<span class="list-detail-ref-item"><a href="{[github-url-base]}/commit/e1"><span class="id">e1</span></a>'
+ " Fix lines.</span></div>"
+ '\n<div class="list-detail-ref">'
+ '<span class="list-detail-ref-item"><a href="{[github-url-base]}/commit/e2"><span class="id">e2</span></a>'
+ " Fix lines.</span></div></details>",
)
# An id that is not in the release
with assert_raises(ToolError) as raised:
_render(_doc(release_list.replace('<commit id="e2"', '<commit id="e3"')), history=history)
assert_in("unable to find release 2.60.0 commit id 'e3' in list", str(raised.exception))
# An id that more than one commit begins with
with assert_raises(ToolError) as raised:
_render(_doc(release_list.replace('<commit id="e2"', '<commit id="e"')), history=history)
assert_equal(str(raised.exception), "commit prefix 'e' already found in commit e2")
# An id needs a subject and the subject of the commit must begin with it
with assert_raises(ToolError) as raised:
_render(_doc(release_list.replace('<commit id="e2" subject="Fix lines."/>', '<commit id="e2"/>')), history=history)
assert_equal(str(raised.exception), "unable to find attribute 'subject' in node 'commit'")
with assert_raises(ToolError) as raised:
_render(
_doc(release_list.replace('<commit id="e2" subject="Fix lines."/>', '<commit id="e2" subject="Fix more lines."/>')),
history=history,
)
assert_equal(str(raised.exception), "release 2.60.0 commit id 'e2' subject 'Fix lines.' does not begin with 'Fix more lines.'")
####################################################################################################################################
def test_release_render_backpatch():
"""Commits back-patched to a patch release are listed on a development build, grouped by the version of the patch release."""
root = _render(_doc(DETAIL_RELEASE_LIST), dev=True, history=DETAIL_HISTORY)
release = xml_node_child_list(xml_node_child_list(root, "section")[1], "section")[0]
assert_in("Back-Patched:", "".join(xml_node_content(node) for node in xml_node_child_list(release, "p")))
assert_equal(
_item_html(release)[-1],
'Back-patched to <a href="#2.10.1">v2.10.1</a>.'
+ DETAIL_HTML
+ '\n<div class="list-detail-ref">'
+ '<span class="list-detail-ref-item"><a href="{[github-url-base]}/commit/dA"><span class="id">dA</span></a>'
+ " Fix a bug on a branch.</span></div>"
+ '\n<div class="list-detail-ref">'
+ '<span class="list-detail-ref-item"><a href="{[github-url-base]}/commit/dB"><span class="id">dB</span></a>'
+ " Merge v2.10.1 release.</span></div></details>",
)
# The commits are claimed but not listed on a release build
root = _render(_doc(DETAIL_RELEASE_LIST), history=DETAIL_HISTORY)
assert_not_in("Back-Patched:", xml_node_content(xml_node_child_list(xml_node_child_list(root, "section")[1], "section")[0]))
# The version must be a patch release in the list
for backpatch_version in ("2.10.0", "2.09.1"):
with assert_raises(ToolError) as raised:
_render(
_doc(
DETAIL_RELEASE_LIST.replace(
'<release-backpatch version="2.10.1">', '<release-backpatch version="%s">' % backpatch_version
)
),
history=DETAIL_HISTORY,
)
assert_equal(str(raised.exception), "release 2.60.0 back-patch version %s is not a patch release" % backpatch_version)
# A back-patch has commits
with assert_raises(ToolError) as raised:
_render(
_doc(
DETAIL_RELEASE_LIST.replace(
'<release-backpatch version="2.10.1">',
'<release-backpatch version="2.10.1"/>\n <release-backpatch version="2.10.1">',
)
),
history=DETAIL_HISTORY,
)
assert_equal(str(raised.exception), "release 2.60.0 back-patch version 2.10.1 has no commits")
# Development items that name the release note of a later release
NOTE_RELEASE_LIST = """
<release date="2026-12-01" version="2.62.0" title="Final">
<release-core-list>
<release-feature-list>
<release-item>
<p>Finish the thing.</p>
</release-item>
</release-feature-list>
</release-core-list>
</release>
<release date="2026-11-01" version="2.61.0" title="Beta">
<release-core-list>
<release-feature-list>
<release-item>
<p>Add the thing.</p>
</release-item>
</release-feature-list>
<release-improvement-list>
<release-item>
<p>Add the thing to the docs.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<release-note version="2.62.0" subject="Finish the thing."/>
<p>Polish the thing.</p>
</release-item>
</release-development-list>
</release-core-list>
</release>
<release date="2026-10-01" version="2.60.0" title="Start">
<release-core-list>
<release-improvement-list>
<release-item>
<p>Improve a thing.</p>
</release-item>
</release-improvement-list>
<release-development-list>
<release-item>
<release-note version="2.61.0" subject="Add the thing."/>
<commit subject="Prepare the thing."/>
<commit subject="Refactor for the thing."/>
<p>Prepare for the thing.</p>
</release-item>
<release-item>
<release-note version="2.61.0" subject="Add the thing."/>
<github-pull-request id="8"/>
<p>Start the thing.</p>
</release-item>
<release-item>
<release-note version="2.61.0" subject="Add the thing."/>
<p>Tidy the thing.</p>
</release-item>
</release-development-list>
</release-core-list>
</release>
<release date="2025-01-01" version="1.00" title="Initial"/>
"""
NOTE_HISTORY = [
("p3", "v2.62.0: Final."),
("p1", "Finish the thing."),
("n4", "v2.61.0: Beta."),
("n3", "Add the thing to the docs."),
("n2", "Polish the thing."),
("n1", "Add the thing."),
("m5", "v2.60.0: Start."),
("m6", "Tidy the thing."),
("m4", "Refactor for the thing."),
("m3", "Prepare the thing."),
("m2", "Start the thing."),
("m1", "Improve a thing."),
("m0", "v1.00: Initial."),
]
####################################################################################################################################
def test_release_render_release_note():
"""A development item may name the release note of a later release, which lists the development item in its details."""
root = _render(_doc(NOTE_RELEASE_LIST), history=NOTE_HISTORY)
current = xml_node_child_list(xml_node_child_list(root, "section")[1], "section")[0]
supported = xml_node_child_list(xml_node_child_list(root, "section")[2], "section")
assert_equal(
_item_html(current),
[
"Finish the thing."
+ DETAIL_HTML
+ '\n<div class="list-detail-ref"><span class="list-detail-ref-item">Commit '
+ '<a href="{[github-url-base]}/commit/p1"><span class="id">p1</span></a></span></div>'
+ '\n<div class="list-detail-ref">'
+ '<span class="list-detail-ref-item">Development in <a href="#2.61.0">v2.61.0</a>:</span></div>'
+ '\n<div class="list-detail-ref">'
+ '<span class="list-detail-ref-item"><a href="{[github-url-base]}/commit/n2"><span class="id">n2</span></a>'
+ " Polish the thing.</span></div></details>"
],
)
# Development items of the same release are listed under one line and the links of a development item with one commit are on the
# line of the commit
assert_equal(
_item_html(supported[0])[0],
"Add the thing."
+ DETAIL_HTML
+ '\n<div class="list-detail-ref"><span class="list-detail-ref-item">Commit '
+ '<a href="{[github-url-base]}/commit/n1"><span class="id">n1</span></a></span></div>'
+ '\n<div class="list-detail-ref">'
+ '<span class="list-detail-ref-item">Development in <a href="#2.60.0">v2.60.0</a>:</span></div>'
+ '\n<div class="list-detail-ref">'
+ '<span class="list-detail-ref-item"><a href="{[github-url-base]}/commit/m3"><span class="id">m3</span></a>'
+ " Prepare the thing.</span></div>"
+ '\n<div class="list-detail-ref">'
+ '<span class="list-detail-ref-item"><a href="{[github-url-base]}/commit/m4"><span class="id">m4</span></a>'
+ " Refactor for the thing.</span></div>"
+ '\n<div class="list-detail-ref">'
+ '<span class="list-detail-ref-item"><a href="{[github-url-base]}/commit/m2"><span class="id">m2</span></a>'
+ " Start the thing.</span>"
+ '<span class="list-detail-ref-item">Pull request <a href="{[github-url-base]}/pull/8">#8</a></span></div>'
+ '\n<div class="list-detail-ref">'
+ '<span class="list-detail-ref-item"><a href="{[github-url-base]}/commit/m6"><span class="id">m6</span></a>'
+ " Tidy the thing.</span></div></details>",
)
# A development build links a development item to the release of its release note
root = _render(_doc(NOTE_RELEASE_LIST), dev=True, history=NOTE_HISTORY)
supported = xml_node_child_list(xml_node_child_list(root, "section")[2], "section")
assert_equal(
_item_html(supported[1])[1],
"Prepare for the thing."
+ DETAIL_HTML
+ '\n<div class="list-detail-ref">'
+ '<span class="list-detail-ref-item">Development for <q>Add the thing</q> in <a href="#2.61.0">v2.61.0</a>:</span></div>'
+ '\n<div class="list-detail-ref">'
+ '<span class="list-detail-ref-item"><a href="{[github-url-base]}/commit/m3"><span class="id">m3</span></a>'
+ " Prepare the thing.</span></div>"
+ '\n<div class="list-detail-ref">'
+ '<span class="list-detail-ref-item"><a href="{[github-url-base]}/commit/m4"><span class="id">m4</span></a>'
+ " Refactor for the thing.</span></div></details>",
)
assert_equal(
_item_html(supported[1])[2],
"Start the thing."
+ DETAIL_HTML
+ '\n<div class="list-detail-ref">'
+ '<span class="list-detail-ref-item">Development for <q>Add the thing</q> in <a href="#2.61.0">v2.61.0</a>:</span></div>'
+ '\n<div class="list-detail-ref">'
+ '<span class="list-detail-ref-item">Pull request <a href="{[github-url-base]}/pull/8">#8</a></span>'
+ '<span class="list-detail-ref-item">Commit '
+ '<a href="{[github-url-base]}/commit/m2"><span class="id">m2</span></a></span></div></details>',
)
# A release in development is named by the version it will have when it is released
root = _render(
_doc(NOTE_RELEASE_LIST.replace('date="2026-12-01" version="2.62.0"', 'date="XXXX-XX-XX" version="2.62.0dev"')),
dev=True,
history=NOTE_HISTORY[1:],
)
current = xml_node_child_list(xml_node_child_list(root, "section")[2], "section")[0]
assert_equal(
_item_html(current)[2],
"Polish the thing."
+ DETAIL_HTML
+ '\n<div class="list-detail-ref">'
+ '<span class="list-detail-ref-item">Development for <q>Finish the thing</q> in '
+ '<a href="#2.62.0dev">v2.62.0dev</a>:</span></div>'
+ '\n<div class="list-detail-ref"><span class="list-detail-ref-item">Commit '
+ '<a href="{[github-url-base]}/commit/n2"><span class="id">n2</span></a></span></div></details>',
)
# The release note must be in a later release
for version in ("2.60.0", "2.70.0"):
with assert_raises(ToolError) as raised:
_render(
_doc(
NOTE_RELEASE_LIST.replace(
'version="2.61.0" subject="Add the thing."', 'version="%s" subject="Add"' % version, 1
)
),
history=NOTE_HISTORY,
)
assert_equal(str(raised.exception), "release 2.60.0 release note version %s is not a later release" % version)
# The release note must be found once
with assert_raises(ToolError) as raised:
_render(
_doc(NOTE_RELEASE_LIST.replace('subject="Add the thing."', 'subject="Add another thing."', 1)), history=NOTE_HISTORY
)
assert_equal(str(raised.exception), "release 2.60.0 release note 'Add another thing.' not found in release 2.61.0")
with assert_raises(ToolError) as raised:
_render(_doc(NOTE_RELEASE_LIST.replace('subject="Add the thing."', 'subject="Add the thing"', 1)), history=NOTE_HISTORY)
assert_equal(str(raised.exception), "release 2.60.0 release note 'Add the thing' found more than once in release 2.61.0")
# Only a development item may name a release note
with assert_raises(ToolError) as raised:
_render(
_doc(
NOTE_RELEASE_LIST.replace(
"<p>Finish the thing.</p>", '<release-note version="2.62.0" subject="Finish"/>\n<p>Finish the thing.</p>'
)
),
history=NOTE_HISTORY,
)
assert_equal(
str(raised.exception), "release 2.62.0 item 'Finish the thing.' is not a development item and cannot name a release note"
)
# A patch release built on a branch of its own
PATCH_RELEASE_LIST = """
<release date="2026-12-01" version="2.61.0" title="Next">
<release-core-list>
<release-improvement-list>
<release-item>
<p>Improve more.</p>
</release-item>
</release-improvement-list>
</release-core-list>
</release>
<release date="2026-11-01" version="2.60.1" title="Patch">
<release-core-list>
<release-bug-list>
<release-item>
<p>Fix a bug on a branch.</p>
<p>Say more.</p>
</release-item>
</release-bug-list>
<release-development-list>
<release-item>
<p>Fix the build on a branch.</p>
</release-item>
</release-development-list>
</release-core-list>
</release>
<release date="2026-10-01" version="2.60.0" title="Detail">
<release-core-list>
<release-improvement-list>
<release-item>
<p>Improve a thing.</p>
</release-item>
</release-improvement-list>
</release-core-list>
</release>
<release date="2025-01-01" version="1.00" title="Initial"/>
"""
PATCH_HISTORY = [
("n2", "v2.61.0: Next."),
("n1", "Improve more."),
("n0", "Begin v2.61.0 development."),
("m2", "v2.60.0: Detail."),
("m1", "Improve a thing."),
("m0", "v1.00: Initial."),
]
PATCH_HISTORY_TAG = {
"2.60.1": [
("t3", "v2.60.1: Patch."),
("t2", "Fix the build on a branch."),
("t1", "Fix a bug on a branch."),
("t0", "Begin v2.60.1 development."),
]
}
####################################################################################################################################
def test_release_render_patch():
"""A patch release that is not the most recent is checked against the history of its tag."""
root = _render(_doc(PATCH_RELEASE_LIST), dev=True, history=PATCH_HISTORY, history_tag=PATCH_HISTORY_TAG)
release = xml_node_child_list(xml_node_child_list(root, "section")[2], "section")[0]
assert_equal(xml_node_attribute(release, "id"), "2.60.1")
assert_equal(
_item_html(release),
[
"Fix a bug on a branch."
+ DETAIL_HTML
+ '\n<div class="list-detail-text">Say more.</div>'
+ '\n<div class="list-detail-ref"><span class="list-detail-ref-item">Commit '
+ '<a href="{[github-url-base]}/commit/t1"><span class="id">t1</span></a></span></div></details>',
"Fix the build on a branch."
+ DETAIL_HTML
+ '\n<div class="list-detail-ref"><span class="list-detail-ref-item">Commit '
+ '<a href="{[github-url-base]}/commit/t2"><span class="id">t2</span></a></span></div></details>',
],
)
# Every commit of the patch release is claimed by an item
with assert_raises(ToolError) as raised:
_render(
_doc(PATCH_RELEASE_LIST.replace("<p>Fix the build on a branch.</p>", "<p>Fix the build elsewhere.</p>")),
history=PATCH_HISTORY,
history_tag=PATCH_HISTORY_TAG,
)
assert_in("unable to find commit or no subject match for release 2.60.1 item 'Fix the build elsewhere.'", str(raised.exception))
with assert_raises(ToolError) as raised:
_render(
_doc(PATCH_RELEASE_LIST),
history=PATCH_HISTORY,
history_tag={"2.60.1": [("t4", "Do something unclaimed.")] + PATCH_HISTORY_TAG["2.60.1"]},
)
assert_in("release 2.60.1 has commits that no item claims:\n2026-07-30 t4: Do something unclaimed.", str(raised.exception))
# A patch release after another patch release ends at the commit that closed the one before it
release_before = """<release date="2026-10-15" version="2.60.1" title="Patch Before">
<release-core-list>
<release-bug-list>
<release-item>
<p>Fix an earlier bug.</p>
</release-item>
</release-bug-list>
</release-core-list>
</release>
"""
release_list = PATCH_RELEASE_LIST.replace('version="2.60.1" title="Patch"', 'version="2.60.2" title="Patch"').replace(
'<release date="2026-10-01" version="2.60.0"', release_before + '<release date="2026-10-01" version="2.60.0"'
)
history_tag = {
"2.60.2": [
("u3", "v2.60.2: Patch."),
("u2", "Fix the build on a branch."),
("u1", "Fix a bug on a branch."),
("u0", "Begin v2.60.2 development."),
("s2", "v2.60.1: Patch Before."),
("s1", "Fix an earlier bug."),
("s0", "Begin v2.60.1 development."),
],
"2.60.1": [("s2", "v2.60.1: Patch Before."), ("s1", "Fix an earlier bug."), ("s0", "Begin v2.60.1 development.")],
}
root = _render(_doc(release_list), history=PATCH_HISTORY, history_tag=history_tag)
supported = xml_node_child_list(root, "section")[2]
assert_equal(
[xml_node_attribute(release, "id") for release in xml_node_child_list(supported, "section")],
["2.60.2", "2.60.1", "2.60.0", "1.00"],
)
# A patch release with no history for its tag is not checked
_render(
_doc(PATCH_RELEASE_LIST.replace("<p>Fix the build on a branch.</p>", "<p>Fix the build elsewhere.</p>")),
history=PATCH_HISTORY,
)
####################################################################################################################################
def test_release_render_bug_fix():
"""A bug fix release x.y.z with z > 0 is skipped when it is not the most recent and a release x.y.0 is checked."""
# The commits of 2.60.0 end at the commit that closed 2.59.0
# The commits of 2.60.0 end at the commit that closed 2.10.0
with assert_raises(ToolError) as raised:
_render(_doc(DETAIL_RELEASE_LIST.replace("<p>Add a feature.</p>", "<p>Improve a thing.</p>")), history=DETAIL_HISTORY)
assert_in("unable to find commit or no subject match for release 2.60.0 item 'Improve a thing.'", str(raised.exception))
# 2.59.0 is checked
# Development on 2.60.0 may have been opened as 2.60
_render(
_doc(DETAIL_RELEASE_LIST),
history=[("d4", "Begin v2.60 development.") if commit == "d4" else (commit, subject) for commit, subject in DETAIL_HISTORY],
)
# Every commit of 2.60.0 is claimed by an item
with assert_raises(ToolError) as raised:
_render(_doc(DETAIL_RELEASE_LIST), history=[("d9", "Do something unclaimed.")] + DETAIL_HISTORY)
assert_in("release 2.60.0 has commits that no item claims:\n2026-07-30 d9: Do something unclaimed.", str(raised.exception))
# Commits that no item claims are allowed when claim is false
_render(_doc(DETAIL_RELEASE_LIST), history=[("d9", "Do something unclaimed.")] + DETAIL_HISTORY, claim=False)
# 2.10.0 is checked
with assert_raises(ToolError) as raised:
_render(_doc(DETAIL_RELEASE_LIST.replace("<p>Improve a thing.</p>", "<p>Improve two things.</p>")), history=DETAIL_HISTORY)
assert_in("unable to find commit or no subject match for release 2.59.0 item 'Improve two things.'", str(raised.exception))
assert_in("unable to find commit or no subject match for release 2.10.0 item 'Improve two things.'", str(raised.exception))
####################################################################################################################################
def test_release_history_update():
"""The history is written from git when HEAD is not the newest commit in it."""
"""The history is written from git when the newest commit in it or in the tag of a patch release has changed."""
with tempfile.TemporaryDirectory() as path:
path_doc = os.path.join(path, "doc")
@@ -669,25 +1200,34 @@ def test_release_history_update():
_commit(path, "Add a feature.", "What the feature does.")
_commit(path, "v2.01: First.", "The release notes.")
release_history_update(path, path_doc)
# With no integration branch the history ends at HEAD
assert_false(release_history_update(path, path_doc))
history = json.loads(file_read(path_history))
assert_equal(history[0]["commit"], exec_one("git -C %s rev-parse HEAD" % path).strip())
assert_equal(sorted(history[1]), ["body", "commit", "date", "subject"])
assert_equal(history["head"][0]["commit"], exec_one("git -C %s rev-parse HEAD" % path).strip())
assert_equal(sorted(history["head"][1]), ["body", "commit", "date", "subject"])
assert_equal(history["tag"], {})
# The body of a commit that closed a release is left out
assert_equal(
[(commit["subject"], commit.get("body")) for commit in history],
[(commit["subject"], commit.get("body")) for commit in history["head"]],
[("v2.01: First.", None), ("Add a feature.", "What the feature does.")],
)
# The history is not written while HEAD is the newest commit in it
file_write(path_history, json.dumps(history[:1]))
file_write(path_history, json.dumps({"head": history["head"][:1], "tag": {}}))
release_history_update(path, path_doc)
assert_equal(len(json.loads(file_read(path_history))), 1)
assert_equal(len(json.loads(file_read(path_history))["head"]), 1)
# A history written in the format before patch releases were read from their tags is written again
file_write(path_history, json.dumps(history["head"][:1]))
release_history_update(path, path_doc)
assert_equal(len(json.loads(file_read(path_history))["head"]), 2)
# A new commit is first in the history
_commit(path, "Fix a bug.")
@@ -695,5 +1235,54 @@ def test_release_history_update():
release_history_update(path, path_doc)
assert_equal(
[commit["subject"] for commit in json.loads(file_read(path_history))], ["Fix a bug.", "v2.01: First.", "Add a feature."]
[commit["subject"] for commit in json.loads(file_read(path_history))["head"]],
["Fix a bug.", "v2.01: First.", "Add a feature."],
)
# The history of a patch release with version >= _DETAIL_VERSION_MIN is the commits of its tag that are not in the history
# of HEAD. Other release tags are left out.
branch = exec_one("git -C %s branch --show-current" % path).strip()
exec_one("git -C %s tag release/2.60.0" % path)
exec_one("git -C %s tag release/2.10.1" % path)
exec_one("git -C %s checkout -q -b patch" % path)
_commit(path, "Fix a bug on a branch.")
exec_one("git -C %s tag release/2.60.1" % path)
exec_one("git -C %s checkout -q %s" % (path, branch))
release_history_update(path, path_doc)
history = json.loads(file_read(path_history))
assert_equal(list(history["tag"]), ["2.60.1"])
assert_equal([commit["subject"] for commit in history["tag"]["2.60.1"]], ["Fix a bug on a branch."])
# The history is written again when the tag of a patch release moves
exec_one("git -C %s checkout -q patch" % path)
_commit(path, "v2.60.1: Patch.")
exec_one("git -C %s tag -f release/2.60.1" % path)
exec_one("git -C %s checkout -q %s" % (path, branch))
release_history_update(path, path_doc)
assert_equal(
[commit["subject"] for commit in json.loads(file_read(path_history))["tag"]["2.60.1"]],
["v2.60.1: Patch.", "Fix a bug on a branch."],
)
# With an integration branch related to HEAD the history ends at the newest commit of HEAD that is also in integration
exec_one("git -C %s branch integration" % path)
_commit(path, "RELEASE: Add release notes.")
assert_true(release_history_update(path, path_doc))
assert_equal(json.loads(file_read(path_history))["head"][0]["subject"], "Fix a bug.")
# With an integration branch that is not related to HEAD the history ends at HEAD
tree = exec_one("git -C %s hash-object -t tree /dev/null" % path).strip()
commit = exec_one(
"git -C %s -c user.name=test -c user.email=test@pgbackrest.org commit-tree %s -m 'Unrelated.'" % (path, tree)
).strip()
exec_one("git -C %s update-ref refs/heads/integration %s" % (path, commit))
assert_false(release_history_update(path, path_doc))
assert_equal(json.loads(file_read(path_history))["head"][0]["subject"], "RELEASE: Add release notes.")