From: Jonathan Nieder <jrnieder@gmail.com>
To: Taylor Blau <me@ttaylorr.com>
Cc: git@vger.kernel.org, gitster@pobox.com, jonathantanmy@google.com,
Eric Sunshine <sunshine@sunshineco.com>
Subject: Re: [PATCH 5/5] shallow: use struct 'shallow_lock' for additional safety
Date: Wed, 29 Apr 2020 20:11:38 -0700 [thread overview]
Message-ID: <20200430031138.GC115238@google.com> (raw)
In-Reply-To: <c0dc5024a9b368dfbca99b81bc843f66d725f3d7.1588199705.git.me@ttaylorr.com>
Hi,
Taylor Blau wrote:
> In previous patches, the functions 'commit_shallow_file' and
> 'rollback_shallow_file' were introduced to reset the shallowness
> validity checks on a repository after potentially modifying
> '.git/shallow'.
>
> These functions can be made safer by wrapping the 'struct lockfile *' in
> a new type, 'shallow_lock', so that they cannot be called with a raw
> lock (and potentially misused by other code that happens to possess a
> lockfile, but has nothing to do with shallowness).
>
> This patch introduces that type as a thin wrapper around 'struct
> lockfile', and updates the two aforementioned functions and their
> callers to use it.
>
> Suggested-by: Junio C Hamano <gitster@pobox.com>
> Signed-off-by: Taylor Blau <me@ttaylorr.com>
> ---
> builtin/receive-pack.c | 2 +-
> fetch-pack.c | 2 +-
> shallow.c | 22 +++++++++++-----------
> shallow.h | 16 +++++++++++++---
> 4 files changed, 26 insertions(+), 16 deletions(-)
Yay! Thanks for indulging the suggestion.
[...]
> --- a/shallow.h
> +++ b/shallow.h
> @@ -10,12 +10,22 @@ void set_alternate_shallow_file(struct repository *r, const char *path, int over
> int register_shallow(struct repository *r, const struct object_id *oid);
> int unregister_shallow(const struct object_id *oid);
> int is_repository_shallow(struct repository *r);
> +
> +/*
> + * shallow_lock is a thin wrapper around 'struct lock_file' in order to restrict
> + * which locks can be used with '{commit,rollback}_shallow_file()'.
> + */
> +struct shallow_lock {
> + struct lock_file lk;
> +};
> +#define SHALLOW_LOCK_INIT { LOCK_INIT }
I think I disagree with Eric here: it's useful to have a comment here
to describe the purpose of the struct (i.e., the "why" as opposed to
the "what").
I wonder if we can go further, though --- when using a shallow_lock,
how should I think of it as a caller? In some sense, the use of
'struct lock_file' is an implementation detail, so we could say:
/*
* Lock for updating the $GIT_DIR/shallow file.
*
* Use `commit_shallow_file()` to commit an update, or
* `rollback_shallow_file()` to roll it back. In either case,
* any in-memory cached information about which commits are
* shallow will be appropriately invalidated so that future
* operations reflect the new state.
*/
What do you think?
[...]
> --- a/shallow.c
> +++ b/shallow.c
[...]
> @@ -366,22 +366,22 @@ const char *setup_temporary_shallow(const struct oid_array *extra)
> return "";
> }
>
> -void setup_alternate_shallow(struct lock_file *shallow_lock,
> +void setup_alternate_shallow(struct shallow_lock *shallow_lock,
> const char **alternate_shallow_file,
> const struct oid_array *extra)
> {
> struct strbuf sb = STRBUF_INIT;
> int fd;
>
> - fd = hold_lock_file_for_update(shallow_lock,
> + fd = hold_lock_file_for_update(&shallow_lock->lk,
> git_path_shallow(the_repository),
> LOCK_DIE_ON_ERROR);
This is peeking into the underlying lock_file, so I should ask myself
whether it's hinting at some missing function in the shallow_lock
API. My feeling is "no": setup_alternate_shallow is itself that
function. :)
[...]
> @@ -414,7 +414,7 @@ void advertise_shallow_grafts(int fd)
> */
> void prune_shallow(unsigned options)
> {
> - struct lock_file shallow_lock = LOCK_INIT;
> + struct shallow_lock shallow_lock = SHALLOW_LOCK_INIT;
> struct strbuf sb = STRBUF_INIT;
> unsigned flags = SEEN_ONLY;
> int fd;
> @@ -428,14 +428,14 @@ void prune_shallow(unsigned options)
> strbuf_release(&sb);
> return;
> }
> - fd = hold_lock_file_for_update(&shallow_lock,
> + fd = hold_lock_file_for_update(&shallow_lock.lk,
> git_path_shallow(the_repository),
> LOCK_DIE_ON_ERROR);
> check_shallow_file_for_update(the_repository);
> if (write_shallow_commits_1(&sb, 0, NULL, flags)) {
> if (write_in_full(fd, sb.buf, sb.len) < 0)
> die_errno("failed to write to %s",
> - get_lock_file_path(&shallow_lock));
> + get_lock_file_path(&shallow_lock.lk));
> commit_shallow_file(the_repository, &shallow_lock);
There's no obvious helper to extract here either, so this looks good
to me.
With whatever tweaks based on Eric's and Jonathan's reviews seem
appropriate,
Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>
Thanks.
next prev parent reply other threads:[~2020-04-30 3:11 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-29 22:39 [PATCH 0/5] shallow: extract a header file Taylor Blau
2020-04-29 22:39 ` [PATCH 1/5] commit: make 'commit_graft_pos' non-static Taylor Blau
2020-04-30 3:26 ` Jonathan Nieder
2020-04-30 19:22 ` Taylor Blau
2020-04-29 22:39 ` [PATCH 2/5] shallow: extract a header file for shallow-related functions Taylor Blau
2020-04-29 22:48 ` Eric Sunshine
2020-04-30 0:21 ` Jonathan Tan
2020-04-30 0:59 ` Taylor Blau
2020-04-30 18:23 ` Jonathan Tan
2020-04-30 3:19 ` Jonathan Nieder
2020-04-29 22:39 ` [PATCH 3/5] commit: move 'unregister_shallow' to 'shallow.h' Taylor Blau
2020-04-30 3:13 ` Jonathan Nieder
2020-04-30 19:29 ` Taylor Blau
2020-04-29 22:39 ` [PATCH 4/5] shallow.h: document '{commit,rollback}_shallow_file' Taylor Blau
2020-04-29 22:53 ` Eric Sunshine
2020-04-29 22:39 ` [PATCH 5/5] shallow: use struct 'shallow_lock' for additional safety Taylor Blau
2020-04-29 23:03 ` Eric Sunshine
2020-04-29 23:51 ` Taylor Blau
2020-04-30 0:30 ` Jonathan Tan
2020-04-30 3:11 ` Jonathan Nieder [this message]
2020-04-30 5:32 ` Eric Sunshine
2020-04-30 19:32 ` Taylor Blau
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=20200430031138.GC115238@google.com \
--to=jrnieder@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jonathantanmy@google.com \
--cc=me@ttaylorr.com \
--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.
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 NNTP newsgroup(s).