From: Michael Haggerty <mhagger@alum.mit.edu>
To: Stefan Beller <sbeller@google.com>, Jonathan Nieder <jrnieder@gmail.com>
Cc: ronniesahlberg@gmail.com, gitster@pobox.com, git@vger.kernel.org
Subject: Re: [PATCHv3 00/13] the refs-transactions-reflog series
Date: Thu, 04 Dec 2014 22:13:38 +0100 [thread overview]
Message-ID: <5480CE82.9000408@alum.mit.edu> (raw)
In-Reply-To: <20141204183231.GA2649@google.com>
On 12/04/2014 07:32 PM, Stefan Beller wrote:
> On Thu, Dec 04, 2014 at 10:14:04AM -0800, Jonathan Nieder wrote:
>> Michael Haggerty wrote:
>>
>>> I am still unhappy with the approach of this series, for the reasons
>>> that I explained earlier [1]. In short, I think that the abstraction
>>> level is wrong. In my opinion, consumers of the refs API should barely
>>> even have to *know* about reflogs, let alone implement reflog expiration
>>> themselves.
>>
> Ok, what is a consumer for you? In my understanding the builtin/reflog.c is
> a consumer of the refs API, so there we want to see clean code just telling the
> refs backend to do its thing.
>
> I think Jonathan made a good point by saying our patch series have
> different goals.
>
> So I really like the code, which leads to
>
> reflog_expiry_prepare(refname, sha1, cb.policy_cb);
> for_each_reflog_ent(refname, expire_reflog_ent, &cb);
> reflog_expiry_cleanup(cb.policy_cb);
>
> but look at the surrounding code:
>
> if (!(flags & EXPIRE_REFLOGS_DRY_RUN)) {
> if (hold_lock_file_for_update(&reflog_lock, log_file, 0) < 0)
> ...
> }
>
>
> if (!(flags & EXPIRE_REFLOGS_DRY_RUN)) {
> if (close_lock_file(&reflog_lock)) {
> ...
> }
> }
>
> That part should also go into the refs.c backend, so in the expire_reflog
> function you can just write:
>
> transaction_begin(...) // This does all the hold_lock_file_for_update magic
> // lines 457-464 in mhagger/reflog-expire-api
>
> reflog_expiry_prepare(refname, sha1, cb.policy_cb);
> for_each_reflog_ent(refname, expire_reflog_ent, &cb);
> reflog_expiry_cleanup(cb.policy_cb);
>
> transaction_commit(...) // This does all the close_lock_file/rename/write_in_full
> // lines 470-488 in mhagger/reflog-expire-api
I'm pleasantly surprised that you guys have already looked at my work in
progress. I wish I had had more time earlier today to explain what is
still to be done:
The whole point of all of the refactoring is to move expire_reflog()
(and supporting functions like expire_reflog_ent()) to refs.c. The
"surrounding code" that you mention above would be moved there and would
*not* need to be done by callers.
expire_reflog() will gain three callback function pointers as
parameters. The caller (in this case reflog.c) will pass pointers to
reflog_expiry_prepare(), reflog_expiry_cleanup(), and
should_expire_reflog_ent() into expire_reflog().
There is no need to wrap the code in a transaction, because the
"surrounding code" that you mentioned implements all the "transaction"
that is needed! There is no need to complicated the *ref_transaction*
interface to allow arbitrary reflog updates when all we need is this one
very special case, plus of course the reflog appends that (I claim)
should happen implicitly whenever a reference is updated [1].
>> So *both* are making good changes, with different goals.
>
> If you want to I can rebase the reflog series on top of yours to show
> they can work together quite nicely.
Feel free to do what you want, but I really don't think we will ever
need transactions to handle generic reflog updates.
Meanwhile I'll try to get my series finished, including API docs as
Jonathan requested. I hope the code will be more convincing than my
prose :-)
Michael
[1] Of course, only for references that have reflogs enabled.
--
Michael Haggerty
mhagger@alum.mit.edu
next prev parent reply other threads:[~2014-12-04 21:13 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-12-04 8:29 [PATCHv3 00/13] the refs-transactions-reflog series Stefan Beller
2014-12-04 8:29 ` [PATCH 01/13] refs.c: make ref_transaction_create a wrapper for ref_transaction_update Stefan Beller
2014-12-04 8:29 ` [PATCH 02/13] refs.c: make ref_transaction_delete " Stefan Beller
2014-12-04 8:29 ` [PATCH 03/13] refs.c: add a function to append a reflog entry to a fd Stefan Beller
2014-12-04 8:29 ` [PATCH 04/13] refs.c: rename the transaction functions Stefan Beller
2014-12-04 8:29 ` [PATCH 05/13] refs.c: rename transaction.updates to transaction.ref_updates Stefan Beller
2014-12-04 8:29 ` [PATCH 06/13] refs.c: add a transaction function to truncate or append a reflog entry Stefan Beller
2014-12-04 8:29 ` [PATCH 07/13] reflog.c: use a reflog transaction when writing during expire Stefan Beller
2014-12-04 8:29 ` [PATCH 08/13] refs.c: rename log_ref_setup to create_reflog Stefan Beller
2014-12-04 8:29 ` [PATCH 09/13] refs.c: remove unlock_ref/close_ref/commit_ref from the refs api Stefan Beller
2014-12-04 8:29 ` [PATCH 10/13] refs.c: remove lock_any_ref_for_update Stefan Beller
2014-12-04 8:29 ` [PATCH 11/13] refs.c: don't expose the internal struct ref_lock in the header file Stefan Beller
2014-12-04 8:29 ` [PATCH 12/13] refs.c: use a bit for ref_update have_old Stefan Beller
2014-12-04 16:10 ` Torsten Bögershausen
2014-12-04 17:00 ` Andreas Schwab
2014-12-04 8:29 ` [PATCH 13/13] refs.c: allow deleting refs with a broken sha1 Stefan Beller
2014-12-04 17:10 ` [PATCHv3 00/13] the refs-transactions-reflog series Michael Haggerty
2014-12-04 17:53 ` Jonathan Nieder
2014-12-04 18:14 ` Jonathan Nieder
2014-12-04 18:32 ` Stefan Beller
2014-12-04 21:13 ` Michael Haggerty [this message]
2014-12-04 18:37 ` Junio C Hamano
2014-12-04 18:41 ` Junio C Hamano
2014-12-04 18:49 ` Stefan Beller
2014-12-04 19:27 ` 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=5480CE82.9000408@alum.mit.edu \
--to=mhagger@alum.mit.edu \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jrnieder@gmail.com \
--cc=ronniesahlberg@gmail.com \
--cc=sbeller@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 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.