git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Michael Haggerty <mhagger@alum.mit.edu>
To: David Turner <dturner@twopensource.com>
Cc: git@vger.kernel.org
Subject: Re: [PATCH v2 42/43] refs: add LMDB refs backend
Date: Wed, 07 Oct 2015 20:31:08 +0200	[thread overview]
Message-ID: <561564EC.8070704@alum.mit.edu> (raw)
In-Reply-To: <1444182660.7739.77.camel@twopensource.com>

On 10/07/2015 03:51 AM, David Turner wrote:
> On Mon, 2015-10-05 at 17:47 +0200, Michael Haggerty wrote:
>> On 09/29/2015 12:02 AM, David Turner wrote:
>>> Add a database backend for refs using LMDB.  [...]
>>
>> I think you have said before that if one writer holds the write lock on
>> the DB, then other writers fail immediately. Is that correct? If so, is
>> that something that can be adjusted? I think it would be preferable for
>> the second writer to retry acquiring the write lock for a little while
>> with a timeout (as we now do when trying to acquire the packed-refs
>> lock). Otherwise you could have the unhappy situation that somebody
>> spends a long time pushing a packfile to a server, only to have the
>> reference update be rejected at the last moment due to a lock conflict
>> with another process that was touching completely different references.
>> We already do before/after consistency checks when updating references,
>> so you wouldn't even have to add such code in the backend yourself.
> 
> No, the second writer waits for the first writer to unlock (or for it to
> crash).

Cool, that's better behavior.

> [...]
>> Do you store "peeled" reference values for tags, as is done in
>> packed-refs? I think that is an important optimization.
> 
> No.  Do you happen to know in what situations this is a performance
> benefit, so that I can benchmark?  I suspect it would matter much less
> for the LMDB backend, because lookups are pretty quick.

The reference lookup speed is not relevant here. "Peeling" is applied to
references that point at tag objects (a.k.a. annotated tags). It means
that the tag object is looked up to see what *it* points at (recursively
if necessary) and the result is stored to the packed-refs file in a
specially-formatted extra line that looks like

    17f9f635c101aef03874e1de1d8d0322187494b3 refs/tags/v2.6.0
    ^be08dee9738eaaa0423885ed189c2b6ad8368cf0

I think a good command to benchmark would be `git show-refs -d` in a
repository with a number of annotated tags. This command's output is
similar to the output of `git ls-remote <remote>` and also comes up
during reference negotiation when fetching (so its performance is
definitely not moot).

> [...]
>> Currently we discard the reflog for a reference when the reference is
>> deleted. [...]
>> Have you thought about removing this limitation in the lbdb backend?
> 
> I'm going for feature parity first.  We can always add new functionality
> later.  This particular function would be pretty straightforward to add,
> I think.

+1

> [...]
>>> +The rsync and file:// transports don't work yet, because they
>>> +don't use the refs API.
>>
>> Do they fail gracefully?
> 
> Not particularly gracefully.
> 
> rsync: link_stat "/home/dturner/git/t/trash
> directory.t5510-fetch/.git/packed-refs" failed: No such file or
> directory (2)
> rsync error: some files/attrs were not transferred (see previous errors)
> (code 23) at main.c(1183) [sender=3.1.1]
> fatal: Could not run rsync to get refs
> -------------
> 
> The problem is that rsync on the client assumes that packed-refs exists.
> We could hack it to also check for refdb.

I guess this is something that will have to be improved sooner or later,
though I guess not as a precondition for merging this patch series.

> [...]
>> I'm somewhat surprised that you only register the lmdb backend if it is
>> used in the main repo. I would expect the backend to be registered
>> unconditionally on startup. The cost is trivial, isn't it?
> 
> Yeah, but this was the easiest place to do it.

OK.

> [...]

I'm really happy about your work.

Regarding strategy: I think a good approach would be to get as much of
the preparatory work as possible (the abstraction and separation of
refs-be-files) to the point where it can be merged before there is too
much more code churn in the area. That work is not very controversial, I
think, and letting it wait for a long time will increase the likelihood
of conflicts with other people's changes. The refs-be-lmdb patches, on
the other hand, (1) will take longer to get polished, (2) will take
longer to review because other people are not familiar with LDMB, and
(3) won't bitrot very fast anyway because they don't overlap as much
with areas that other people are likely to work on. So I would advocate
working on those at a more deliberate pace and planning for them to be
merged as a separate batch.

