Thread (82 messages) flat view 82 messages, 7 authors, 2016-06-15

Re: [PATCH v2 42/43] refs: add LMDB refs backend

From: Michael Haggerty <hidden>
Date: 2016-06-15 23:06:47

On 10/07/2015 03:51 AM, David Turner wrote:
On Mon, 2015-10-05 at 17:47 +0200, Michael Haggerty wrote:
quoted
On 09/29/2015 12:02 AM, David Turner wrote:
quoted
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.
[...]
quoted
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).
[...]
quoted
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
[...]
quoted
quoted
+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.
[...]
quoted
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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help