git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jonathan Nieder <jrnieder@gmail.com>
To: Ronnie Sahlberg <sahlberg@google.com>
Cc: "git@vger.kernel.org" <git@vger.kernel.org>,
	Michael Haggerty <mhagger@alum.mit.edu>
Subject: Re: [PATCH v11 13/41] refs.c: change ref_transaction_create to do error checking and return status
Date: Wed, 28 May 2014 10:07:00 -0700	[thread overview]
Message-ID: <20140528170700.GM12314@google.com> (raw)
In-Reply-To: <CAL=YDWkQhq2oCkyBG0-ojUDwgApYj1qZt1vXa2gnYsJOEbnvxQ@mail.gmail.com>

Ronnie Sahlberg wrote:

> Updated the comment in refs.h

Thanks.

> +++ b/refs.h
> @@ -215,6 +215,31 @@ enum action_on_err {
>  };
>  
>  /*
> + * On error, transaction functions append a message about what
> + * went wrong to the 'err' argument.  The message mentions what
> + * ref was being updated (if any) when the error occurred so it
> + * can be passed to 'die' or 'error' as-is:
> + *
> + *     if (ref_transaction_update(..., &err)) {
> + *         ret = error("%s", err.buf);
> + *         goto cleanup;
> + *     }
> + *
> + * The message is appended to err without first clearing err.
> + * This allow shte caller to prepare preamble text to the generated

s/allow shte/allows the/

> + * error message:
> + *
> + *     strbuf_addf(&err, "Error while doing foo-bar: ");
> + *     if (ref_transaction_update(..., &err)) {
> + *         ret = error("%s", err.buf);
> + *         goto cleanup;
> + *     }

Nice.

> + *
> + * If the caller wants err to only contain the message for the current error
> + * and nothing else caller will need to guarantee that err is empty or
> + * call strbuf_reset before calling the transaction function.

I don't think this paragraph is needed --- especially with the
clarification about how to add a preamble, the contract is clear.

> + */
> +/*
>   * Begin a reference transaction.  The reference transaction must
>   * be freed by calling ref_transaction_free().
>   */

Now that the comment is longer, it's harder to miss, but it still is
in an odd place for someone looking to understand what the 'err'
argument to ref_transaction_update() means.

How about this patch for squashing in?

diff --git i/refs.h w/refs.h
index c741a6c..913ca93 100644
--- i/refs.h
+++ w/refs.h
@@ -10,6 +10,45 @@ struct ref_lock {
 	int force_write;
 };
 
+/*
+ * A ref_transaction represents a collection of ref updates
+ * that should succeed or fail together.
+ *
+ * Calling sequence
+ * ----------------
+ * - Allocate and initialize a `struct ref_transaction` by calling
+ *   `ref_transaction_begin()`.
+ *
+ * - List intended ref updates by calling functions like
+ *   `ref_transaction_update()` and `ref_transaction_create()`.
+ *
+ * - Call `ref_transaction_commit()` to execute the transaction.
+ *   If this succeeds, the ref updates will have taken place and
+ *   the transaction cannot be rolled back.
+ *
+ * - At any time call `ref_transaction_free()` to discard the
+ *   transaction and free associated resources.  In particular,
+ *   this rolls back the transaction if it has not been
+ *   successfully committed.
+ *
+ * Error handling
+ * --------------
+ *
+ * On error, transaction functions append a message about what
+ * went wrong to the 'err' argument.  The message mentions what
+ * ref was being updated (if any) when the error occurred so it
+ * can be passed to 'die' or 'error' as-is.
+ *
+ * The message is appended to err without first clearing err.
+ * This allows the caller to prepare preamble text to the generated
+ * error message:
+ *
+ *     strbuf_addf(&err, "Error while doing foo-bar: ");
+ *     if (ref_transaction_update(..., &err)) {
+ *         ret = error("%s", err.buf);
+ *         goto cleanup;
+ *     }
+ */
 struct ref_transaction;
 
 /*
@@ -215,31 +254,6 @@ enum action_on_err {
 };
 
 /*
- * On error, transaction functions append a message about what
- * went wrong to the 'err' argument.  The message mentions what
- * ref was being updated (if any) when the error occurred so it
- * can be passed to 'die' or 'error' as-is:
- *
- *     if (ref_transaction_update(..., &err)) {
- *         ret = error("%s", err.buf);
- *         goto cleanup;
- *     }
- *
- * The message is appended to err without first clearing err.
- * This allow shte caller to prepare preamble text to the generated
- * error message:
- *
- *     strbuf_addf(&err, "Error while doing foo-bar: ");
- *     if (ref_transaction_update(..., &err)) {
- *         ret = error("%s", err.buf);
- *         goto cleanup;
- *     }
- *
- * If the caller wants err to only contain the message for the current error
- * and nothing else caller will need to guarantee that err is empty or
- * call strbuf_reset before calling the transaction function.
- */
-/*
  * Begin a reference transaction.  The reference transaction must
  * be freed by calling ref_transaction_free().
  */

  reply	other threads:[~2014-05-28 17:07 UTC|newest]

