Git development
 help / color / mirror / Atom feed
* [PATCH 0/2] object-file: small error handling follow-ups
@ 2026-11-03 21:24 Justin Tobler
  2026-11-03 21:24 ` [PATCH 1/2] object-file: warn on failed unlink Justin Tobler
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Justin Tobler @ 2026-11-03 21:24 UTC (permalink / raw)
  To: git; +Cc: Justin Tobler

Greetings,

This small series is a follow-up to jt/odb-keep-lockfile-fix to address
some feedback that was submitted after the series was merged to next.
Both patches here make some small improvements to some error handling code.

Thanks,
-Justin

Justin Tobler (2):
  object-file: warn on failed unlink
  object-file: return error on index-pack abnormal exit

 object-file.c | 26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)


base-commit: 750f5de7dfe9a4062f95088212b063f189d50e91
-- 
2.56.0.173.gf57c9a7388


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/2] object-file: warn on failed unlink
  2026-11-03 21:24 [PATCH 0/2] object-file: small error handling follow-ups Justin Tobler
@ 2026-11-03 21:24 ` Justin Tobler
  2026-11-04 23:00   ` Junio C Hamano
  2026-11-03 21:24 ` [PATCH 2/2] object-file: return error on index-pack abnormal exit Justin Tobler
  2026-11-04 13:37 ` [PATCH 0/2] object-file: small error handling follow-ups Karthik Nayak
  2 siblings, 1 reply; 9+ messages in thread
From: Justin Tobler @ 2026-11-03 21:24 UTC (permalink / raw)
  To: git; +Cc: Justin Tobler

When the "files" ODB transaction cleans up a temporary packfile or
".keep" lockfile on an error path, any failure to unlink the file is
silently ignored. A ".keep" file left behind this way prevents its
packfile from ever being removed by housekeeping.

Use `unlink_or_warn()` instead so that such failures are reported.

Signed-off-by: Justin Tobler <jltobler@gmail.com>
---
 object-file.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/object-file.c b/object-file.c
index 132aaab6f8..a9800143bd 100644
--- a/object-file.c
+++ b/object-file.c
@@ -823,7 +823,7 @@ static void flush_packfile_transaction(struct odb_transaction_files *transaction
 	if (state->nr_written == 0) {
 		close(state->f->fd);
 		free_hashfile(state->f);
-		unlink(state->pack_tmp_name);
+		unlink_or_warn(state->pack_tmp_name);
 		goto clear_exit;
 	} else if (state->nr_written == 1) {
 		finalize_hashfile(state->f, hash, FSYNC_COMPONENT_PACK,
@@ -1276,13 +1276,13 @@ static int write_pack_lockfile(struct odb_source *source, const char *pack_name,
 	if (write_in_full(fd, contents.buf, contents.len) < 0) {
 		ret = error_errno(_("unable to write '%s'"), lock_path.buf);
 		close(fd);
-		unlink(lock_path.buf);
+		unlink_or_warn(lock_path.buf);
 		goto out;
 	}
 
 	if (close(fd) < 0) {
 		ret = error_errno(_("unable to close '%s'"), lock_path.buf);
-		unlink(lock_path.buf);
+		unlink_or_warn(lock_path.buf);
 		goto out;
 	}
 
-- 
2.56.0.173.gf57c9a7388


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 2/2] object-file: return error on index-pack abnormal exit
  2026-11-03 21:24 [PATCH 0/2] object-file: small error handling follow-ups Justin Tobler
  2026-11-03 21:24 ` [PATCH 1/2] object-file: warn on failed unlink Justin Tobler
@ 2026-11-03 21:24 ` Justin Tobler
  2026-11-04 23:06   ` Junio C Hamano
  2026-11-05 15:30   ` Patrick Steinhardt
  2026-11-04 13:37 ` [PATCH 0/2] object-file: small error handling follow-ups Karthik Nayak
  2 siblings, 2 replies; 9+ messages in thread
From: Justin Tobler @ 2026-11-03 21:24 UTC (permalink / raw)
  To: git; +Cc: Justin Tobler

When git-index-pack(1) exits abnormally after reporting the packfile
name, `odb_transaction_files_write_pack()` records an error message in
`err_msg` but still returns success. Current callers ultimately discard
the return value, so this does not cause any issues at present, but the
return value should still reflect the failure.

Update `odb_transaction_files_write_pack()` to return an error value in
this case accordingly. While at it, simplify how the child process exit
statuses are checked.

