From: Duy Nguyen <pclouds@gmail.com>
To: Junio C Hamano <gitster@pobox.com>
Cc: Ramsay Jones <ramsay@ramsay1.demon.co.uk>,
David Turner <dturner@twopensource.com>,
Git Mailing List <git@vger.kernel.org>,
David Turner <dturner@twitter.com>
Subject: Re: [PATCH v8 4/4] cache-tree: Write updated cache-tree after commit
Date: Tue, 15 Jul 2014 17:23:14 +0700 [thread overview]
Message-ID: <20140715102314.GA8273@lanh> (raw)
In-Reply-To: <CAPc5daVH=i72Y4dA8TefPLfFB79Cvw7STPnQf_f10cBeYbg2ug@mail.gmail.com>
On Mon, Jul 14, 2014 at 11:38:06PM -0700, Junio C Hamano wrote:
> On Mon, Jul 14, 2014 at 7:15 PM, Duy Nguyen <pclouds@gmail.com> wrote:
> >
> > It makes me wonder if a cleaner way of rebuilding cache-treei in this
> > case is from git-add--interactive.perl, or by simply spawn "git
> > update-index --rebuild-cache-tree" after running
> > git-add--interactive.perl.
>
> We could check if the cache-tree has fully been populated by
> "add -i" and limit the rebuilding by "git commit -p" main process,
> but if "add -i" did not do so, there is no reason why "git commit -p"
> should not do so, without relying on the implementation of "add -i"
> to do so.
>
> At least to me, what you suggested sounds nothing more than
> a cop-out; instead of lifting the limitation of the API by enhancing
> it with reopen-lock-file, punting to shift the burden elsewhere. I
> am not quite sure why that is cleaner, but perhaps I am missing
> something.
Reopen-lock-file to me does not sound like an enhancement, at least in
the index update context. We have always updated the index by writing
to a new file, then rename. Now if the new write_locked_index() blows
up after reopen_lock_file(), we have no way but die() because
index_lock.filename can no longer be trusted.
Doing it in a separate process keeps the tradition. And if the second
write fails, we still have good index_lock.filename. We could also do
the same here with something like this without new process (lightly
tested):
-- 8< --
diff --git a/builtin/commit.c b/builtin/commit.c
index 606c890..c2b4875 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -340,6 +340,18 @@ static char *prepare_index(int argc, const char **argv, const char *prefix,
discard_cache();
read_cache_from(index_lock.filename);
+ if (update_main_cache_tree(WRITE_TREE_SILENT) == 0) {
+ static struct lock_file second_index_lock;
+ hold_lock_file_for_update(&second_index_lock,
+ index_lock.filename,
+ LOCK_DIE_ON_ERROR);
+ if (write_locked_index(&the_index, &second_index_lock,
+ COMMIT_LOCK)) {
+ warning(_("Failed to update main cache tree"));
+ rollback_lock_file(&second_index_lock);
+ }
+ } else
+ warning(_("Failed to update main cache tree"));
commit_style = COMMIT_NORMAL;
return index_lock.filename;
-- 8< --
I was worried about the dependency between second_index_lock and
index_lock, but at cleanup, all we do is rollback, which is safe
regardless of dependencies. Just need to make sure we commit
second_index_lock before index_lock.
> In the longer run, it would be plausible that somebody would want
> to rewrite "git-add -i" and will make it just a C API call away without
> having to spawn a separate process. You cannot punt by saying
> "make 'add -i' responsible for it" at that point; you will be doing
> what 'add -i' would be doing yourself, no?
Yes, but at current rewrite rate I'd bet it won't happen in the next
two years at least.
--
Duy
next prev parent reply other threads:[~2014-07-15 10:23 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-12 4:44 [PATCH v8 1/4] cache-tree: Create/update cache-tree on checkout David Turner
2014-07-12 4:44 ` [PATCH v8 2/4] test-dump-cache-tree: invalid trees are not errors David Turner
2014-07-12 4:44 ` [PATCH v8 3/4] cache-tree: subdirectory tests David Turner
2014-07-12 4:44 ` [PATCH v8 4/4] cache-tree: Write updated cache-tree after commit David Turner
2014-07-13 5:09 ` Duy Nguyen
2014-07-14 15:54 ` Junio C Hamano
2014-07-14 17:33 ` Ramsay Jones
2014-07-14 17:51 ` Junio C Hamano
2014-07-14 18:41 ` Ramsay Jones
2014-07-14 22:16 ` Junio C Hamano
2014-07-14 22:32 ` David Turner
2014-07-15 2:15 ` Duy Nguyen
2014-07-15 6:38 ` Junio C Hamano
2014-07-15 10:23 ` Duy Nguyen [this message]
2014-07-15 16:45 ` Junio C Hamano
2014-07-16 10:18 ` Duy Nguyen
2014-07-16 17:33 ` Junio C Hamano
2014-07-14 17:43 ` Junio C Hamano
2014-07-14 20:19 ` [PATCH v2] lockfile: allow reopening a closed but still locked file Junio C Hamano
2014-08-31 12:07 ` [PATCH v8 1/4] cache-tree: Create/update cache-tree on checkou John Keeping
2014-09-01 20:49 ` David Turner
2014-09-01 22:13 ` John Keeping
2014-09-02 20:52 ` Junio C Hamano
2014-09-02 21:10 ` Junio C Hamano
2014-09-02 21:24 ` [PATCH] cache-tree: propagate invalidation up when punting Junio C Hamano
2014-09-02 22:39 ` [PATCH v2] cache-tree: do not try to use an invalidated subtree info to build a tree Junio C Hamano
2014-09-03 2:56 ` David Turner
2014-09-03 12:02 ` Eric Sunshine
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=20140715102314.GA8273@lanh \
--to=pclouds@gmail.com \
--cc=dturner@twitter.com \
--cc=dturner@twopensource.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=ramsay@ramsay1.demon.co.uk \
/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).