Michael

-- 
Michael Haggerty
mhagger@alum.mit.edu

  reply	other threads:[~2015-10-07 18:38 UTC|newest]

Thread overview: 90+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-28 22:01 [PATCH v2 00/43] lmdb ref backend David Turner
2015-09-28 22:01 ` [PATCH v2 01/43] refs.c: create a public version of verify_refname_available David Turner
2015-10-03  5:02   ` Torsten Bögershausen
2015-10-03 16:50     ` David Turner
2015-10-03 21:07       ` Torsten Bögershausen
2015-10-04  6:07       ` Torsten Bögershausen
2015-10-05  4:29   ` Michael Haggerty
2015-10-05 20:23     ` David Turner
2015-09-28 22:01 ` [PATCH v2 02/43] refs: make repack_without_refs and is_branch public David Turner
2015-10-05  4:34   ` Michael Haggerty
2015-10-05 20:26     ` David Turner
2015-09-28 22:01 ` [PATCH v2 03/43] refs-be-files.c: rename refs to refs-be-files David Turner
2015-09-28 22:01 ` [PATCH v2 04/43] refs.c: add a new refs.c file to hold all common refs code David Turner
2015-09-28 22:01 ` [PATCH v2 05/43] refs.c: move update_ref to refs.c David Turner
2015-09-28 22:01 ` [PATCH v2 06/43] refs.c: move delete_ref and delete_refs to the common code David Turner
2015-09-28 22:01 ` [PATCH v2 07/43] refs.c: move read_ref_at to the common refs file David Turner
2015-09-28 22:01 ` [PATCH v2 08/43] refs.c: move the hidden refs functions to the common code David Turner
2015-09-28 22:01 ` [PATCH v2 09/43] refs.c: move dwim and friend functions to the common refs code David Turner
2015-09-28 22:01 ` [PATCH v2 10/43] refs.c: move warn_if_dangling_symref* to the common code David Turner
2015-09-28 22:01 ` [PATCH v2 11/43] refs.c: move read_ref, read_ref_full and ref_exists " David Turner
2015-09-28 22:01 ` [PATCH v2 12/43] refs.c: move resolve_refdup to common David Turner
2015-09-28 22:01 ` [PATCH v2 13/43] refs.c: move check_refname_format to the common code David Turner
2015-09-28 22:01 ` [PATCH v2 14/43] refs.c: move is_branch " David Turner
2015-09-28 22:01 ` [PATCH v2 15/43] refs.c: move prettify_refname " David Turner
2015-09-28 22:01 ` [PATCH v2 16/43] refs.c: move ref iterators " David Turner
2015-09-28 22:01 ` [PATCH v2 17/43] refs.c: move head_ref_namespaced " David Turner
2015-09-28 22:01 ` [PATCH v2 18/43] refs-be-files.c: add a backend method structure with transaction functions David Turner
2015-10-05  8:03   ` Michael Haggerty
2015-10-05 17:25     ` Junio C Hamano
2015-10-06  0:20       ` David Turner
2015-09-28 22:01 ` [PATCH v2 19/43] refs-be-files.c: add methods for misc ref operations David Turner
2015-09-28 22:01 ` [PATCH v2 20/43] refs-be-files.c: add methods for the ref iterators David Turner
2015-09-28 22:01 ` [PATCH v2 21/43] refs-be-files.c: add method for for_each_reftype_ David Turner
2015-09-28 22:01 ` [PATCH v2 22/43] refs-be-files.c: add do_for_each_per_worktree_ref David Turner
2015-10-05  8:19   ` Michael Haggerty
2015-10-05 20:14     ` David Turner
2015-09-28 22:01 ` [PATCH v2 23/43] refs.c: move refname_is_safe to the common code David Turner
2015-09-28 22:01 ` [PATCH v2 24/43] refs.h: document make refname_is_safe and add it to header David Turner
2015-09-28 22:02 ` [PATCH v2 25/43] refs.c: move copy_msg to the common code David Turner
2015-09-28 22:02 ` [PATCH v2 26/43] refs.c: move peel_object " David Turner
2015-09-28 22:02 ` [PATCH v2 27/43] refs.c: move should_autocreate_reflog to " David Turner
2015-10-02 20:57   ` Junio C Hamano
2015-09-28 22:02 ` [PATCH v2 28/43] refs.c: add ref backend init function David Turner
2015-10-05  8:37   ` Michael Haggerty
2015-10-05 20:37     ` David Turner
2015-09-28 22:02 ` [PATCH v2 29/43] refs.c: add methods for reflog David Turner
2015-09-28 22:02 ` [PATCH v2 30/43] refs-be-files.c: add method to expire reflogs David Turner
2015-10-05  8:41   ` Michael Haggerty
2015-09-28 22:02 ` [PATCH v2 31/43] refs.c: add method for initial ref transaction commit David Turner
2015-09-28 22:02 ` [PATCH v2 32/43] initdb: move safe_create_dir into common code David Turner
2015-09-28 22:02 ` [PATCH v2 33/43] refs.c: add method for initializing refs db David Turner
2015-09-28 22:02 ` [PATCH v2 34/43] refs.c: make struct ref_transaction generic David Turner
2015-10-06 17:43   ` Michael Blume
2015-10-06 17:53     ` David Turner
2015-09-28 22:02 ` [PATCH v2 35/43] refs-be-files.c: add method to rename refs David Turner
2015-09-28 22:02 ` [PATCH v2 36/43] run-command: track total number of commands run David Turner
2015-09-28 22:02 ` [PATCH v2 37/43] refs: move some defines from refs-be-files.c to refs.h David Turner
2015-10-05  8:57   ` Michael Haggerty
2015-09-28 22:02 ` [PATCH v2 38/43] refs: make some files backend functions public David Turner
2015-10-05  9:03   ` Michael Haggerty
2015-10-06  1:24     ` David Turner
2015-10-07  1:25     ` David Turner
2015-10-07 16:00       ` Michael Haggerty
2015-10-07 17:20         ` Junio C Hamano
2015-10-07 20:55         ` David Turner
2015-10-07 22:47           ` Michael Haggerty
2015-09-28 22:02 ` [PATCH v2 39/43] refs: break out a ref conflict check David Turner
2015-10-05  9:06   ` Michael Haggerty
2015-10-06  0:28     ` David Turner
2015-09-28 22:02 ` [PATCH v2 40/43] refs: allow ref backend to be set for clone David Turner
2015-10-05  9:32   ` Michael Haggerty
2015-10-06  1:29     ` David Turner
2015-10-06  1:58       ` Jeff King
2015-10-06 18:09         ` David Turner
2015-10-12  9:00           ` Carlos Martín Nieto
2015-10-05 11:55   ` Michael Haggerty
2015-10-06  1:16     ` David Turner
2015-09-28 22:02 ` [PATCH v2 41/43] refs: add register_refs_backend David Turner
2015-09-28 22:02 ` [PATCH v2 42/43] refs: add LMDB refs backend David Turner
2015-10-02 21:35   ` Junio C Hamano
2015-10-05 15:47   ` Michael Haggerty
2015-10-07  1:51     ` David Turner
2015-10-07 18:31       ` Michael Haggerty [this message]
2015-10-07 19:08         ` Junio C Hamano
2015-10-07 19:20         ` David Turner
2015-10-07 22:13           ` Michael Haggerty
2015-09-28 22:02 ` [PATCH v2 43/43] refs: tests for db backend David Turner
2015-10-03 17:39   ` Dennis Kaarsemaker
2015-10-05 16:56     ` Junio C Hamano
2015-10-06  0:20       ` David Turner

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

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=561564EC.8070704@alum.mit.edu \
    --to=mhagger@alum.mit.edu \
    --cc=dturner@twopensource.com \
    --cc=git@vger.kernel.org \
    /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.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

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 read-only IMAP folder(s) and NNTP newsgroup(s).