merge-ort: clean up after failed merge
PATCH 1/1 merge-ort: clean up after failed merge
From: Johannes Schindelin <[email protected]>
In 9fefce68dc8 (merge-ort: basic outline for merge_switch_to_result(), 2020-12-13), we added functionality to lay down the result of a merge on disk. But we forgot to release the data structures in case unpack_trees() failed to run properly.
This was pointed out by the linux-leaks job in our CI runs.
---
merge-ort: clean up after failed merge
I was investigating why seen's CI runs fail, and came up with this fix.
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1307%2Fdscho%2Fmerge-ort-impl-leakfix-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1307/dscho/merge-ort-impl-leakfix-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/1307
merge-ort.c | 2 ++ 1 file changed, 2 insertions(+)
merge-ort.c +2 -0
@@ -1002,6 +1002,7 @@ void merge_switch_to_result(struct merge_options *opt,if (checkout (opt, head, result->tree)) {/* failure to function */ result->clean =-1 ; +merge_finalize (opt, result);return ; }
@@ -1010,6 +1011,7 @@ void merge_switch_to_result(struct merge_options *opt, &opti->conflicted)) {/* failure to function */ result->clean =-1 ; +merge_finalize (opt, result);return ; } }
base-commit: 9fefce68dc85d96781090f86c067d83f7c50b617
Signature · 1 line
gitgitgadget
Quoted 44 lines · Johannes Schindelin via GitGitGadget
From: Johannes Schindelin <[email protected]>
In
9fefce68dc8(merge-ort: basic outline formerge_switch_to_result(), 2020-12-13), we added functionality to lay down the result of a merge on disk. But we forgot to release the data structures in caseunpack_trees()failed to run properly.This was pointed out by the
linux-leaksjob in our CI runs.Signed-off-by Johannes Schindelin <[email protected]>---
merge-ort: clean up after failed mergeI was investigating why seen's CI runs fail, and came up with this fix.
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1307%2Fdscho%2Fmerge-ort-impl-leakfix-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1307/dscho/merge-ort-impl-leakfix-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/1307merge-ort.c | 2 ++ 1 file changed, 2 insertions(+)merge-ort.c +2
-0@@ -1002,6 +1002,7 @@ void merge_switch_to_result(struct merge_options *opt,if (checkout (opt, head, result->tree)) {/* failure to function */ result->clean =-1 ; +merge_finalize (opt, result);return ; }@@ -1010,6 +1011,7 @@ void merge_switch_to_result(struct merge_options *opt, &opti->conflicted)) {/* failure to function */ result->clean =-1 ; +merge_finalize (opt, result);return ; } }
Quoted 3 lines
base-commit:
9fefce68dc85d96781090f86c067d83f7c50b617--
gitgitgadget
Good catch. Can you rebase on to a slightly newer commit? I think we also need a trace2_region_leave() call in each block as well, which is only clear if you look at newer versions.
v2 cover merge-ort: clean up after failed merge
In reply to Johannes Schindelin via GitGitGadgetI was investigating why seen's CI runs fail, and came up with this fix.
Changes since v1:
* Rebased onto en/merge-ort-perf.
* Now we're not only cleaning up the merge data structure, but also leaving the Trace2 region when returning early from merge_switch_to_result().
Johannes Schindelin (2):
merge-ort: clean up after failed merge
merge-ort: do leave Trace2 region even if checkout fails
merge-ort.c | 5 +++++ 1 file changed, 5 insertions(+)
base-commit: 557ac0350d9efa1f59c708779ca3fb3aee121131
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1307%2Fdscho%2Fmerge-ort-impl-leakfix-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1307/dscho/merge-ort-impl-leakfix-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/1307
Range-diff vs v1:
1: 128f77f7f34 ! 1: 082c7ffa41f merge-ort: clean up after failed merge
@@ merge-ort.c: void merge_switch_to_result(struct merge_options *opt,
+ merge_finalize(opt, result);
return;
}
-
+ trace2_region_leave("merge", "checkout", opt->repo);
@@ merge-ort.c: void merge_switch_to_result(struct merge_options *opt,
&opti->conflicted)) {
/* failure to function */
@@ merge-ort.c: void merge_switch_to_result(struct merge_options *opt,
+ merge_finalize(opt, result);
return;
}
- }
+ trace2_region_leave("merge", "record_conflicted", opt->repo); -: ----------- > 2: d2e1af0f922 merge-ort: do leave Trace2 region even if checkout fails
Signature · 1 line
gitgitgadget
PATCH v2 1/2 merge-ort: clean up after failed merge
From: Johannes Schindelin <[email protected]>
In 9fefce68dc8 (merge-ort: basic outline for merge_switch_to_result(), 2020-12-13), we added functionality to lay down the result of a merge on disk. But we forgot to release the data structures in case unpack_trees() failed to run properly.
This was pointed out by the linux-leaks job in our CI runs.
--- merge-ort.c | 2 ++ 1 file changed, 2 insertions(+)
merge-ort.c +2 -0
@@ -3157,6 +3157,7 @@ void merge_switch_to_result(struct merge_options *opt,if (checkout (opt, head, result->tree)) {/* failure to function */ result->clean =-1 ; +merge_finalize (opt, result);return ; }trace2_region_leave ("merge" ,"checkout" , opt->repo);
@@ -3167,6 +3168,7 @@ void merge_switch_to_result(struct merge_options *opt, &opti->conflicted)) {/* failure to function */ result->clean =-1 ; +merge_finalize (opt, result);return ; }trace2_region_leave ("merge" ,"record_conflicted" , opt->repo);
Signature · 1 line
gitgitgadget
PATCH v2 2/2 merge-ort: do leave Trace2 region even if checkout fails
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
In 557ac0350d9 (merge-ort: begin performance work; instrument with trace2_region_* calls, 2021-01-23), we added Trace2 instrumentation, but in the error path that returns early, we forgot to tell Trace2 that we're leaving the region. Let's fix that.
--- merge-ort.c | 3 +++ 1 file changed, 3 insertions(+)
merge-ort.c +3 -0
@@ -3158,6 +3158,7 @@ void merge_switch_to_result(struct merge_options *opt,/* failure to function */ result->clean =-1 ;merge_finalize (opt, result); +trace2_region_leave ("merge" ,"checkout" , opt->repo);return ; }trace2_region_leave ("merge" ,"checkout" , opt->repo);
@@ -3169,6 +3170,8 @@ void merge_switch_to_result(struct merge_options *opt,/* failure to function */ result->clean =-1 ;merge_finalize (opt, result); +trace2_region_leave ("merge" ,"record_conflicted" , + opt->repo);return ; }trace2_region_leave ("merge" ,"record_conflicted" , opt->repo);
Signature · 1 line
gitgitgadget
Quoted 9 lines · Johannes Schindelin via GitGitGadget
I was investigating why seen's CI runs fail, and came up with this fix.
Changes since v1:
* Rebased onto en/merge-ort-perf.
* Now we're not only cleaning up the merge data structure, but also leaving the Trace2 region when returning early frommerge_switch_to_result().
Quoted 6 lines
Johannes Schindelin (2):
merge-ort: clean up after failed merge
merge-ort: do leave Trace2 region even if checkout failsmerge-ort.c | 5 +++++ 1 file changed, 5 insertions(+)
Thanks, series looks good to me:
Quoted 15 lines · Elijah Newren
Quoted 13 lines · Johannes Schindelin via GitGitGadget
I was investigating why seen's CI runs fail, and came up with this fix.
Changes since v1:
* Rebased onto en/merge-ort-perf.
* Now we're not only cleaning up the merge data structure, but also leaving the Trace2 region when returning early frommerge_switch_to_result().Johannes Schindelin (2):
merge-ort: clean up after failed merge
merge-ort: do leave Trace2 region even if checkout fails
Quoted 6 lines
Quoted 2 lines
merge-ort.c | 5 +++++ 1 file changed, 5 insertions(+)Thanks, series looks good to me:
Reviewed-by Elijah Newren <[email protected]>
Thanks, both.
The new "leave" calls immediately next to the existing ones that look identical appear duplicated, but correcting the logic first in an obvious way like the posted patch, leaving any clean-up to later, is a prudent thing to do.
Queued.