Re: [PATCH v20 23/48] refs.c: add transaction.status and track OPEN/CLOSED/ERROR
- From
Michael Haggerty <mhagger@alum.mit.edu>
- Date
- Jul 8, 2014, 12:00 UTC
- Message-ID
- <53BBDD4F.20403@alum.mit.edu>
- In-Reply-To
- <1403275409-28173-24-git-send-email-sahlberg@google.com>
On 06/20/2014 04:43 PM, Ronnie Sahlberg wrote:
> Track the status of a transaction in a new status field. Check the field for
The status field is not set or used anywhere. The field that you use is "state".
Show 44 quoted lines
> sanity, i.e. that status must be OPEN when _commit/_create/_delete or
> _update is called or else die(BUG:...)
>
> Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
> ---
> refs.c | 40 +++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 39 insertions(+), 1 deletion(-)
>
> diff --git a/refs.c b/refs.c
> index 9cb7908..8c695ba 100644
> --- a/refs.c
> +++ b/refs.c
> @@ -3387,6 +3387,25 @@ struct ref_update {
> };
>
> /*
> + * Transaction states.
> + * OPEN: The transaction is in a valid state and can accept new updates.
> + * An OPEN transaction can be committed.
> + * CLOSED: If an open transaction is successfully committed the state will
> + * change to CLOSED. No further changes can be made to a CLOSED
> + * transaction.
> + * CLOSED means that all updates have been successfully committed and
> + * the only thing that remains is to free the completed transaction.
> + * ERROR: The transaction has failed and is no longer committable.
> + * No further changes can be made to a CLOSED transaction and it must
> + * be rolled back using transaction_free.
> + */
> +enum ref_transaction_state {
> + REF_TRANSACTION_OPEN = 0,
> + REF_TRANSACTION_CLOSED = 1,
> + REF_TRANSACTION_ERROR = 2,
> +};
> +
> +/*
> * Data structure for holding a reference transaction, which can
> * consist of checks and updates to multiple references, carried out
> * as atomically as possible. This structure is opaque to callers.
> @@ -3395,6 +3414,8 @@ struct ref_transaction {
> struct ref_update **updates;
> size_t alloc;
> size_t nr;
> + enum ref_transaction_state state;
> + int status;The status field should probably be deleted.
Show 59 quoted lines
> };
>
> struct ref_transaction *ref_transaction_begin(struct strbuf *err)
> @@ -3437,6 +3458,9 @@ int ref_transaction_update(struct ref_transaction *transaction,
> {
> struct ref_update *update;
>
> + if (transaction->state != REF_TRANSACTION_OPEN)
> + die("BUG: update called for transaction that is not open");
> +
> if (have_old && !old_sha1)
> die("BUG: have_old is true but old_sha1 is NULL");
>
> @@ -3457,6 +3481,9 @@ int ref_transaction_create(struct ref_transaction *transaction,
> {
> struct ref_update *update;
>
> + if (transaction->state != REF_TRANSACTION_OPEN)
> + die("BUG: create called for transaction that is not open");
> +
> if (!new_sha1 || is_null_sha1(new_sha1))
> die("BUG: create ref with null new_sha1");
>
> @@ -3477,6 +3504,9 @@ int ref_transaction_delete(struct ref_transaction *transaction,
> {
> struct ref_update *update;
>
> + if (transaction->state != REF_TRANSACTION_OPEN)
> + die("BUG: delete called for transaction that is not open");
> +
> if (have_old && !old_sha1)
> die("BUG: have_old is true but old_sha1 is NULL");
>
> @@ -3532,8 +3562,13 @@ int ref_transaction_commit(struct ref_transaction *transaction,
> int n = transaction->nr;
> struct ref_update **updates = transaction->updates;
>
> - if (!n)
> + if (transaction->state != REF_TRANSACTION_OPEN)
> + die("BUG: commit called for transaction that is not open");
> +
> + if (!n) {
> + transaction->state = REF_TRANSACTION_CLOSED;
> return 0;
> + }
>
> /* Allocate work space */
> delnames = xmalloc(sizeof(*delnames) * n);
> @@ -3595,6 +3630,9 @@ int ref_transaction_commit(struct ref_transaction *transaction,
> clear_loose_ref_cache(&ref_cache);
>
> cleanup:
> + transaction->state = ret ? REF_TRANSACTION_ERROR
> + : REF_TRANSACTION_CLOSED;
> +
> for (i = 0; i < n; i++)
> if (updates[i]->lock)
> unlock_ref(updates[i]->lock);
> -- Michael Haggerty mhagger@alum.mit.edu http://softwareswirl.blogspot.com/