From: Ronnie Sahlberg <sahlberg@google.com>
To: git@vger.kernel.org
Cc: mhagger@alum.mit.edu, Ronnie Sahlberg <sahlberg@google.com>
Subject: [PATCH v7 00/42] Use ref transactions for all ref updates
Date: Wed, 14 May 2014 14:16:34 -0700 [thread overview]
Message-ID: <1400102236-30082-1-git-send-email-sahlberg@google.com> (raw)
This patch series can also be found at
https://github.com/rsahlberg/git/tree/ref-transactions
This patch series is based on next and expands on the transaction API. It
converts all ref updates, inside refs.c as well as external, to use the
transaction API for updates. This makes most of the ref updates to become
atomic when there are failures locking or writing to a ref.
This version completes the work to convert all ref updates to use transactions.
Now that all updates are through transactions I will start working on
cleaning up the reading of refs and to create an api for managing reflogs but
all that will go in a different patch series.
Version 7:
- Updated commit messages per JNs review comments.
- Changed REF_ISPRUNING and REF_ISPACKONLY to be private flags and not
exposed through refs.h
Version 6:
- Convert all updates in refs.c to use transactions too.
Version 5:
- Reword commit messages for having _create/_delete/_update returning
success/failure. There are no conditions yet that return an error from
these failures but there will be in the future. So we still check the
return from these functions in the callers in preparation for this.
- Don't leak memory by just passing a strbuf_detach() pointer to functions.
Use <obj>.buf and explicitely strbuf_release the data afterwards.
- Remove the function update_ref_lock.
- Remove the function update_ref_write.
- Track transaction status and die(BUG:) if we call _create/_delete/_update/
_commit for a transaction that is not OPEN.
Version 4:
- Rename patch series from "Use ref transactions from most callers" to
"Use ref transactions for all ref updates".
- Convert all external ref writes to use transactions and make write_ref_sha1
and lock_ref_sha1 static functions.
- Change the ref commit and free handling so we no longer pass pointer to
pointer to _commit. _commit no longer frees the transaction. The caller
MUST call _free itself.
- Change _commit to take a strbuf pointer instead of a char* for error
reporting back to the caller.
- Re-add the walker patch after fixing it.
Version 3:
- Remove the walker patch for now. Walker needs more complex solution
so defer it until the basics are done.
- Remove the onerr argument to ref_transaction_commit(). All callers
that need to die() on error now have to do this explicitely.
- Pass an error string from ref_transaction_commit() back to the callers
so that they can craft a nice error message upon failures.
- Make ref_transaction_rollback() accept NULL as argument.
- Change ref_transaction_commit() to take a pointer to pointer argument for
the transaction and have it clear the callers pointer to NULL when
invoked. This allows for much nicer handling of transaction rollback on
failure.
Version 2:
- Add a patch to ref_transaction_commit to make it honor onerr even if the
error triggered in ref_Transaction_commit itself rather than in a call
to other functions (that already honor onerr).
- Add a patch to make the update_ref() helper function use transactions
internally.
- Change ref_transaction_update to die() instead of error() if we pass
if a NULL old_sha1 but have have_old == true.
- Change ref_transaction_create to die() instead of error() if new_sha1
is false but we pass it a null_sha1.
- Change ref_transaction_delete die() instead of error() if we pass
if a NULL old_sha1 but have have_old == true.
- Change several places to do if(!transaction || ref_transaction_update()
|| ref_Transaction_commit()) die(generic-message) instead of checking each
step separately and having a different message for each failure.
Most users are likely not interested in what step of the transaction
failed and only whether it failed or not.
- Change commit.c to only pass a pointer to ref_transaction_update
iff current_head is non-NULL.
The previous patch used to compute a garbage pointer for
current_head->object.sha1 and relied on the fact that ref_transaction_update
would not try to dereference this pointer if !!current_head was 0.
- Updated commit message for the walker_fetch change to try to justify why
the change in locking semantics should not be harmful.
Ronnie Sahlberg (42):
refs.c: constify the sha arguments for
ref_transaction_create|delete|update
refs.c: allow passing NULL to ref_transaction_free
refs.c: add a strbuf argument to ref_transaction_commit for error
logging
refs.c: make ref_update_reject_duplicates take a strbuf argument for
errors
update-ref.c: log transaction error from the update_ref
refs.c: make update_ref_write update a strbuf on failure
refs.c: remove the onerr argument to ref_transaction_commit
refs.c: change ref_transaction_update() to do error checking and
return status
refs.c: change ref_transaction_create to do error checking and return
status
refs.c: ref_transaction_delete to check for error and return status
tag.c: use ref transactions when doing updates
replace.c: use the ref transaction functions for updates
commit.c: use ref transactions for updates
sequencer.c: use ref transactions for all ref updates
fast-import.c: change update_branch to use ref transactions
branch.c: use ref transaction for all ref updates
refs.c: change update_ref to use a transaction
refs.c: free the transaction before returning when number of updates
is 0
refs.c: ref_transaction_commit should not free the transaction
fetch.c: clear errno before calling functions that might set it
fetch.c: change s_update_ref to use a ref transaction
fetch.c: use a single ref transaction for all ref updates
receive-pack.c: use a reference transaction for updating the refs
fast-import.c: use a ref transaction when dumping tags
walker.c: use ref transaction for ref updates
refs.c: make write_ref_sha1 static
refs.c: make lock_ref_sha1 static
refs.c: add transaction.status and track OPEN/CLOSED/ERROR
refs.c: remove the update_ref_lock function
refs.c: remove the update_ref_write function
refs.c: remove lock_ref_sha1
refs.c: make prune_ref use a transaction to delete the ref
refs.c: make delete_ref use a transaction
refs.c: pass the ref log message to _create/delete/update instead of
_commit
refs.c: pass NULL as *flags to read_ref_full
refs.c: pack all refs before we start to rename a ref
refs.c: move the check for valid refname to lock_ref_sha1_basic
refs.c: call lock_ref_sha1_basic directly from commit
refs.c: add a new flag for transaction delete for refs we know are
packed only
refs.c: pass a skip list to name_conflict_fn
refs.c: make rename_ref use a transaction
refs.c: remove forward declaration of write_ref_sha1
branch.c | 31 ++--
builtin/commit.c | 24 ++-
builtin/fetch.c | 29 ++--
builtin/receive-pack.c | 20 +--
builtin/replace.c | 15 +-
builtin/tag.c | 15 +-
builtin/update-ref.c | 32 ++--
fast-import.c | 39 +++--
refs.c | 413 ++++++++++++++++++++++++++++---------------------
refs.h | 48 +++---
sequencer.c | 24 ++-
t/t3200-branch.sh | 2 +-
walker.c | 51 +++---
13 files changed, 422 insertions(+), 321 deletions(-)
--
2.0.0.rc3.471.g2055d11.dirty
next reply other threads:[~2014-05-14 21:21 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-05-14 21:16 Ronnie Sahlberg [this message]
2014-05-14 21:16 ` [PATCH v7 01/42] refs.c: constify the sha arguments for ref_transaction_create|delete|update Ronnie Sahlberg
2014-05-14 21:16 ` [PATCH v7 02/42] refs.c: allow passing NULL to ref_transaction_free Ronnie Sahlberg
2014-05-14 21:16 ` [PATCH v7 03/42] refs.c: add a strbuf argument to ref_transaction_commit for error logging Ronnie Sahlberg
2014-05-14 21:16 ` [PATCH v7 04/42] refs.c: make ref_update_reject_duplicates take a strbuf argument for errors Ronnie Sahlberg
2014-05-14 21:16 ` [PATCH v7 05/42] update-ref.c: log transaction error from the update_ref Ronnie Sahlberg
2014-05-14 21:16 ` [PATCH v7 06/42] refs.c: make update_ref_write update a strbuf on failure Ronnie Sahlberg
2014-05-14 21:16 ` [PATCH v7 07/42] refs.c: remove the onerr argument to ref_transaction_commit Ronnie Sahlberg
2014-05-14 21:16 ` [PATCH v7 08/42] refs.c: change ref_transaction_update() to do error checking and return status Ronnie Sahlberg
2014-05-14 21:16 ` [PATCH v7 09/42] refs.c: change ref_transaction_create " Ronnie Sahlberg
2014-05-14 21:16 ` [PATCH v7 10/42] refs.c: ref_transaction_delete to check for error " Ronnie Sahlberg
2014-05-14 21:16 ` [PATCH v7 11/42] tag.c: use ref transactions when doing updates Ronnie Sahlberg
2014-05-14 21:16 ` [PATCH v7 12/42] replace.c: use the ref transaction functions for updates Ronnie Sahlberg
2014-05-14 21:16 ` [PATCH v7 13/42] commit.c: use ref transactions " Ronnie Sahlberg
2014-05-14 21:16 ` [PATCH v7 14/42] sequencer.c: use ref transactions for all ref updates Ronnie Sahlberg
2014-05-14 21:16 ` [PATCH v7 15/42] fast-import.c: change update_branch to use ref transactions Ronnie Sahlberg
2014-05-14 21:16 ` [PATCH v7 16/42] branch.c: use ref transaction for all ref updates Ronnie Sahlberg
2014-05-14 21:16 ` [PATCH v7 17/42] refs.c: change update_ref to use a transaction Ronnie Sahlberg
2014-05-14 21:16 ` [PATCH v7 18/42] refs.c: free the transaction before returning when number of updates is 0 Ronnie Sahlberg
2014-05-14 21:16 ` [PATCH v7 19/42] refs.c: ref_transaction_commit should not free the transaction Ronnie Sahlberg
2014-05-14 21:16 ` [PATCH v7 20/42] fetch.c: clear errno before calling functions that might set it Ronnie Sahlberg
2014-05-14 21:16 ` [PATCH v7 21/42] fetch.c: change s_update_ref to use a ref transaction Ronnie Sahlberg
2014-05-14 21:16 ` [PATCH v7 22/42] fetch.c: use a single ref transaction for all ref updates Ronnie Sahlberg
2014-05-14 21:16 ` [PATCH v7 23/42] receive-pack.c: use a reference transaction for updating the refs Ronnie Sahlberg
2014-05-14 21:16 ` [PATCH v7 24/42] fast-import.c: use a ref transaction when dumping tags Ronnie Sahlberg
2014-05-14 21:16 ` [PATCH v7 25/42] walker.c: use ref transaction for ref updates Ronnie Sahlberg
2014-05-14 21:17 ` [PATCH v7 26/42] refs.c: make write_ref_sha1 static Ronnie Sahlberg
2014-05-14 21:17 ` [PATCH v7 27/42] refs.c: make lock_ref_sha1 static Ronnie Sahlberg
2014-05-14 21:17 ` [PATCH v7 28/42] refs.c: add transaction.status and track OPEN/CLOSED/ERROR Ronnie Sahlberg
2014-05-14 21:17 ` [PATCH v7 29/42] refs.c: remove the update_ref_lock function Ronnie Sahlberg
2014-05-14 21:17 ` [PATCH v7 30/42] refs.c: remove the update_ref_write function Ronnie Sahlberg
2014-05-14 21:17 ` [PATCH v7 31/42] refs.c: remove lock_ref_sha1 Ronnie Sahlberg
2014-05-14 21:17 ` [PATCH v7 32/42] refs.c: make prune_ref use a transaction to delete the ref Ronnie Sahlberg
2014-05-14 21:17 ` [PATCH v7 33/42] refs.c: make delete_ref use a transaction Ronnie Sahlberg
2014-05-14 21:17 ` [PATCH v7 34/42] refs.c: pass the ref log message to _create/delete/update instead of _commit Ronnie Sahlberg
2014-05-14 21:17 ` [PATCH v7 35/42] refs.c: pass NULL as *flags to read_ref_full Ronnie Sahlberg
2014-05-14 21:17 ` [PATCH v7 36/42] refs.c: pack all refs before we start to rename a ref Ronnie Sahlberg
2014-05-14 21:17 ` [PATCH v7 37/42] refs.c: move the check for valid refname to lock_ref_sha1_basic Ronnie Sahlberg
2014-05-14 21:17 ` [PATCH v7 38/42] refs.c: call lock_ref_sha1_basic directly from commit Ronnie Sahlberg
2014-05-14 21:17 ` [PATCH v7 39/42] refs.c: add a new flag for transaction delete for refs we know are packed only Ronnie Sahlberg
2014-05-14 21:17 ` [PATCH v7 40/42] refs.c: pass a skip list to name_conflict_fn Ronnie Sahlberg
2014-05-14 21:17 ` [PATCH v7 41/42] refs.c: make rename_ref use a transaction Ronnie Sahlberg
2014-05-14 21:17 ` [PATCH v7 42/42] refs.c: remove forward declaration of write_ref_sha1 Ronnie Sahlberg
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=1400102236-30082-1-git-send-email-sahlberg@google.com \
--to=sahlberg@google.com \
--cc=git@vger.kernel.org \
--cc=mhagger@alum.mit.edu \
/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).