Re: [RFC] On watchman support
- From
Jeff King <peff@peff.net>
- Date
- Nov 19, 2014, 01:46 UTC
- Message-ID
- <20141119014600.GA2337@peff.net>
- In-Reply-To
- <xmqqwq6std27.fsf@gitster.dls.corp.google.com>
On Tue, Nov 18, 2014 at 01:26:56PM -0800, Junio C Hamano wrote:
Show 5 quoted lines
> It is not check_refname_format() that is the real problem. It's the > fact that we do O(# of refs) work whenever we have to access the > packed-refs file. check_refname_format() is part of that, surely, > but so is reading the file, creating all of the refname structs in > memory, etc. (credit to peff@).
Yeah, I'd agree very much with that. I am not sure if I am cc'd here because of my general complaining about packed-refs, or if I have said something clever on the subject.
I did implement at one point a packed-refs reader that does a binary search on the mmap'd packed-refs file, and can return a single value or even locate the first entry matching a prefix (like "refs/tags/") and iterate until we're out of the prefix. Unfortunately this runs very contrary to the caching design of the refs.c code. It is focused on caching _loose_ refs, where we may read an outer directory (like "refs/"), and would like to avoid descending into an inner directory (likes "refs/foo/") unless we are interested in what is in it. But caching partial reads of packed-refs like this is "inside out"; we might read all of "refs/tags/*", but have no clue what else is in "refs/". So integrating it into refs.c would take pretty major surgery.
-Peff