git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Johannes Schindelin <johannes.schindelin@gmx.de>
Cc: git@vger.kernel.org, Eric Sunshine <sunshine@sunshineco.com>
Subject: Re: [PATCH v2 08/14] sequencer: lib'ify read_and_refresh_cache()
Date: Mon, 29 Aug 2016 13:44:33 -0700	[thread overview]
Message-ID: <xmqq7faz9ufi.fsf@gitster.mtv.corp.google.com> (raw)
In-Reply-To: <99f3ab3a30a469b271300ff61309ac4c4a8af448.1472219214.git.johannes.schindelin@gmx.de> (Johannes Schindelin's message of "Fri, 26 Aug 2016 15:47:50 +0200 (CEST)")

Johannes Schindelin <johannes.schindelin@gmx.de> writes:

> Instead of dying there, let the caller high up in the callchain
> notice the error and handle it (by dying, still).
>
> There are two call sites of read_and_refresh_cache(), one of which is
> pick_commits(), whose callers were already prepared to do the right
> thing given an "error" return from it by an earlier patch, so the
> conversion is safe.
>
> The other one, sequencer_pick_revisions() was also prepared to relay
> an error return back to its caller in all remaining cases in an
> earlier patch.
>
> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
> ---
>  sequencer.c | 15 ++++++++++-----
>  1 file changed, 10 insertions(+), 5 deletions(-)
>
> diff --git a/sequencer.c b/sequencer.c
> index c006cae..e30aa82 100644
> --- a/sequencer.c
> +++ b/sequencer.c
> @@ -640,18 +640,21 @@ static int prepare_revs(struct replay_opts *opts)
>  	return 0;
>  }
>  
> -static void read_and_refresh_cache(struct replay_opts *opts)
> +static int read_and_refresh_cache(struct replay_opts *opts)
>  {
>  	static struct lock_file index_lock;
>  	int index_fd = hold_locked_index(&index_lock, 0);
>  	if (read_index_preload(&the_index, NULL) < 0)
> -		die(_("git %s: failed to read the index"), action_name(opts));
> +		return error(_("git %s: failed to read the index"),
> +			action_name(opts));
>  	refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, NULL, NULL, NULL);
>  	if (the_index.cache_changed && index_fd >= 0) {
>  		if (write_locked_index(&the_index, &index_lock, COMMIT_LOCK))
> -			die(_("git %s: failed to refresh the index"), action_name(opts));
> +			return error(_("git %s: failed to refresh the index"),
> +				action_name(opts));
>  	}
>  	rollback_lock_file(&index_lock);
> +	return 0;
>  }

With the current set of callers, a caller that notices an error from
this function will immediately exit without doing any further
damage.

So in that sense, this is a "safe" conversion.

But is it a sensible conversion?  When the caller wants to do
anything else (e.g. clean-up and try something else, perhaps read
the index again), the caller can't, as the index is still locked,
because even though the code knows that the lock will not be
released until the process exit, it chose to return error without
releasing the lock.

For a file-scope static helper, that probably is sufficient.  But if
this can be reached from a public entry point in the API, the caller
of that entry point will find this not-so-useful, I would think.

I suspect doing the "right thing" to future-proof it may not be too
much more work.

	static int read_and_refresh_cache(struct replay_opts *opts)
        {
+        	int retval = 0; /* assume success */
		...
                if (read_idnex_preload(...) < 0) {
			retval = error(...);
                        goto finish;
		}
                refresh_index(...);
                if (...changed...) {
                	if (write_locked_index(...))
                        	retval = error(...);
		}
+	finish:
                rollback_lock_file(&index_lock);
                return retval;
	}

or something like that on top?

  reply	other threads:[~2016-08-29 20:44 UTC|newest]

