From: Junio C Hamano <gitster@pobox.com>
To: Abhijeet Sonar <abhijeet.nkt@gmail.com>
Cc: Karthik Nayak <karthik.188@gmail.com>,
git@vger.kernel.org, Paul Millar <paul.millar@desy.de>,
Phillip Wood <phillip.wood123@gmail.com>,
Elijah Newren <newren@gmail.com>, Jeff King <peff@peff.net>
Subject: Re* [PATCH v5] describe: refresh the index when 'broken' flag is used
Date: Wed, 26 Jun 2024 08:34:04 -0700 [thread overview]
Message-ID: <xmqqikxv4t1v.fsf_-_@gitster.g> (raw)
In-Reply-To: <2e80306e-2474-4254-95eb-c2902a56ffdd@gmail.com> (Abhijeet Sonar's message of "Wed, 26 Jun 2024 17:36:25 +0530")
Abhijeet Sonar <abhijeet.nkt@gmail.com> writes:
> On 26/06/24 17:00, Karthik Nayak wrote:
>> Not worth a reroll, but you don't have to create file.new twice.
>
> Actually, now that I think of it, those two were better off being
> separate tests. It might so happen the first call to describe
> refreshes the index, due to which the second call with the --broken
> option does not bug-out in the way it would if the command was run by
> itself. Having them separate would give them enough isolation so that
> previous command does not interfere with the later.
Good thinking. Yes, we may end up having a few commands that are
duplicated in these two tests (for setting the stage up, for
example), but it would be better to test these two separately.
>>> Range-diff against v4:
>>> 1: 1da5fa48d9 ! 1: 52f590b70f describe: refresh the index when 'broken' flag is used
>>> @@ builtin/describe.c: int cmd_describe(int argc, const char **argv, const char *pr
>>> + cp.git_cmd = 1;
>>> + cp.no_stdin = 1;
>>> + cp.no_stdout = 1;
>>> -+ run_command(&cp);
>>> -+ strvec_clear(&cp.args);
>>> ++ if (run_command(&cp))
>>> ++ child_process_clear(&cp);
>>> +
>>> strvec_pushv(&cp.args, diff_index_args);
>>> cp.git_cmd = 1;
>>> --
>>> 2.45.2.606.g9005149a4a.dirty
>> Other than this, this looks good to me.
> I am not sure if I follow this one. Am I expected to not share the
> struct child_process between the two sub-process calls?
Without reusing and instead of using two, we do not have to worry
about the reusablility of the child_process structure in the first
place, which is a huge plus, but in the longer run we should make
sure it is safe to reuse child_process and document the safe way to
reuse it (run-command.h does document a way to use it once and then
clean it up, but the "clean-up" extends only to not leaking
resources after we are done---it does not guarantee that it is OK to
reuse it).
I think with the updated "we clear cp ourselves if run_command() fails",
it should be safe to reuse, but it probably is even safer to do
something like this:
... the first run ...
if (run_command(&cp))
child_process_clear(&cp);
child_process_init(&cp);
... setup for the second run ...
strvec_pushv(&cp.args, diff_index_args);
cp.git_cmd = 1;
... full set-up without relying on anything done earlier ...
The extra child_process_init() call may serve as an extra
documentation that we are reusing the same struct here (we often do
"git grep" for use of a specific API function before tree wide code
clean-up, and child_process_init() would be a good key to look for).
... goes and looks ...
Oh, I found an interesting one. builtin/fsck.c:cmd_fsck() does this
in a loop:
struct child_process verify = CHILD_PROCESS_INIT;
... setup ...
for (... loop ...) {
child_process_init(&verify);
... set up various .members of verify struct ...
strvec_pushl(&verify.args, ... command line ...);
if (run_command(&verify))
errors_found |= ...;
}
This code clearly assumes that it is safe to reuse the child_process
structure after you run_command() and let it clean-up if you do
another child_process_init(). And I think that is a sensible
assumption.
The code in builtin/fsck.c:cmd_fsck() is buggy when run_command()
fails, I think. Without doing child_process_clear() there, doesn't
it leak the strvec?
------- >8 ------------- >8 ------------- >8 -------
Subject: [PATCH] fsck: clear child_process after failed run_command()
There are two loops that calls run_command() using the same
child_process struct near the end of cmd_fsck(). 4d0984be (fsck: do
not reuse child_process structs, 2018-11-12) tightened these code
paths to reinitialize the structure in order to safely reuse it.
The run-command API makes no promises about what is left in a struct
child_process after a command finishes, and it's not safe to simply
reuse it again for a similar command.
Upon failure, run_command() can return without releasing the
resource held by the child_process structure, which is done by
calling finish_command() which in turn calls child_process_clear().
Reinitializing the structure without calling child_process_clear()
for the next round would leak the .args and .env strvecs.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
builtin/fsck.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git c/builtin/fsck.c w/builtin/fsck.c
index d13a226c2e..398b492184 100644
--- c/builtin/fsck.c
+++ w/builtin/fsck.c
@@ -1078,8 +1078,10 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
strvec_push(&commit_graph_verify.args, "--progress");
else
strvec_push(&commit_graph_verify.args, "--no-progress");
- if (run_command(&commit_graph_verify))
+ if (run_command(&commit_graph_verify)) {
+ child_process_clear(&commit_graph_verify);
errors_found |= ERROR_COMMIT_GRAPH;
+ }
}
}
@@ -1096,8 +1098,10 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
strvec_push(&midx_verify.args, "--progress");
else
strvec_push(&midx_verify.args, "--no-progress");
- if (run_command(&midx_verify))
+ if (run_command(&midx_verify)) {
+ child_process_clear(&midx_verify);
errors_found |= ERROR_MULTI_PACK_INDEX;
+ }
}
}
next prev parent reply other threads:[~2024-06-26 15:34 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-25 13:35 [PATCH v3] describe: refresh the index when 'broken' flag is used Abhijeet Sonar
2024-06-25 15:59 ` Junio C Hamano
2024-06-25 16:05 ` Junio C Hamano
2024-06-26 11:16 ` Karthik Nayak
2024-06-26 6:11 ` Abhijeet Sonar
2024-06-26 6:37 ` [PATCH v4] " Abhijeet Sonar
2024-06-26 6:50 ` Abhijeet Sonar
2024-06-26 6:52 ` [PATCH v5] " Abhijeet Sonar
2024-06-26 11:30 ` Karthik Nayak
2024-06-26 12:06 ` Abhijeet Sonar
2024-06-26 15:34 ` Junio C Hamano [this message]
2024-06-26 16:17 ` Re* " Junio C Hamano
2024-06-26 17:29 ` Abhijeet Sonar
2024-06-26 17:35 ` Junio C Hamano
2024-06-26 17:45 ` Junio C Hamano
2024-06-26 18:07 ` Abhijeet Sonar
2024-06-26 18:49 ` Junio C Hamano
2024-06-26 20:34 ` Jeff King
2024-06-27 0:33 ` Jeff King
2024-06-26 21:23 ` Karthik Nayak
2024-06-26 14:59 ` Junio C Hamano
2024-06-26 18:31 ` Junio C Hamano
2024-06-26 19:08 ` [PATCH v7] " Abhijeet Sonar
2024-06-26 19:25 ` Abhijeet Sonar
2024-06-27 6:01 ` Abhijeet Sonar
2024-06-27 15:47 ` Junio C Hamano
2024-06-27 17:33 ` Abhijeet Sonar
2024-06-30 16:12 ` Karthik Nayak
2024-07-01 19:06 ` Junio C Hamano
2024-07-02 10:13 ` Karthik Nayak
2024-07-03 18:17 ` Junio C Hamano
2024-07-03 20:41 ` Karthik Nayak
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqqikxv4t1v.fsf_-_@gitster.g \
--to=gitster@pobox.com \
--cc=abhijeet.nkt@gmail.com \
--cc=git@vger.kernel.org \
--cc=karthik.188@gmail.com \
--cc=newren@gmail.com \
--cc=paul.millar@desy.de \
--cc=peff@peff.net \
--cc=phillip.wood123@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.