Signed-off-by: Justin Tobler <jltobler@gmail.com>
---
 object-file.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/object-file.c b/object-file.c
index a9800143bd..e04ce0bc11 100644
--- a/object-file.c
+++ b/object-file.c
@@ -1429,8 +1429,7 @@ static int odb_transaction_files_write_pack(struct odb_transaction *base,
 	struct pack_header hdr;
 	const char *hdr_err;
 	int err_fd = opts->err_fd;
-	int ret = -1;
-	int status;
+	int ret;
 
 	hdr_err = parse_pack_header(&hdr, pack_fd);
 	if (hdr_err) {
@@ -1462,12 +1461,13 @@ static int odb_transaction_files_write_pack(struct odb_transaction *base,
 		child.in = pack_fd;
 		child.err = err_fd;
 		child.git_cmd = 1;
-		status = run_command(&child);
-		if (status) {
+		if (run_command(&child)) {
 			strbuf_addstr(err_msg, "unpack-objects abnormal exit");
 			return -1;
 		}
 	} else {
+		int report_err;
+
 		strvec_pushl(&child.args, "index-pack", "--stdin", NULL);
 		push_header_arg(&child.args, &hdr);
 
@@ -1487,24 +1487,24 @@ static int odb_transaction_files_write_pack(struct odb_transaction *base,
 		child.in = pack_fd;
 		child.err = err_fd;
 		child.git_cmd = 1;
-		status = start_command(&child);
-		if (status) {
+		if (start_command(&child)) {
 			strbuf_addstr(err_msg, "index-pack fork failed");
 			return -1;
 		}
 
-		ret = read_index_pack_report(repo, child.out, &pack_name, NULL);
+		report_err = read_index_pack_report(repo, child.out, &pack_name, NULL);
 
 		close(child.out);
 
-		status = finish_command(&child);
-		if (status) {
+		if (finish_command(&child)) {
 			strbuf_addstr(err_msg, "index-pack abnormal exit");
+			ret = -1;
 			goto out;
 		}
 
-		if (ret) {
+		if (report_err) {
 			strbuf_addstr(err_msg, "index-pack failed to report pack name");
+			ret = -1;
 			goto out;
 		}
 
-- 
2.56.0.173.gf57c9a7388


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH 0/2] object-file: small error handling follow-ups
  2026-11-03 21:24 [PATCH 0/2] object-file: small error handling follow-ups Justin Tobler
  2026-11-03 21:24 ` [PATCH 1/2] object-file: warn on failed unlink Justin Tobler
  2026-11-03 21:24 ` [PATCH 2/2] object-file: return error on index-pack abnormal exit Justin Tobler
@ 2026-11-04 13:37 ` Karthik Nayak
  2 siblings, 0 replies; 9+ messages in thread
From: Karthik Nayak @ 2026-11-04 13:37 UTC (permalink / raw)
  To: Justin Tobler, git

[-- Attachment #1: Type: text/plain, Size: 746 bytes --]

Justin Tobler <jltobler@gmail.com> writes:

> Greetings,
>
> This small series is a follow-up to jt/odb-keep-lockfile-fix to address
> some feedback that was submitted after the series was merged to next.
> Both patches here make some small improvements to some error handling code.
>
> Thanks,
> -Justin
>
> Justin Tobler (2):
>   object-file: warn on failed unlink
>   object-file: return error on index-pack abnormal exit
>
>  object-file.c | 26 +++++++++++++-------------
>  1 file changed, 13 insertions(+), 13 deletions(-)
>
>
> base-commit: 750f5de7dfe9a4062f95088212b063f189d50e91
> --
> 2.56.0.173.gf57c9a7388

So these seem to be the fixes for the comments I raised on your other
series. The patches look good. Thanks for following up!

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 690 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/2] object-file: warn on failed unlink
  2026-11-03 21:24 ` [PATCH 1/2] object-file: warn on failed unlink Justin Tobler
@ 2026-11-04 23:00   ` Junio C Hamano
  0 siblings, 0 replies; 9+ messages in thread
From: Junio C Hamano @ 2026-11-04 23:00 UTC (permalink / raw)
  To: Justin Tobler; +Cc: git

Justin Tobler <jltobler@gmail.com> writes:

> When the "files" ODB transaction cleans up a temporary packfile or
> ".keep" lockfile on an error path, any failure to unlink the file is
> silently ignored. A ".keep" file left behind this way prevents its
> packfile from ever being removed by housekeeping.
>
> Use `unlink_or_warn()` instead so that such failures are reported.
>
> Signed-off-by: Justin Tobler <jltobler@gmail.com>
> ---
>  object-file.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/object-file.c b/object-file.c
> index 132aaab6f8..a9800143bd 100644
> --- a/object-file.c
> +++ b/object-file.c
> @@ -823,7 +823,7 @@ static void flush_packfile_transaction(struct odb_transaction_files *transaction
>  	if (state->nr_written == 0) {
>  		close(state->f->fd);
>  		free_hashfile(state->f);
> -		unlink(state->pack_tmp_name);
> +		unlink_or_warn(state->pack_tmp_name);
>  		goto clear_exit;
>  	} else if (state->nr_written == 1) {
>  		finalize_hashfile(state->f, hash, FSYNC_COMPONENT_PACK,
> @@ -1276,13 +1276,13 @@ static int write_pack_lockfile(struct odb_source *source, const char *pack_name,
>  	if (write_in_full(fd, contents.buf, contents.len) < 0) {
>  		ret = error_errno(_("unable to write '%s'"), lock_path.buf);
>  		close(fd);
> -		unlink(lock_path.buf);
> +		unlink_or_warn(lock_path.buf);
>  		goto out;
>  	}
>  
>  	if (close(fd) < 0) {
>  		ret = error_errno(_("unable to close '%s'"), lock_path.buf);
> -		unlink(lock_path.buf);
> +		unlink_or_warn(lock_path.buf);
>  		goto out;
>  	}

Trivially correct.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/2] object-file: return error on index-pack abnormal exit
  2026-11-03 21:24 ` [PATCH 2/2] object-file: return error on index-pack abnormal exit Justin Tobler
@ 2026-11-04 23:06   ` Junio C Hamano
  2026-11-05 18:09     ` Justin Tobler
  2026-11-05 15:30   ` Patrick Steinhardt
  1 sibling, 1 reply; 9+ messages in thread
From: Junio C Hamano @ 2026-11-04 23:06 UTC (permalink / raw)
  To: Justin Tobler; +Cc: git

Justin Tobler <jltobler@gmail.com> writes:

> diff --git a/object-file.c b/object-file.c
> index a9800143bd..e04ce0bc11 100644
> --- a/object-file.c
> +++ b/object-file.c
> @@ -1429,8 +1429,7 @@ static int odb_transaction_files_write_pack(struct odb_transaction *base,
>  	struct pack_header hdr;
>  	const char *hdr_err;
>  	int err_fd = opts->err_fd;
> -	int ret = -1;
> -	int status;
> +	int ret;
>  
>  	hdr_err = parse_pack_header(&hdr, pack_fd);
>  	if (hdr_err) {
> @@ -1462,12 +1461,13 @@ static int odb_transaction_files_write_pack(struct odb_transaction *base,
>  		child.in = pack_fd;
>  		child.err = err_fd;
>  		child.git_cmd = 1;
> -		status = run_command(&child);
> -		if (status) {
> +		if (run_command(&child)) {
>  			strbuf_addstr(err_msg, "unpack-objects abnormal exit");
>  			return -1;
>  		}

OK.  A slight simplication that does not change any behaviour.

>  	} else {
> +		int report_err;
> +
>  		strvec_pushl(&child.args, "index-pack", "--stdin", NULL);
>  		push_header_arg(&child.args, &hdr);
>  
> @@ -1487,24 +1487,24 @@ static int odb_transaction_files_write_pack(struct odb_transaction *base,
>  		child.in = pack_fd;
>  		child.err = err_fd;
>  		child.git_cmd = 1;
> -		status = start_command(&child);
> -		if (status) {
> +		if (start_command(&child)) {
>  			strbuf_addstr(err_msg, "index-pack fork failed");
>  			return -1;
>  		}
>  
> -		ret = read_index_pack_report(repo, child.out, &pack_name, NULL);
> +		report_err = read_index_pack_report(repo, child.out, &pack_name, NULL);
>  
>  		close(child.out);
>  
> -		status = finish_command(&child);
> -		if (status) {
> +		if (finish_command(&child)) {
>  			strbuf_addstr(err_msg, "index-pack abnormal exit");
> +			ret = -1;
>  			goto out;
>  		}

OK.  A slight simplication that does not change any behaviour again.

> -		if (ret) {
> +		if (report_err) {
>  			strbuf_addstr(err_msg, "index-pack failed to report pack name");
> +			ret = -1;
>  			goto out;
>  		}

I guess this also does not change a behaviour?  We used to relay the
error status returned by read_index_pack_report(), but now we force
the error code to an explicit -1.

Personally, I somehow find that the original "unless we positively
declare success, default to 'ret = -1', and if we may have detected
more specific error, return it back, and reset ret to 0 when we see
a success" easier to follow, but that may be subjective preference.

Will queue.  Thanks.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/2] object-file: return error on index-pack abnormal exit
  2026-11-03 21:24 ` [PATCH 2/2] object-file: return error on index-pack abnormal exit Justin Tobler
  2026-11-04 23:06   ` Junio C Hamano
@ 2026-11-05 15:30   ` Patrick Steinhardt
  2026-11-05 18:06     ` Justin Tobler
  1 sibling, 1 reply; 9+ messages in thread
From: Patrick Steinhardt @ 2026-11-05 15:30 UTC (permalink / raw)
  To: Justin Tobler; +Cc: git

On Tue, Nov 03, 2026 at 03:24:10PM -0600, Justin Tobler wrote:
> When git-index-pack(1) exits abnormally after reporting the packfile
> name, `odb_transaction_files_write_pack()` records an error message in
> `err_msg` but still returns success. Current callers ultimately discard
> the return value, so this does not cause any issues at present, but the
> return value should still reflect the failure.

Is this a theoretical concern or does git-index-pack(1) perform any
important steps after reporting the packfile name? I think we should of
course respect errors in either case, but I wonder whether this is a bug
fix or whether it's a simple cleanup.

Patrick

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/2] object-file: return error on index-pack abnormal exit
  2026-11-05 15:30   ` Patrick Steinhardt
@ 2026-11-05 18:06     ` Justin Tobler
  0 siblings, 0 replies; 9+ messages in thread
From: Justin Tobler @ 2026-11-05 18:06 UTC (permalink / raw)
  To: Patrick Steinhardt; +Cc: git

On 26/11/05 04:30PM, Patrick Steinhardt wrote:
> On Tue, Nov 03, 2026 at 03:24:10PM -0600, Justin Tobler wrote:
> > When git-index-pack(1) exits abnormally after reporting the packfile
> > name, `odb_transaction_files_write_pack()` records an error message in
> > `err_msg` but still returns success. Current callers ultimately discard
> > the return value, so this does not cause any issues at present, but the
> > return value should still reflect the failure.
> 
> Is this a theoretical concern or does git-index-pack(1) perform any
> important steps after reporting the packfile name? I think we should of
> course respect errors in either case, but I wonder whether this is a bug
> fix or whether it's a simple cleanup.

This is a theoretical concern. If `read_index_pack_report()` returned
success and finish_command() returned an error,
`odb_transaction_files_write_pack()` would append an error message but
return 0. This isn't really the correct behavior. In this case though,
it doesn't cause any bugs because the return value is ultimately
discarded by its callers.

-Justin

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/2] object-file: return error on index-pack abnormal exit
  2026-11-04 23:06   ` Junio C Hamano
@ 2026-11-05 18:09     ` Justin Tobler
  0 siblings, 0 replies; 9+ messages in thread
From: Justin Tobler @ 2026-11-05 18:09 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

On 26/11/04 03:06PM, Junio C Hamano wrote:
> Justin Tobler <jltobler@gmail.com> writes:
> > -		if (ret) {
> > +		if (report_err) {
> >  			strbuf_addstr(err_msg, "index-pack failed to report pack name");
> > +			ret = -1;
> >  			goto out;
> >  		}
> 
> I guess this also does not change a behaviour?  We used to relay the
> error status returned by read_index_pack_report(), but now we force
> the error code to an explicit -1.

That is correct, there is no behavior change here. The main change is
that `finish_command()` properly reports its error and is not
overwritten by `read_index_pack_report()`.

[snip]
> 
> Will queue.  Thanks.

Thanks for the review,
-Justin

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2026-11-05 18:09 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-11-03 21:24 [PATCH 0/2] object-file: small error handling follow-ups Justin Tobler
2026-11-03 21:24 ` [PATCH 1/2] object-file: warn on failed unlink Justin Tobler
2026-11-04 23:00   ` Junio C Hamano
2026-11-03 21:24 ` [PATCH 2/2] object-file: return error on index-pack abnormal exit Justin Tobler
2026-11-04 23:06   ` Junio C Hamano
2026-11-05 18:09     ` Justin Tobler
2026-11-05 15:30   ` Patrick Steinhardt
2026-11-05 18:06     ` Justin Tobler
2026-11-04 13:37 ` [PATCH 0/2] object-file: small error handling follow-ups Karthik Nayak

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox