This is an automated email from the ASF dual-hosted git repository.
lhotari pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pulsar-site.git
The following commit(s) were added to refs/heads/main by this push:
new 21209b0d1369 Add "maintenance tasks & cherry-picking" guide
21209b0d1369 is described below
commit 21209b0d1369206170137ab5a33c16047a14c5c5
Author: Lari Hotari <[email protected]>
AuthorDate: Tue Oct 8 13:20:14 2024 +0300
Add "maintenance tasks & cherry-picking" guide
---
contribute/maintenance-process.md | 83 +++++++++++++++++++++++++++++++++++++++
contribute/release-process.md | 52 +-----------------------
sidebarsDevelopment.js | 1 +
3 files changed, 85 insertions(+), 51 deletions(-)
diff --git a/contribute/maintenance-process.md
b/contribute/maintenance-process.md
new file mode 100644
index 000000000000..b1c33fe6b2f2
--- /dev/null
+++ b/contribute/maintenance-process.md
@@ -0,0 +1,83 @@
+---
+id: maintenance-process
+title: Cherry-picking
+---
+
+The following maintenance tasks are performed by Apache Pulsar committers
since they have access to these tasks.
+
+## Labeling PRs for Release Branches
+
+Before merging a PR, please ensure you label the releases where the PR should
also be applied. Our current process involves adding release labels for the
next pending releases so that we also cherry-pick fixes to maintenance branches.
+
+Always label non-breaking fixes to the supported maintenance version branches.
Check the supported versions to find out the currently supported branches and
current versions. Pick the label for the next release. If the label is missing
in GitHub, you should first add it.
+
+For example, when the last release is `3.0.7` for `branch-3.0`, the respective
PR label for the next release is `release/3.0.8`.
+
+These labels are crucial for searching PRs that need to be cherry-picked
during the release process. Picking an outdated release label could cause the
PR to be missed.
+
+## Cherry-picking Process
+
+### Current Process and Responsibilities
+
+It's sufficient to add the labels while merging PRs. This is the expectation
for the Apache Pulsar committer who merges a PR. A PR shouldn't be merged
without checking that it contains the necessary labels.
+
+Committers actively working as release managers will handle cherry-picking and
backporting.
+Release managers will request specific backports when a PR cannot be easily
backported due to merge conflicts.
+
+### Cherry-picking
+
+Cherry-picks should be performed in the same order as the PRs were merged into
the master branch.
+This is necessary to reduce unnecessary merge conflicts in maintenance
branches.
+Cherry-picking should retain a reference to the original commit. This can be
achieved by passing the `-x` argument so that cherry-picks are performed with
the `git cherry-pick -x <commit hash>` command.
+
+#### Handling Merge Conflicts
+
+Merge conflicts are common, and it's necessary to understand the tooling and
process to handle conflict resolution. Please refer to suggestions in [setting
up git with proper merge & diff tools for maintaining Pulsar](setup-git.md).
+
+In cases where a PR cannot be applied without substantial backporting effort
or risk of breaking changes, a separate PR to the maintenance branch is
requested from the original PR author. If the author is not willing to do this
work, the release manager attempts to find a volunteer to handle this.
+
+In some cases, a large number of merge conflicts signal that there's a
dependent PR that is also needed in the maintenance branch which hasn't been
cherry-picked. It is useful to review the dependency and consider
cherry-picking it. Only non-breaking bug fixes or minor improvements (excluding
PIP-related changes) can be cherry-picked without discussion on the dev mailing
list. Backporting is necessary when a fix depends on newer PIP-related changes.
+
+#### Cherry-picking Changes Scheduled for the Release
+
+Before proceeding, ensure that you have [set up a Git
mergetool](setup-git.md#mergetool). This tool is essential for resolving merge
conflicts that may arise during the cherry-picking process.
+
+Use a search such as `is:merged is:pr label:release/3.0.8
-label:cherry-picked/branch-3.0` to search for merged PRs that are scheduled
for the release but haven't yet been cherry-picked.
+It is necessary to handle cherry-picks in the same order as they have been
merged into the master branch. Otherwise, there will be unnecessary merge
conflicts to resolve.
+
+#### Cherry-picking CLI tooling
+
+Here's a shell script where the output that will ease cherry-picking from
master branch:
+assumes `gawk` is gnu awk. install `brew install gawk` or `alias gawk=awk` on
Linux.
+
+```shell
+UPSTREAM=origin
+git fetch $UPSTREAM
+RELEASE_NUMBER=3.0.8
+RELEASE_BRANCH=branch-3.0
+PR_QUERY="is:merged label:release/$RELEASE_NUMBER
-label:cherry-picked/$RELEASE_BRANCH"
+PR_NUMBERS=$(gh pr list -L 100 --search "$PR_QUERY" --json number --jq
'["#"+(.[].number|tostring)] | join("|")')
+ALREADY_PICKED=$(git log --oneline -P --grep="$PR_NUMBERS" --reverse
$RELEASE_BRANCH | gawk 'match($0, /\(#([0-9]+)\)/, a) {print substr(a[0], 2,
length(a[0])-2)}' | tr '\n' '|' | sed 's/|$//')
+if [[ -n "$ALREADY_PICKED" ]]; then
+ echo "** Already picked but not tagged as cherry-picked **"
+ git log --color --oneline -P --grep="$PR_NUMBERS" --reverse $RELEASE_BRANCH
| gawk 'match($0, /\(#([0-9]+)\)/, a) {print $0 "
https://github.com/apache/pulsar/pull/" substr(a[0], 3, length(a[0])-3)}'
+fi
+echo "** Not cherry-picked from $UPSTREAM/master **"
+git log --color --oneline -P --grep="$PR_NUMBERS" --reverse $UPSTREAM/master |
{ [ -n "$ALREADY_PICKED" ] && grep --color -v -E "$ALREADY_PICKED" || cat; } |
gawk 'match($0, /\(#([0-9]+)\)/, a) {print $0 "
https://github.com/apache/pulsar/pull/" substr(a[0], 3, length(a[0])-3)}'
+echo "Check https://github.com/apache/pulsar/pulls?q=is:pr+$(echo "$PR_QUERY"
| tr ' ' '+')"
+```
+
+this produces an output such as:
+
+```shell
+0fa9572f8af [fix][broker] Fix AvgShedder strategy check (#23156)
https://github.com/apache/pulsar/pull/23156
+** Not cherry-picked from origin/master **
+806fdf86866 [improve][misc] Upgrade Jetty to 9.4.56.v20240826 (#23405)
https://github.com/apache/pulsar/pull/23405
+Check
https://github.com/apache/pulsar/pulls?q=is:pr+is:merged+label:release/3.0.8+-label:cherry-picked/branch-3.0
+```
+
+It will speed up cherry-picking since you commit ids are there and there's
also links to the PRs.
+A cherry-pick should be done in this order with `git cherry-pick -x COMMIT_ID`.
+It's possible that some dependent commits are necessary to be cherry-picked
when you encounter a lot of merge conflicts in a case where they aren't
expected.
+
+There are more advanced versions of the cherry-picking CLI tooling in
[lhotari's `pulsar-contributor-toolbox-functions.sh` shell script function
library](https://github.com/lhotari/pulsar-contributor-toolbox/blob/0272419e70a9fc5f14945717bac964bda355520b/functions/pulsar-contributor-toolbox-functions.sh#L1393-L1455).
\ No newline at end of file
diff --git a/contribute/release-process.md b/contribute/release-process.md
index 061f0991f922..2103f7e6d892 100644
--- a/contribute/release-process.md
+++ b/contribute/release-process.md
@@ -160,57 +160,7 @@ If you created a new branch, update the [CI - OWASP
Dependency Check](https://gi
### Cherry-picking changes scheduled for the release
-Before proceeding, ensure that you have [set up a Git
mergetool](setup-git.md#mergetool). This tool is essential for resolving merge
conflicts that may arise during the cherry-picking process.
-
-Use a search such as `is:merged is:pr label:release/3.0.3
-label:cherry-picked/branch-3.0` to search for merged PRs that are scheduled
for the release, but haven't yet been cherry-picked.
-It is necessary to handle cherry-picks in the same order as they have been
merged in the master branch. Otherwise there will be unnecessary merge
conflicts to resolve.
-
-Here's a shell script where the output that will ease cherry-picking from
master branch:
-assumes `gawk` is gnu awk. install `brew install gawk` or `alias gawk=awk` on
Linux.
-```
-UPSTREAM=origin
-git fetch $UPSTREAM
-RELEASE_NUMBER=3.0.3
-RELEASE_BRANCH=branch-3.0
-PR_QUERY="is:merged label:release/$RELEASE_NUMBER
-label:cherry-picked/$RELEASE_BRANCH"
-PR_NUMBERS=$(gh pr list -L 100 --search "$PR_QUERY" --json number --jq
'["#"+(.[].number|tostring)] | join("|")')
-ALREADY_PICKED=$(git log --oneline -P --grep="$PR_NUMBERS" --reverse
$RELEASE_BRANCH | gawk 'match($0, /\(#([0-9]+)\)/, a) {print substr(a[0], 2,
length(a[0])-2)}' | tr '\n' '|' | sed 's/|$//')
-if [[ -n "$ALREADY_PICKED" ]]; then
- echo "** Already picked but not tagged as cherry-picked **"
- git log --color --oneline -P --grep="$PR_NUMBERS" --reverse $RELEASE_BRANCH
| gawk 'match($0, /\(#([0-9]+)\)/, a) {print $0 "
https://github.com/apache/pulsar/pull/" substr(a[0], 3, length(a[0])-3)}'
-fi
-echo "** Not cherry-picked from $UPSTREAM/master **"
-git log --color --oneline -P --grep="$PR_NUMBERS" --reverse $UPSTREAM/master |
{ [ -n "$ALREADY_PICKED" ] && grep --color -v -E "$ALREADY_PICKED" || cat; } |
gawk 'match($0, /\(#([0-9]+)\)/, a) {print $0 "
https://github.com/apache/pulsar/pull/" substr(a[0], 3, length(a[0])-3)}'
-echo "Check https://github.com/apache/pulsar/pulls?q=is:pr+$(echo "$PR_QUERY"
| tr ' ' '+')"
-```
-
-this produces an output such as:
-```
-** Already picked but not tagged as cherry-picked **
-744b7af5fc4 [improve][broker] Support not retaining null-key message during
topic compaction (#21578) (#21662) https://github.com/apache/pulsar/pull/21578
-b41013ba45c [improve][broker] defer the ownership checks if the owner is
inactive (ExtensibleLoadManager) (#21857)
https://github.com/apache/pulsar/pull/21857
-a6fd517ee39 [improve][build] Add a default username in the image (#21695)
https://github.com/apache/pulsar/pull/21695
-bbf6ddf9244 [fix] [client] Do no retrying for error subscription not found
when disabled allowAutoSubscriptionCreation (#22078)
https://github.com/apache/pulsar/pull/22078
-** Not cherry-picked from origin/master **
-ecd16d68e29 [fix][client] fix negative message re-delivery twice issue
(#20750) https://github.com/apache/pulsar/pull/20750
-50007c343ad [fix][txn] Fix getting last message ID when there are ongoing
transactions (#21466) https://github.com/apache/pulsar/pull/21466
-e81a20d667a [fix][broker] Avoid consumers receiving acknowledged messages from
compacted topic after reconnection (#21187)
https://github.com/apache/pulsar/pull/21187
-09559c5e661 [fix] [broker] Fix reader stuck when read from compacted topic
with read compact mode disable (#21969)
https://github.com/apache/pulsar/pull/21969
-48b4481969c [improve] [broker] Do not print an Error log when responding to
`HTTP-404` when calling `Admin API` and the topic does not exist. (#21995)
https://github.com/apache/pulsar/pull/21995
-861618a8120 [fix] [broker] Expire messages according to ledger close time to
avoid client clock skew (#21940) https://github.com/apache/pulsar/pull/21940
-48c7e322fec [improve][admin] Expose the offload threshold in seconds to the
amdin (#22101) https://github.com/apache/pulsar/pull/22101
-1c652f5519e [improve] [broker] Do not try to open ML when the topic meta does
not exist and do not expect to create a new one. #21995 (#22004)
https://github.com/apache/pulsar/pull/22004
-86079059890 [improve][broker] Cache the internal writer when sent to system
topic. (#22099) https://github.com/apache/pulsar/pull/22099
-1b1cfb58f4e [fix] [broker] Enabling batch causes negative unackedMessages due
to ack and delivery concurrency (#22090)
https://github.com/apache/pulsar/pull/22090
-0c49cac105e [fix] [client] fix huge permits if acked a half batched message
(#22091) https://github.com/apache/pulsar/pull/22091
-31ed115d0b5 [fix][sec] Add a check for the input time value (#22023)
https://github.com/apache/pulsar/pull/22023
-30134966a18 [fix][test] fix test testSyncNormalPositionWhenTBRecover (#22120)
https://github.com/apache/pulsar/pull/22120
-91de98ad456 [fix][test] Fix test testAsyncFunctionMaxPending (#22121)
https://github.com/apache/pulsar/pull/22121
-```
-
-It will speed up cherry-picking since you commit ids are there and there's
also links to the PRs.
-A cherry-pick should be done in this order with `git cherry-pick -x COMMIT_ID`.
-It's possible that some dependent commits are necessary to be cherry-picked
when you encounter a lot of merge conflicts in a case where they aren't
expected.
+Please read the [separate guide about maintenance tasks and
cherry-picking](maintenance-process.md).
### Update project version and tag
diff --git a/sidebarsDevelopment.js b/sidebarsDevelopment.js
index 2e7567ddb8ef..7f03176154e8 100644
--- a/sidebarsDevelopment.js
+++ b/sidebarsDevelopment.js
@@ -61,6 +61,7 @@ const sidebars = {
'release-note-guide',
]
},
+ 'maintenance-process',
'validate-release-candidate',
]
},