[PATCH 09 of 11] bundle2: use compressstream compression engine API

Pierre-Yves David pierre-yves.david at ens-lyon.org
Mon Nov 7 09:13:52 EST 2016



On 11/02/2016 01:08 AM, Gregory Szorc wrote:
> # HG changeset patch
> # User Gregory Szorc <gregory.szorc at gmail.com>
> # Date 1477160145 25200
> #      Sat Oct 22 11:15:45 2016 -0700
> # Node ID 03555032b7e3bc7192fd8bebf6af3f05b1e70516
> # Parent  1d4d111b644453acc4893478528a5f2ecd7ca023
> bundle2: use compressstream compression engine API
>
> Compression engines now have an API for compressing a stream of
> chunks. Switch to it and make low-level compression code disappear.

Do we get any performance benefit for this ? I know you have spend a lot 
of time tracking performance gain in bundle creation/application. And 
this likely have some effect.

Talking about performance, Philippe Pépiot have a patch to setup some 
official performance tracking tool, if you could help reviewing it we 
could include these operations to it and we would have an easy and 
standard way to get these number.

> diff --git a/mercurial/bundle2.py b/mercurial/bundle2.py
> --- a/mercurial/bundle2.py
> +++ b/mercurial/bundle2.py
> @@ -566,23 +566,18 @@ class bundle20(object):
>              self.ui.debug(''.join(msg))
>          outdebug(self.ui, 'start emission of %s stream' % self._magicstring)
>          yield self._magicstring
>          param = self._paramchunk()
>          outdebug(self.ui, 'bundle parameter: %s' % param)
>          yield _pack(_fstreamparamsize, len(param))
>          if param:
>              yield param
> -        # starting compression
> -        compressor = self._compengine.compressorobj()
> -        for chunk in self._getcorechunk():
> -            data = compressor.compress(chunk)
> -            if data:
> -                yield data
> -        yield compressor.flush()
> +        for chunk in self._compengine.compressstream(self._getcorechunk()):
> +            yield chunk
>
>      def _paramchunk(self):
>          """return a encoded version of all stream parameters"""
>          blocks = []
>          for par, value in self._params:
>              par = urlreq.quote(par)
>              if value is not None:
>                  value = urlreq.quote(value)
> @@ -1318,25 +1313,20 @@ def writebundle(ui, cg, filename, bundle
>          if cg.version != '01':
>              raise error.Abort(_('old bundle types only supports v1 '
>                                  'changegroups'))
>          header, comp = bundletypes[bundletype]
>          if comp not in util.compressionengines.supportedbundletypes:
>              raise error.Abort(_('unknown stream compression type: %s')
>                                % comp)
>          compengine = util.compressionengines.forbundletype(comp)
> -        compressor = compengine.compressorobj()
> -        subchunkiter = cg.getchunks()
>          def chunkiter():
>              yield header
> -            for chunk in subchunkiter:
> -                data = compressor.compress(chunk)
> -                if data:
> -                    yield data
> -            yield compressor.flush()
> +            for chunk in compengine.compressstream(cg.getchunks()):
> +                yield chunk
>          chunkiter = chunkiter()
>
>      # parse the changegroup data, otherwise we will block
>      # in case of sshrepo because we don't know the end of the stream
>      return changegroup.writechunks(ui, chunkiter, filename, vfs=vfs)
>
>  @parthandler('changegroup', ('version', 'nbchanges', 'treemanifest'))
>  def handlechangegroup(op, inpart):


-- 
Pierre-Yves David


More information about the Mercurial-devel mailing list