Thread overview: 91+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-08-23 16:06 [PATCH 00/15] Lib'ify quite a few functions in sequencer.c Johannes Schindelin
2016-08-23 16:06 ` [PATCH 01/15] sequencer: lib'ify write_message() Johannes Schindelin
2016-08-24  7:09   ` Eric Sunshine
2016-08-24 15:52     ` Johannes Schindelin
2016-08-23 16:06 ` [PATCH 02/15] sequencer: lib'ify do_recursive_merge() Johannes Schindelin
2016-08-24  7:16   ` Eric Sunshine
2016-08-24 15:53     ` Johannes Schindelin
2016-08-23 16:06 ` [PATCH 03/15] sequencer: lib'ify do_pick_commit() Johannes Schindelin
2016-08-25 21:17   ` Junio C Hamano
2016-08-26 11:56     ` Johannes Schindelin
2016-08-23 16:06 ` [PATCH 04/15] sequencer: lib'ify prepare_revs() Johannes Schindelin
2016-08-25 22:51   ` Junio C Hamano
2016-08-26 13:40     ` Johannes Schindelin
2016-08-23 16:07 ` [PATCH 05/15] sequencer: lib'ify read_and_refresh_cache() Johannes Schindelin
2016-08-24  7:20   ` Eric Sunshine
2016-08-24 15:54     ` Johannes Schindelin
2016-08-25 22:49   ` Junio C Hamano
2016-08-23 16:07 ` [PATCH 06/15] sequencer: lib'ify read_populate_todo() Johannes Schindelin
2016-08-24  7:24   ` Eric Sunshine
2016-08-24 15:57     ` Johannes Schindelin
2016-08-25 22:59   ` Junio C Hamano
2016-08-26 13:45     ` Johannes Schindelin
2016-08-26 16:58       ` Junio C Hamano
2016-08-23 16:07 ` [PATCH 07/15] sequencer: lib'ify read_populate_opts() Johannes Schindelin
2016-08-26 17:40   ` Junio C Hamano
2016-08-29 12:06     ` Johannes Schindelin
2016-08-23 16:07 ` [PATCH 08/15] sequencer: lib'ify walk_revs_populate_todo() Johannes Schindelin
2016-08-23 16:07 ` [PATCH 09/15] sequencer: lib'ify create_seq_dir() Johannes Schindelin
2016-08-24  7:28   ` Eric Sunshine
2016-08-24 15:58     ` Johannes Schindelin
2016-08-23 16:07 ` [PATCH 10/15] sequencer: lib'ify save_head() Johannes Schindelin
2016-08-24  7:30   ` Eric Sunshine
2016-08-24 15:59     ` Johannes Schindelin
2016-08-23 16:07 ` [PATCH 11/15] sequencer: lib'ify save_todo() Johannes Schindelin
2016-08-24  7:36   ` Eric Sunshine
2016-08-24 16:05     ` Johannes Schindelin
2016-08-23 16:07 ` [PATCH 12/15] sequencer: lib'ify save_opts() Johannes Schindelin
2016-08-26 17:44   ` Junio C Hamano
2016-08-29 12:09     ` Johannes Schindelin
2016-08-23 16:07 ` [PATCH 13/15] sequencer: lib'ify sequencer_pick_revisions() Johannes Schindelin
2016-08-23 16:07 ` [PATCH 14/15] sequencer: do not die() in do_pick_commit() Johannes Schindelin
2016-08-23 16:07 ` [PATCH 15/15] sequencer: do not die() in fast_forward_to() Johannes Schindelin
2016-08-26 13:47 ` [PATCH v2 00/14] Lib'ify quite a few functions in sequencer.c Johannes Schindelin
2016-08-26 13:47   ` [PATCH v2 01/14] sequencer: lib'ify sequencer_pick_revisions() Johannes Schindelin
2016-08-26 13:47   ` [PATCH v2 02/14] sequencer: do not die() in do_pick_commit() Johannes Schindelin
2016-08-26 13:47   ` [PATCH v2 03/14] sequencer: lib'ify write_message() Johannes Schindelin
2016-08-29 20:27     ` Junio C Hamano
2016-08-30  7:49       ` Johannes Schindelin
2016-08-26 13:47   ` [PATCH v2 04/14] sequencer: lib'ify do_recursive_merge() Johannes Schindelin
2016-08-26 13:47   ` [PATCH v2 05/14] sequencer: lib'ify do_pick_commit() Johannes Schindelin
2016-08-29 20:32     ` Junio C Hamano
2016-08-26 13:47   ` [PATCH v2 06/14] sequencer: lib'ify walk_revs_populate_todo() Johannes Schindelin
2016-08-26 13:47   ` [PATCH v2 07/14] sequencer: lib'ify prepare_revs() Johannes Schindelin
2016-08-26 13:47   ` [PATCH v2 08/14] sequencer: lib'ify read_and_refresh_cache() Johannes Schindelin
2016-08-29 20:44     ` Junio C Hamano [this message]
2016-08-30  9:09       ` Johannes Schindelin
2016-08-30 17:20         ` Junio C Hamano
2016-08-26 13:47   ` [PATCH v2 09/14] sequencer: lib'ify read_populate_todo() Johannes Schindelin
2016-08-26 13:47   ` [PATCH v2 10/14] sequencer: lib'ify read_populate_opts() Johannes Schindelin
2016-08-29 20:46     ` Junio C Hamano
2016-08-29 21:14       ` Junio C Hamano
2016-08-30  9:17       ` Johannes Schindelin
2016-08-30 17:21         ` Junio C Hamano
2016-08-26 13:47   ` [PATCH v2 11/14] sequencer: lib'ify create_seq_dir() Johannes Schindelin
2016-08-26 13:48   ` [PATCH v2 12/14] sequencer: lib'ify save_head() Johannes Schindelin
2016-08-29 20:49     ` Junio C Hamano
2016-08-30  9:21       ` Johannes Schindelin
2016-08-26 13:48   ` [PATCH v2 13/14] sequencer: lib'ify save_todo() Johannes Schindelin
2016-08-26 13:48   ` [PATCH v2 14/14] sequencer: lib'ify save_opts() Johannes Schindelin
2016-08-29 20:51   ` [PATCH v2 00/14] Lib'ify quite a few functions in sequencer.c Junio C Hamano
2016-09-09 14:35   ` [PATCH v3 00/17] " Johannes Schindelin
2016-09-09 14:35     ` [PATCH v3 01/17] sequencer: lib'ify sequencer_pick_revisions() Johannes Schindelin
2016-09-09 14:37     ` [PATCH v3 02/17] sequencer: do not die() in do_pick_commit() Johannes Schindelin
2016-09-09 14:37     ` [PATCH v3 03/17] sequencer: lib'ify write_message() Johannes Schindelin
2016-09-09 14:37     ` [PATCH v3 04/17] sequencer: lib'ify do_recursive_merge() Johannes Schindelin
2016-09-09 14:37     ` [PATCH v3 05/17] sequencer: lib'ify do_pick_commit() Johannes Schindelin
2016-09-09 14:37     ` [PATCH v3 06/17] sequencer: lib'ify walk_revs_populate_todo() Johannes Schindelin
2016-09-09 14:37     ` [PATCH v3 07/17] sequencer: lib'ify prepare_revs() Johannes Schindelin
2016-09-09 14:37     ` [PATCH v3 08/17] sequencer: lib'ify read_and_refresh_cache() Johannes Schindelin
2016-09-09 14:37     ` [PATCH v3 09/17] sequencer: lib'ify read_populate_todo() Johannes Schindelin
2016-09-09 14:37     ` [PATCH v3 10/17] sequencer: lib'ify read_populate_opts() Johannes Schindelin
2016-09-09 14:37     ` [PATCH v3 11/17] sequencer: lib'ify create_seq_dir() Johannes Schindelin
2016-09-09 14:37     ` [PATCH v3 12/17] sequencer: lib'ify save_head() Johannes Schindelin
2016-09-09 14:37     ` [PATCH v3 13/17] sequencer: lib'ify save_todo() Johannes Schindelin
2016-09-09 14:37     ` [PATCH v3 14/17] sequencer: lib'ify save_opts() Johannes Schindelin
2016-09-09 14:37     ` [PATCH v3 15/17] sequencer: lib'ify fast_forward_to() Johannes Schindelin
2016-09-09 14:38     ` [PATCH v3 16/17] lib'ify checkout_fast_forward_to() Johannes Schindelin
2016-09-09 18:23       ` Junio C Hamano
2016-09-11  8:09         ` Johannes Schindelin
2016-09-09 14:38     ` [PATCH v3 17/17] sequencer: ensure to release the lock when we could not read the index Johannes Schindelin
2016-09-09 18:26       ` Junio C Hamano

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

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=xmqq7faz9ufi.fsf@gitster.mtv.corp.google.com \
    --to=gitster@pobox.com \
    --cc=git@vger.kernel.org \
    --cc=johannes.schindelin@gmx.de \
    --cc=sunshine@sunshineco.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.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).