[PATCH] generaldelta: initialize basecache properly

Wojciech Lopata lopek at fb.com
Fri Sep 20 14:32:56 CDT 2013


http://pastebin.com/xV6H7ic3 - this scripts generates a regular repository and then pulls commits from it one by one to a generaldelta repository.

Size of 00manifest.d in regular repo was 156K, while with generaldelta it hit 808K.

In contrast size of 00manifest.d in a generaldelta repository that was created with 'hg clone --pull' was 156K as well, since bug was not revealed when pulling commits in big packets.

> -----Original Message-----
> From: mercurial-devel-bounces at selenic.com [mailto:mercurial-devel-
> bounces at selenic.com] On Behalf Of Wojciech Lopata
> Sent: Friday, September 20, 2013 12:31 PM
> To: mercurial-devel at selenic.com
> Subject: [PATCH] generaldelta: initialize basecache properly
> 
> # HG changeset patch
> # User Wojciech Lopata <lopek at fb.com>
> # Date 1379699151 25200
> #      Fri Sep 20 10:45:51 2013 -0700
> # Node ID e3bf4ac814f13279287e28742f816856bba178ff
> # Parent  1c62f9487e46a467aace39316459a5be57c55e8a
> generaldelta: initialize basecache properly
> 
> Previously basecache was incorrectly inicialized before add of first revision
> from a changegroup. Basecache value infuences when full revisions are
> stored in revlog (when using generaldelta). As a result it was possible to
> generate a generaldelta-revlog that could be bigger by arbitrary factor than
> its non-generaldelta equivalent.
> 
> diff --git a/mercurial/revlog.py b/mercurial/revlog.py
> --- a/mercurial/revlog.py
> +++ b/mercurial/revlog.py
> @@ -200,7 +200,7 @@
>          self.datafile = indexfile[:-2] + ".d"
>          self.opener = opener
>          self._cache = None
> -        self._basecache = (0, 0)
> +        self._basecache = None
>          self._chunkcache = (0, '')
>          self.index = []
>          self._pcache = {}
> @@ -1131,6 +1131,8 @@
>          offset = self.end(prev)
>          flags = 0
>          d = None
> +        if self._basecache is None:
> +            self._basecache = (prev, self.chainbase(prev))
>          basecache = self._basecache
>          p1r, p2r = self.rev(p1), self.rev(p2)
> 
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel


More information about the Mercurial-devel mailing list