Thread overview: 89+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-27 20:25 [PATCH v11 00/41] Use ref transactions Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 01/41] refs.c: remove ref_transaction_rollback Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 02/41] refs.c: ref_transaction_commit should not free the transaction Ronnie Sahlberg
2014-05-27 23:20   ` Jonathan Nieder
2014-05-27 20:25 ` [PATCH v11 03/41] refs.c: constify the sha arguments for ref_transaction_create|delete|update Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 04/41] refs.c: allow passing NULL to ref_transaction_free Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 05/41] refs.c: add a strbuf argument to ref_transaction_commit for error logging Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 06/41] refs.c: add an err argument to repack_without_refs Ronnie Sahlberg
2014-05-28  0:11   ` Jonathan Nieder
2014-05-28 15:31     ` Ronnie Sahlberg
2014-05-28 18:30       ` Jonathan Nieder
2014-05-27 20:25 ` [PATCH v11 07/41] refs.c: make ref_update_reject_duplicates take a strbuf argument for errors Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 08/41] refs.c: add an err argument to delete_ref_loose Ronnie Sahlberg
2014-05-28  0:25   ` Jonathan Nieder
2014-05-28 14:43     ` Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 09/41] refs.c: make update_ref_write update a strbuf on failure Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 10/41] update-ref.c: log transaction error from the update_ref Ronnie Sahlberg
2014-05-28  0:27   ` Jonathan Nieder
2014-05-28 14:46     ` Ronnie Sahlberg
2014-05-28 16:49       ` Jonathan Nieder
2014-05-27 20:25 ` [PATCH v11 11/41] refs.c: remove the onerr argument to ref_transaction_commit Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 12/41] refs.c: change ref_transaction_update() to do error checking and return status Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 13/41] refs.c: change ref_transaction_create " Ronnie Sahlberg
2014-05-28  0:42   ` Jonathan Nieder
2014-05-28 14:55     ` Ronnie Sahlberg
2014-05-28 17:07       ` Jonathan Nieder [this message]
2014-05-28 17:15         ` Ronnie Sahlberg
2014-05-28 17:25           ` Jonathan Nieder
2014-05-28 18:01             ` Ronnie Sahlberg
2014-05-28 18:09               ` Jonathan Nieder
2014-05-27 20:25 ` [PATCH v11 14/41] refs.c: update ref_transaction_delete to check for error " Ronnie Sahlberg
2014-05-28 18:42   ` Jonathan Nieder
2014-05-27 20:25 ` [PATCH v11 15/41] refs.c: make ref_transaction_begin take an err argument Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 16/41] refs.c: add transaction.status and track OPEN/CLOSED/ERROR Ronnie Sahlberg
2014-05-28 18:51   ` Jonathan Nieder
2014-05-28 21:50     ` Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 17/41] tag.c: use ref transactions when doing updates Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 18/41] replace.c: use the ref transaction functions for updates Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 19/41] commit.c: use ref transactions " Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 20/41] sequencer.c: use ref transactions for all ref updates Ronnie Sahlberg
2014-05-28 18:53   ` Jonathan Nieder
2014-05-27 20:25 ` [PATCH v11 21/41] fast-import.c: change update_branch to use ref transactions Ronnie Sahlberg
2014-05-28 18:54   ` Jonathan Nieder
2014-05-27 20:25 ` [PATCH v11 22/41] branch.c: use ref transaction for all ref updates Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 23/41] refs.c: change update_ref to use a transaction Ronnie Sahlberg
2014-05-28 19:31   ` Jonathan Nieder
2014-05-28 21:14     ` Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 24/41] receive-pack.c: use a reference transaction for updating the refs Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 25/41] fast-import.c: use a ref transaction when dumping tags Ronnie Sahlberg
2014-05-28 19:47   ` Jonathan Nieder
2014-05-28 22:06     ` Ronnie Sahlberg
2014-05-28 22:17       ` Jonathan Nieder
2014-05-28 23:20         ` Ronnie Sahlberg
2014-05-28 23:39           ` Jonathan Nieder
2014-05-29 16:10             ` Ronnie Sahlberg
2014-05-29 17:41               ` Jonathan Nieder
2014-06-03 21:32                 ` Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 26/41] walker.c: use ref transaction for ref updates Ronnie Sahlberg
2014-05-28 19:56   ` Jonathan Nieder
2014-05-28 20:56     ` Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 27/41] refs.c: make lock_ref_sha1 static Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 28/41] refs.c: remove the update_ref_lock function Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 29/41] refs.c: remove the update_ref_write function Ronnie Sahlberg
2014-05-28 20:39   ` Jonathan Nieder
2014-05-27 20:25 ` [PATCH v11 30/41] refs.c: remove lock_ref_sha1 Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 31/41] refs.c: make prune_ref use a transaction to delete the ref Ronnie Sahlberg
2014-05-28 21:51   ` Jonathan Nieder
2014-05-28 21:56     ` Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 32/41] refs.c: make delete_ref use a transaction Ronnie Sahlberg
2014-05-30 17:28   ` Jonathan Nieder
2014-06-03 16:59     ` Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 33/41] refs.c: pass the ref log message to _create/delete/update instead of _commit Ronnie Sahlberg
2014-05-30 17:38   ` Jonathan Nieder
2014-06-03 17:01     ` Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 34/41] refs.c: pass NULL as *flags to read_ref_full Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 35/41] refs.c: pack all refs before we start to rename a ref Ronnie Sahlberg
2014-05-30 18:08   ` Jonathan Nieder
2014-06-03 16:39     ` Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 36/41] refs.c: move the check for valid refname to lock_ref_sha1_basic Ronnie Sahlberg
2014-05-30 18:12   ` Jonathan Nieder
2014-06-03 18:33     ` Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 37/41] refs.c: call lock_ref_sha1_basic directly from commit Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 38/41] refs.c: pass a skip list to name_conflict_fn Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 39/41] refs.c: propagate any errno==ENOTDIR from _commit back to the callers Ronnie Sahlberg
2014-05-31  0:22   ` Jonathan Nieder
2014-06-03 18:21     ` Ronnie Sahlberg
2014-05-27 20:25 ` [PATCH v11 40/41] fetch.c: change s_update_ref to use a ref transaction Ronnie Sahlberg
2014-05-27 20:26 ` [PATCH v11 41/41] refs.c: make write_ref_sha1 static Ronnie Sahlberg
2014-06-03 18:31 ` [PATCH v11 00/41] Use ref transactions Jonathan Nieder

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=20140528170700.GM12314@google.com \
    --to=jrnieder@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=mhagger@alum.mit.edu \
    --cc=sahlberg@google.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).