Skip to content

Commit ae43065

Browse files
Update rollup process
Co-authored-by: Matthias Krüger <matthias.krueger@famsik.de> Co-authored-by: Jieyou Xu <jieyouxu@outlook.com>
1 parent 3986be0 commit ae43065

File tree

1 file changed

+110
-37
lines changed

1 file changed

+110
-37
lines changed

src/release/rollups.md

Lines changed: 110 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@
33
## Background
44

55
The Rust project has a policy that every pull request must be tested after merge
6-
before it can be pushed to master. As PR volume increases this can scale poorly,
6+
before it can be pushed to master. As PR volume increases, this can scale poorly,
77
especially given the long (~3.5hr) current CI duration for Rust.
88

99
Enter rollups! Changes that are small, not performance sensitive, or not platform
1010
dependent are marked with the `rollup` command to bors (`@bors r+ rollup` to
11-
approve a PR and mark as a rollup, `@bors rollup` to mark a previously approved
11+
approve a PR and mark it as a rollup, `@bors rollup` to mark a previously approved
1212
PR, `@bors rollup-` to un-mark as a rollup). 'Performing a Rollup' then means
1313
collecting these changes into one PR and merging them all at once. The rollup
14-
command accepts four values `always`, `maybe`, `iffy`, and `never`. See [the
14+
command accepts four values: `always`, `maybe`, `iffy`, and `never`. See [the
1515
Rollups section] of the review policies for guidance on what these different
1616
statuses mean.
1717

@@ -23,67 +23,140 @@ queue has been merged.
2323
## Making a Rollup
2424

2525
1. Using the interface on [Homu queue], select pull requests and then
26-
use "rollup" button to make a rollup pull request. (The text about
27-
fairness can be ignored.)
26+
use "rollup" button to make a rollup pull request.
27+
2828
**Important note**: consider for addition PRs marked as
2929
`rollup=always`, `rollup=maybe` and `rollup=iffy`, based on the
3030
review policies of [the Rollups section]. Be extra careful when
3131
deciding what to include, in particular on `rollup=maybe` and
3232
`rollup=iffy` PRs. We should try as much as possible to avoid risking
33-
and hit regressions (bugs or perf). Also consider that contributors
33+
to hit regressions (bugs or perf). Also consider that contributors
3434
often forget to tag things with rollup=never, when they should have
3535
done so, so when PRs are not explicitly tagged with rollup, be extra
36-
careful.
36+
careful. Also carefully consider the area of the compiler the PRs touch.
37+
Two diagnostic PRs may actually conflict with each other, as they both
38+
change compiler output, which causes failures in each other's tests,
39+
when both of them are merged together in a rollup without causing git merge-conflicts.
40+
In this case the older PR should be given the privilege to merge first
41+
and the newer PR should then be rebased as needed.
3742

3843
2. Run the following command in the pull request thread:
3944

40-
```
41-
@bors r+ rollup=never p=5
42-
````
45+
```
46+
@bors r+ rollup=never p=5
47+
````
48+
49+
Tools and subtree syncs should use `p=5`, like rollups, so they interleave between rollups, as
50+
tools and subtree syncs are typically more tricky to fix than rebasing PRs.
4351
4452
3. If the rollup fails, use the logs rust-log-analyzer
45-
provides to bisect the failure to a specific PR and do
46-
`@bors r-`. If the PR is running, you need to do `@bors r- retry`. Otherwise,
53+
provides to bisect the failure to a specific PR and
54+
`@bors r-` the PR. If the PR is running, you need to do `@bors r- retry`. Otherwise,
4755
your rollup succeeded. If it did, proceed to the next rollup (every now and
48-
then let `rollup=never` and toolstate PRs progress).
49-
4. Recreate the rollup without the offending PR starting again from **1.**. There's a link in the rollup PR's body to automatically prefill the rollup UI with the existing PRs (minus any PRs that have been `r-`d)
56+
then let `rollup=never/iffy` and toolstate PRs progress).
57+
4. Recreate the rollup without the offending PR starting again from **1.**.
58+
There's a link in the rollup PR's body to automatically prefill the rollup UI
59+
with the existing PRs (minus any PRs that have been `r-`d)
60+
Try avoiding adding any additional PR to the current "batch" as this
61+
unnecessarily increases the chance of test failures.
62+
Rollups should not overlap, if a PR is already contained in a rollup that is not closed,
63+
it should not be added to another different rollup at the same time.
64+
If a rollup fails and you are not sure which PR caused the problem,
65+
you may bisect the rollup and split it up into two rollups until the offending PR becomes clear.
5066
5167
## Selecting Pull Requests
5268
53-
The queue is sorted by rollup status. In general, a good rollup includes one or two `iffy` PRs (if available), a bunch of `maybe` (unmarked) PRs, and a large pile of `always` PRs. A rollup should never include `rollup=never` PRs.
69+
The queue is sorted by rollup status. In general:
70+
71+
- A good rollup contains a bunch of `maybe` (unmarked) PRs, and a large pile of `always` PRs. You
72+
can include one or two `iffy` PRs to amortize the cost of testing full CI.
73+
- If you have a lot of time, you can also make a rollup just from `iffy` PRs (if there are enough of
74+
them) and weed out the failures one by one.
75+
- A rollup must **never** include `rollup=never` PRs.
76+
77+
The actual absolute size of the rollup can depend based on experience and current length of the queue.
78+
People new to making rollups might start with including 1 `iffy`, 2 `maybe`s, and 4 `always`s. Usually 6-8 PRs per rollup is a good compromise.
79+
There is rarely a need to roll up more than 10 PRs at once (unless there are >30 PRs waiting the queue), keep in mind that we also try to minimize regressions per merge.
5480
55-
The actual absolute size of the rollup can depend based on experience, people new to making rollups might start with including 1 `iffy`, 4 `maybe`s, and 5 `always`s, but more experienced people might even make a rollup of 1-2 `iffy`s, 8 `maybe`s, and 10 `always`s! Massive rollups are rarely needed, but as your intuition grows you'll get better at judging risk when including PRs in a rollup.
81+
Limit the size of rollups, *even if* the queue is backed up. Large rollups run the risk of failing
82+
or merge conflicts, and smaller rollups keep potential regressions [bisectable]. On average, rollups
83+
are 7 PRs large, often varying from 5 to 10 depending on the number of `rollup=always` PRs that can
84+
be included.
5685
57-
Don't hesitate to downgrade the rollup status of a PR! If your intuition tells you that a `rollup=always` PR has some chances for failures, mark it `rollup=maybe` or `rollup=iffy`. A lot of the unmarked `maybe` PRs are categorized as such because the reviewer may not have considered rollupability, so it's always worth picking them with a critical eye. Similarly, if a PR causes your rollup to fail, it's worth considering changing its rollup status
86+
Don't hesitate to downgrade the rollup status of a PR! If your intuition tells you that a `rollup=always` PR has some chances for failures, mark it `rollup=maybe` or better `rollup=iffy`. A lot of the unmarked `maybe` PRs are categorized as such because the reviewer may not have considered rollupability, so it's always worth picking them with a critical eye. Similarly, if a PR causes your rollup to fail, it's worth considering changing its rollup status.
5887
59-
Generally, PRs, that touch CI configuration or the bootstrapping process are probably `iffy` and should be handled with care. On the other hand, PRs that just edit docs are usually `rollup=always`.
88+
Generally, PRs that touch CI configuration or the bootstrapping process are probably `iffy` or `never` and should be handled with care. On the other hand, PRs that just edit docs are usually `rollup=always`.
6089
61-
Avoid having too many PRs with large diffs or submodule changes in the same rollup. Also avoid having PRs you suspect will have large perf impacts, and mark them as `rollup=never`.
90+
Avoid having too many PRs with large diffs or subtree changes in the same rollup. Self-contained submodule changes (such as `miri` updates) on the other hand may be fine to be rolled up with other unrelated PRs.
91+
Also avoid having PRs you suspect will have large perf impacts and mark them as `rollup=never`.
6292
63-
It's tempting to avoid including `iffy` PRs at all since ideally you want your rollup to succeed. However, it's worth remembering that the job of the PR queue is to _test_ PRs, not to land them. As such, a rollup that fails because of an `iffy` PR is a good thing, since that PR would have to be tested at _some point_ anyway and it would have taken up the same amount of time to test if it never got included in a rollup. One way to look at rollups when it comes to `iffy` PRs is that a rollup is a way for a bunch of other PRs to piggyback on the CI cycle that the `iffy` PR needs anyway. If rollups avoid `iffy` PRs entirely what ends up happening is that these PRs tend to languish in the queue for a long time, which isn't good.
93+
If an `iffy` PR keeps failing in a rollups, it should be marked `never` to prevent it from causing further problems inside unrelated rollups. This will also cause it to bump up in front of all `maybe`s in the queue and the author will get feedback quicker in case of subsequent failures.
94+
It should be noted which runner the PR failed on, to run this runner as a `try-job` job and make sure it succeeds there before another merge is attempted (example on syntax [here]).
95+
In general, if possible, try to test a failed PR via a handful of carefully selected try-jobs instead of having to run the full battery of all 60 runners on if it's likely a PR may fail again.
6496
65-
Similarly, make sure to leave some spare CI cycles so that `never` PRs also get a chance! If you're the only person making rollups it's worth letting them run during times you're not paying attention to the queue, but these days there are rollup authors in multiple time zones, so it's often best to just keep an eye on the relative size of the queue and put aside a couple CI cycles for `never` PRs, especially if they pile up.
97+
To not have `never` or `iffy` PRs stuck in the queue indefinitely, it is recommended to alternate
98+
between rollup and non-rollup prs, so one `never`, one rollup, one `iffy`, one `rollup`, one `never`
99+
etc, until most of the `never`s are merged. You can selectively bump the priority on certain
100+
`iffy`/`never` PRs to `p=1` (or even `p=5`) if you want to interleave them between rollups.
66101
67-
Try to be fair with rollups: Rollups are a way for things to jump the queue. For `rollup=maybe` PRs, try to include the oldest one (at the top of the section) so that newer PRs aren't jumping the queue over older PRs entirely. You don't have to include every PR older than PRs included in your rollup, but try to include the oldest. Similar to the perspective around `iffy`, it's useful to look at a rollup as a way for other PRs to piggyback on the CI cycle of the oldest PR in queue.
102+
If you are the only person making rollups, you can also leave a couple of `never`/`iffy`s for a time
103+
where you know nobody will be doing rollups actively, or for weekends which generally see a lower
104+
number of PR approvals.
68105
106+
Try to be fair with rollups: Rollups are a way for things to jump the queue. For `rollup=maybe` PRs,
107+
try to include the oldest one (at the top of the section) so that newer PRs aren't jumping the queue
108+
over older PRs perpetually. You don't have to include every PR older than PRs included in your
109+
rollup, but try to include the oldest. Similar to the perspective around `iffy`, it's useful to look
110+
at a rollup as a way for other PRs to piggyback on the CI cycle of the oldest PR in queue.
111+
112+
Very old (several months) or very large PRs that are extremely prone to merge conflicts may also be
113+
given a priority bump (`p=5`) to finally get them out of the queue without having to rebase them
114+
repeatedly, to have the same priority as rollups or sandwich between rollups.
115+
116+
Ultimately, we want to keep the number of regressions per merge at a minimum while also minimizing
117+
the amount of time between approval and the final merge of a PR, to avoid unnecessary merge
118+
conflicts and rebases.
69119
70120
## Failed rollups
121+
71122
If the rollup has failed, run the `@bors retry` command if the
72-
failure was spurious (e.g. due to a network problem or a timeout). If it wasn't spurious,
73-
find the offending PR and throw it out by copying a link to the rust-logs-analyzer comment,
74-
and writing `Failed in <link_to_comment>, @bors r-`. Hopefully,
75-
the author or reviewer will give feedback to get the PR fixed or confirm that it's not
76-
at fault. The failed rollup PR can be closed.
77-
78-
Once you've removed the offending PR, re-create your rollup without it (see 1.).
79-
Sometimes however, it is hard to find the offending PR. If so, use your intuition
80-
to avoid the PRs that you suspect are the problem and recreate the rollup.
81-
Another strategy is to raise the priority of the PRs you suspect,
82-
mark them as `rollup=never` (or `iffy`) and let bors test them standalone to dismiss
83-
or confirm your hypothesis.
84-
85-
If a rollup continues to fail you can run the `@bors rollup=never` command to
86-
never rollup the PR in question.
123+
failure was spurious (e.g. due to a network problem or a timeout).
124+
There may be a matching `CI-spurious-fail-.*` label that you can use to tag the PR as such, to help
125+
discover common fail patterns.
126+
127+
If it wasn't spurious, find the offending PR and return it to the author to be fixed by copying a
128+
link to the `rust-log-analyzer` comment, and leaving a comment like
129+
130+
```text
131+
Failed in <link_to_comment>.
132+
@bors r-`.
133+
```
134+
135+
In case `rust-log-analyzer` does not give any meaningful output, you can directly open the ci-logs
136+
(the `(web)` link), find the point where the error was thrown and directly copy the URL to the
137+
respective line in the log output. Hopefully, the author or reviewer will give feedback to get the
138+
PR fixed or confirm that it's not at fault. The failed rollup PR should then be closed.
139+
140+
Once you've removed the offending PR, recreate your rollup without it (see 1.).
141+
Merge one batch of PRs by throwing out the failures one by one instead of adding new PRs to it, as this may introduce additional points of failure.
142+
143+
Sometimes it is hard to find the offending PR. There are usually three strategies to figure out the
144+
offending PR:
145+
146+
1. **Avoid the problem**: Use your intuition to avoid the PRs that you suspect are the problem and
147+
recreate the rollup.
148+
2. **Test suspected PRs alone**: Raise the priority of the PRs you suspect, mark them as
149+
`rollup=never` (or `iffy`) and let bors test them standalone to dismiss or confirm your
150+
hypothesis.
151+
3. **Divide and conquer**: Split rollup into 2 smaller ones until you are certain of the failure
152+
cause. If a PR was found to be the cause and other PRs were "wrongfully" marked `iffy`, they can
153+
of course be marked as `maybe` again with `@bors rollup=maybe` or `@bors rollup-`.
154+
155+
If a PR in a rollup continues to fail you can run the `@bors rollup=never` command to ensure the PR
156+
gets tested independently, since it's likely it will fail again in the future.
157+
87158

88159
[Homu queue]: https://bors.rust-lang.org/queue/rust
89160
[the Rollups section]: ../compiler/reviews.md#rollups
161+
[here]: https://github.com/rust-lang/rust/pull/132434#issue-2628063878
162+
[bisectable]: https://rust-lang.github.io/cargo-bisect-rustc/

0 commit comments

Comments
 (0)