From: Junio C Hamano <gitster@pobox.com>
To: Brad King <brad.king@kitware.com>
Cc: git@vger.kernel.org
Subject: Re: [PATCH v2 6/8] refs: add update_refs for multiple simultaneous updates
Date: Sat, 31 Aug 2013 23:08:34 -0700 [thread overview]
Message-ID: <xmqqob8dul99.fsf@gitster.dls.corp.google.com> (raw)
In-Reply-To: edaddbd4e303866f789f1a4f755a9da77590aeef.1377885441.git.brad.king@kitware.com
Brad King <brad.king@kitware.com> writes:
> Add 'struct ref_update' to encode the information needed to update or
> delete a ref (name, new sha1, optional old sha1, no-deref flag). Add
> function 'update_refs' accepting an array of updates to perform. First
> sort the input array to order locks consistently everywhere and reject
> multiple updates to the same ref. Then acquire locks on all refs with
> verified old values. Then update or delete all refs accordingly. Fail
> if any one lock cannot be obtained or any one old value does not match.
OK. The code releases the locks it acquired so far when it fails,
which is good.
> Though the refs themeselves cannot be modified together in a single
"themselves".
> atomic transaction, this function does enable some useful semantics.
> For example, a caller may create a new branch starting from the head of
> another branch and rewind the original branch at the same time. This
> transfers ownership of commits between branches without risk of losing
> commits added to the original branch by a concurrent process, or risk of
> a concurrent process creating the new branch first.
> +static int ref_update_compare(const void *r1, const void *r2)
> +{
> + struct ref_update *u1 = (struct ref_update *)(r1);
> + struct ref_update *u2 = (struct ref_update *)(r2);
> + int ret;
Let's have a blank line between the end of decls and the beginning
of the body here.
> + ret = strcmp(u1->ref_name, u2->ref_name);
> + if (ret)
> + return ret;
> + ret = hashcmp(u1->new_sha1, u2->new_sha1);
> + if (ret)
> + return ret;
> + ret = hashcmp(u1->old_sha1, u2->old_sha1);
> + if (ret)
> + return ret;
> + ret = u1->flags - u2->flags;
> + if (ret)
> + return ret;
> + return u1->have_old - u2->have_old;
> +}
I notice that we are using an array of structures and letting qsort
swap 50~64 bytes of data, instead of sorting an array of pointers,
each element of which points at a structure. This may not matter
unless we are asked to update thousands at once, so I think it is OK
for now.
> +static int ref_update_reject_duplicates(struct ref_update *updates, int n,
> + enum action_on_err onerr)
> +{
> + int i;
> + for (i = 1; i < n; ++i)
> + if (!strcmp(updates[i - 1].ref_name, updates[i].ref_name))
> + break;
Optionally we could silently dedup multiple identical updates and
not fail it in ref-update-reject-duplicates. But that does not have
to be done until we find people's script would benefit from such a
nicety.
By the way, unless there is a strong reason not to do so,
post-increment "i++" (and pre-decrement "--i", if you use it) is the
norm around here. Especially in places like the third part of a
for(;;) loop where people are used to see "i++", breaking the idiom
makes readers wonder if there is something else going on.
> + /* Perform updates first so live commits remain referenced: */
> + for (i = 0; i < n; ++i)
> + if (!is_null_sha1(updates[i].new_sha1)) {
> + ret |= update_ref_write(action,
> + updates[i].ref_name,
> + updates[i].new_sha1,
> + locks[i], onerr);
> + locks[i] = 0; /* freed by update_ref_write */
I think what is assigned here is a NULL pointer.
Will locally tweak while queuing. Thanks.
next prev parent reply other threads:[~2013-09-01 6:08 UTC|newest]
Thread overview: 106+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-08-29 14:11 [PATCH/RFC 0/7] Multiple simultaneously locked ref updates Brad King
2013-08-29 14:11 ` [PATCH/RFC 1/7] reset: rename update_refs to reset_refs Brad King
2013-08-29 17:17 ` Junio C Hamano
2013-08-29 18:07 ` Brad King
2013-08-29 14:11 ` [PATCH/RFC 2/7] refs: report ref type from lock_any_ref_for_update Brad King
2013-08-29 17:22 ` Junio C Hamano
2013-08-29 18:08 ` Brad King
2013-08-29 14:11 ` [PATCH/RFC 3/7] refs: factor update_ref steps into helpers Brad King
2013-08-29 14:11 ` [PATCH/RFC 4/7] refs: factor delete_ref loose ref step into a helper Brad King
2013-08-29 17:28 ` Junio C Hamano
2013-08-29 18:08 ` Brad King
2013-08-29 14:11 ` [PATCH/RFC 5/7] refs: add function to repack without multiple refs Brad King
2013-08-29 17:34 ` Junio C Hamano
2013-08-29 18:09 ` Brad King
2013-08-29 14:11 ` [PATCH/RFC 6/7] refs: add update_refs for multiple simultaneous updates Brad King
2013-08-29 17:39 ` Junio C Hamano
2013-08-29 18:20 ` Brad King
2013-08-29 18:32 ` Junio C Hamano
2013-08-29 18:38 ` Brad King
2013-08-29 19:30 ` Brad King
2013-08-29 14:11 ` [PATCH/RFC 7/7] update-ref: support " Brad King
2013-08-29 18:34 ` Junio C Hamano
2013-08-29 18:42 ` Brad King
2013-08-29 15:32 ` [PATCH/RFC 0/7] Multiple simultaneously locked ref updates Martin Fick
2013-08-29 15:46 ` Brad King
2013-08-29 16:21 ` Junio C Hamano
2013-08-29 17:09 ` Brad King
2013-08-29 18:07 ` Junio C Hamano
2013-08-29 18:23 ` Brad King
2013-08-30 18:11 ` [PATCH v2 0/8] " Brad King
2013-08-30 18:11 ` [PATCH v2 1/8] reset: rename update_refs to reset_refs Brad King
2013-08-30 18:12 ` [PATCH v2 2/8] refs: report ref type from lock_any_ref_for_update Brad King
2013-08-30 18:12 ` [PATCH v2 3/8] refs: factor update_ref steps into helpers Brad King
2013-09-01 6:08 ` Junio C Hamano
2013-09-02 17:19 ` Brad King
2013-08-30 18:12 ` [PATCH v2 4/8] refs: factor delete_ref loose ref step into a helper Brad King
2013-08-31 16:30 ` Michael Haggerty
2013-09-02 17:19 ` Brad King
2013-08-30 18:12 ` [PATCH v2 5/8] refs: add function to repack without multiple refs Brad King
2013-08-30 18:12 ` [PATCH v2 6/8] refs: add update_refs for multiple simultaneous updates Brad King
2013-08-31 18:19 ` Michael Haggerty
2013-09-02 17:20 ` Brad King
2013-09-01 6:08 ` Junio C Hamano [this message]
2013-09-02 17:20 ` Brad King
2013-09-03 4:43 ` Michael Haggerty
2013-09-03 11:59 ` Brad King
2013-08-30 18:12 ` [PATCH v2 7/8] update-ref: support " Brad King
2013-08-30 22:51 ` Junio C Hamano
2013-09-02 17:23 ` Brad King
2013-08-31 18:42 ` Michael Haggerty
2013-09-02 17:21 ` Brad King
2013-08-30 18:12 ` [PATCH v2 8/8] update-ref: add test cases covering --stdin signature Brad King
2013-09-01 3:41 ` Eric Sunshine
2013-09-02 17:23 ` Brad King
2013-08-31 19:02 ` [PATCH v2 0/8] Multiple simultaneously locked ref updates Michael Haggerty
2013-09-02 17:48 ` [PATCH v3 " Brad King
2013-09-02 17:48 ` [PATCH v3 1/8] reset: rename update_refs to reset_refs Brad King
2013-09-02 17:48 ` [PATCH v3 2/8] refs: report ref type from lock_any_ref_for_update Brad King
2013-09-02 17:48 ` [PATCH v3 3/8] refs: factor update_ref steps into helpers Brad King
2013-09-02 17:48 ` [PATCH v3 4/8] refs: factor delete_ref loose ref step into a helper Brad King
2013-09-02 17:48 ` [PATCH v3 5/8] refs: add function to repack without multiple refs Brad King
2013-09-02 17:48 ` [PATCH v3 6/8] refs: add update_refs for multiple simultaneous updates Brad King
2013-09-02 17:48 ` [PATCH v3 7/8] update-ref: support " Brad King
2013-09-02 18:37 ` Brad King
2013-09-02 17:48 ` [PATCH v3 8/8] update-ref: add test cases covering --stdin signature Brad King
2013-09-03 8:16 ` Eric Sunshine
2013-09-03 12:15 ` Brad King
2013-09-04 15:22 ` [PATCH v4 0/8] Multiple simultaneously locked ref updates Brad King
2013-09-04 15:22 ` [PATCH v4 1/8] reset: rename update_refs to reset_refs Brad King
2013-09-04 15:22 ` [PATCH v4 2/8] refs: report ref type from lock_any_ref_for_update Brad King
2013-09-04 15:22 ` [PATCH v4 3/8] refs: factor update_ref steps into helpers Brad King
2013-09-04 15:22 ` [PATCH v4 4/8] refs: factor delete_ref loose ref step into a helper Brad King
2013-09-04 15:22 ` [PATCH v4 5/8] refs: add function to repack without multiple refs Brad King
2013-09-04 15:22 ` [PATCH v4 6/8] refs: add update_refs for multiple simultaneous updates Brad King
2013-09-04 15:22 ` [PATCH v4 7/8] update-ref: support " Brad King
2013-09-04 18:23 ` Junio C Hamano
2013-09-04 19:59 ` Brad King
2013-09-04 21:27 ` Junio C Hamano
2013-09-05 20:32 ` Brad King
2013-09-05 21:23 ` Junio C Hamano
2013-09-05 23:44 ` Brad King
2013-09-04 19:17 ` Junio C Hamano
2013-09-04 19:16 ` Brad King
2013-09-04 15:22 ` [PATCH v4 8/8] update-ref: add test cases covering --stdin signature Brad King
2013-09-09 13:22 ` [PATCH v5 0/8] Multiple simultaneously locked ref updates Brad King
2013-09-09 13:22 ` [PATCH v5 7/8] update-ref: support multiple simultaneous updates Brad King
2013-09-09 13:22 ` [PATCH v5 8/8] update-ref: add test cases covering --stdin signature Brad King
2013-09-10 0:57 ` [PATCH v6 0/8] Multiple simultaneously locked ref updates Brad King
2013-09-10 0:57 ` [PATCH v6 1/8] reset: rename update_refs to reset_refs Brad King
2013-09-10 3:43 ` Ramkumar Ramachandra
2013-09-10 0:57 ` [PATCH v6 2/8] refs: report ref type from lock_any_ref_for_update Brad King
2013-09-10 0:57 ` [PATCH v6 3/8] refs: factor update_ref steps into helpers Brad King
2013-09-10 0:57 ` [PATCH v6 4/8] refs: factor delete_ref loose ref step into a helper Brad King
2013-09-10 0:57 ` [PATCH v6 5/8] refs: add function to repack without multiple refs Brad King
2013-09-10 0:57 ` [PATCH v6 6/8] refs: add update_refs for multiple simultaneous updates Brad King
2013-09-10 0:57 ` [PATCH v6 7/8] update-ref: support " Brad King
2013-09-10 22:51 ` Eric Sunshine
2013-09-11 12:36 ` Brad King
2013-09-11 16:07 ` Eric Sunshine
2013-09-10 0:57 ` [PATCH v6 8/8] update-ref: add test cases covering --stdin signature Brad King
2013-09-10 22:46 ` Eric Sunshine
2013-09-10 22:54 ` Junio C Hamano
2013-09-11 12:46 ` [PATCH v6.1 " Brad King
2013-09-10 16:30 ` [PATCH v6 0/8] Multiple simultaneously locked ref updates Junio C Hamano
2013-09-10 16:54 ` Brad King
2013-09-10 20:18 ` 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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqqob8dul99.fsf@gitster.dls.corp.google.com \
--to=gitster@pobox.com \
--cc=brad.king@kitware.com \
--cc=git@vger.kernel.org \
/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.