git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 02/13] refs.c: use a single exit path from transaction commit and handle onerr

From
Ronnie Sahlberg <sahlberg@google.com>
Date
Apr 21, 2014, 22:53 UTC
Message-ID
<1398120811-20284-3-git-send-email-sahlberg@google.com>
In-Reply-To
<1398120811-20284-1-git-send-email-sahlberg@google.com>

Update ref_transaction_commit to have a single exit path and process onerr if an error occured during hte commit. This does mean that in case of an error occuring for UPDATE_REFS_MSG_ON_ERR during the calls to update_ref_lock or update_ref_write we will log errors from both those functions as well as a generic message from ref_transaction_commit.

I thought a while to make the MSG_ON_ERR message in ref_transaction_commit conditional to only trigger if the error was not triggered by the two functions we call that also take onerr, and which would already have logger an error already for this case, but the code would just look too awful. I think it is acceptable to log two error messages for those two cases than to badify the commit code.

Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
---
 refs.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/refs.c b/refs.c
index 138ab70..9daf89e 100644
--- a/refs.c
+++ b/refs.c
@@ -3414,12 +3414,12 @@ int ref_transaction_commit(struct ref_transaction *transaction,
 			   const char *msg, enum action_on_err onerr)
 {
 	int ret = 0, delnum = 0, i;
-	const char **delnames;
+	const char **delnames = NULL;
 	int n = transaction->nr;
 	struct ref_update **updates = transaction->updates;
 
 	if (!n)
-		return 0;
+		goto cleanup;
 
 	/* Allocate work space */
 	delnames = xmalloc(sizeof(*delnames) * n);
@@ -3481,6 +3481,14 @@ cleanup:
 			unlock_ref(updates[i]->lock);
 	free(delnames);
 	ref_transaction_free(transaction);
+	if (ret) {
+		const char *str = "Cannot commit transaction.";
+		switch (onerr) {
+		case UPDATE_REFS_MSG_ON_ERR: error(str); break;
+		case UPDATE_REFS_DIE_ON_ERR: die(str); break;
+		case UPDATE_REFS_QUIET_ON_ERR: break;
+		}
+	}
 	return ret;
 }
 
-- 
1.9.1.515.g3b87021
Previous: Ronnie SahlbergNext: Junio C Hamano
Message 3 of 19 in “Use ref transactions from most callers”
  1. 00/13 Use ref transactions from most callersRonnie Sahlberg, Apr 21, 2014
  2. 01/13 refs.c: constify the sha arguments for ref_transaction_create|delete|updateRonnie Sahlberg, Apr 21, 2014
  3. 02/13 refs.c: use a single exit path from transaction commit and handle onerrRonnie Sahlberg, Apr 21, 2014
  4. Junio C HamanoApr 22, 2014
  5. Ronnie SahlbergApr 22, 2014
  6. Junio C HamanoApr 22, 2014
  7. 03/13 refs.c: change ref_transaction_update() to do error checking and return statusRonnie Sahlberg, Apr 21, 2014
  8. 04/13 refs.c: change ref_transaction_create to do error checking and return statusRonnie Sahlberg, Apr 21, 2014
  9. 05/13 refs.c: ref_transaction_delete to check for error and return statusRonnie Sahlberg, Apr 21, 2014
  10. 06/13 tag.c: use ref transactions when doing updatesRonnie Sahlberg, Apr 21, 2014
  11. 07/13 replace.c: use the ref transaction functions for updatesRonnie Sahlberg, Apr 21, 2014
  12. 08/13 commit.c: use ref transactions for updatesRonnie Sahlberg, Apr 21, 2014
  13. 09/13 sequencer.c: use ref transactions for all ref updatesRonnie Sahlberg, Apr 21, 2014
  14. 10/13 fast-import.c: change update_branch to use ref transactionsRonnie Sahlberg, Apr 21, 2014
  15. 11/13 branch.c: use ref transaction for all ref updatesRonnie Sahlberg, Apr 21, 2014
  16. 12/13 walker.c: use ref transaction for ref updatesRonnie Sahlberg, Apr 21, 2014
  17. 13/13 refs.c: change update_ref to use a transactionRonnie Sahlberg, Apr 21, 2014
  18. Junio C HamanoApr 22, 2014
  19. Ronnie SahlbergApr 22, 2014

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.