view tests/test-fastannotate-protocol.t @ 44988:fa151f7af275

phases: improve performance of _retractboundary The old version repeatedly converts nodes to revisions, which is a moderately expensive operation. Mapping all new changes once to revisions and back at the end reduces the time spend in _retractboundary during the unbundling of NetBSD's src from 67s to 17s. Differential Revision: https://phab.mercurial-scm.org/D8641
author Joerg Sonnenberger <joerg@bec.de>
date Thu, 18 Jun 2020 22:23:22 +0200
parents 7116fc614cfc
children 9c4204b7f3e4
line wrap: on
line source

  $ cat >> $HGRCPATH << EOF
  > [ui]
  > ssh = "$PYTHON" "$TESTDIR/dummyssh"
  > [extensions]
  > fastannotate=
  > [fastannotate]
  > mainbranch=@
  > EOF

setup the server repo

  $ hg init repo-server
  $ cd repo-server
  $ cat >> .hg/hgrc << EOF
  > [fastannotate]
  > server=1
  > EOF
  $ for i in 1 2 3 4; do
  >   echo $i >> a
  >   hg commit -A -m $i a
  > done
  $ [ -d .hg/fastannotate ]
  [1]
  $ hg bookmark @
  $ cd ..

setup the local repo

  $ hg clone 'ssh://user@dummy/repo-server' repo-local -q
  $ cd repo-local
  $ cat >> .hg/hgrc << EOF
  > [fastannotate]
  > client=1
  > clientfetchthreshold=0
  > EOF
  $ [ -d .hg/fastannotate ]
  [1]
  $ hg fastannotate a --debug
  running * (glob)
  sending hello command
  sending between command
  remote: * (glob) (?)
  remote: capabilities: * (glob)
  remote: * (glob) (?)
  sending protocaps command
  fastannotate: requesting 1 files
  sending getannotate command
  fastannotate: writing 112 bytes to fastannotate/default/a.l
  fastannotate: writing 94 bytes to fastannotate/default/a.m
  fastannotate: a: using fast path (resolved fctx: True)
  0: 1
  1: 2
  2: 3
  3: 4

the cache could be reused and no download is necessary

  $ hg fastannotate a --debug
  fastannotate: a: using fast path (resolved fctx: True)
  0: 1
  1: 2
  2: 3
  3: 4

if the client agrees where the head of the master branch is, no re-download
happens even if the client has more commits

  $ echo 5 >> a
  $ hg commit -m 5
  $ hg bookmark -r 3 @ -f
  $ hg fastannotate a --debug
  0: 1
  1: 2
  2: 3
  3: 4
  4: 5

if the client has a different "@" (head of the master branch) and "@" is ahead
of the server, the server can detect things are unchanged and does not return
full contents (not that there is no "writing ... to fastannotate"), but the
client can also build things up on its own (causing diverge)

  $ hg bookmark -r 4 @ -f
  $ hg fastannotate a --debug
  running * (glob)
  sending hello command
  sending between command
  remote: * (glob) (?)
  remote: capabilities: * (glob)
  remote: * (glob) (?)
  sending protocaps command
  fastannotate: requesting 1 files
  sending getannotate command
  fastannotate: a: 1 new changesets in the main branch
  0: 1
  1: 2
  2: 3
  3: 4
  4: 5

if the client has a different "@" which is behind the server. no download is
necessary

  $ hg fastannotate a --debug --config fastannotate.mainbranch=2
  fastannotate: a: using fast path (resolved fctx: True)
  0: 1
  1: 2
  2: 3
  3: 4
  4: 5

define fastannotate on-disk paths

  $ p1=.hg/fastannotate/default
  $ p2=../repo-server/.hg/fastannotate/default

revert bookmark change so the client is behind the server

  $ hg bookmark -r 2 @ -f

in the "fctx" mode with the "annotate" command, the client also downloads the
cache. but not in the (default) "fastannotate" mode.

  $ rm $p1/a.l $p1/a.m
  $ hg annotate a --debug | grep 'fastannotate: writing'
  [1]
  $ hg annotate a --config fastannotate.modes=fctx --debug | grep 'fastannotate: writing' | sort
  fastannotate: writing 112 bytes to fastannotate/default/a.l
  fastannotate: writing 94 bytes to fastannotate/default/a.m

the fastannotate cache (built server-side, downloaded client-side) in two repos
have the same content (because the client downloads from the server)

  $ diff $p1/a.l $p2/a.l
  $ diff $p1/a.m $p2/a.m

in the "fctx" mode, the client could also build the cache locally

  $ hg annotate a --config fastannotate.modes=fctx --debug --config fastannotate.mainbranch=4 | grep fastannotate
  fastannotate: requesting 1 files
  fastannotate: a: 1 new changesets in the main branch

the server would rebuild broken cache automatically

  $ cp $p2/a.m $p2/a.m.bak
  $ echo BROKEN1 > $p1/a.m
  $ echo BROKEN2 > $p2/a.m
  $ hg fastannotate a --debug | grep 'fastannotate: writing' | sort
  fastannotate: writing 112 bytes to fastannotate/default/a.l
  fastannotate: writing 94 bytes to fastannotate/default/a.m
  $ diff $p1/a.m $p2/a.m
  $ diff $p2/a.m $p2/a.m.bak

use the "debugbuildannotatecache" command to build annotate cache

  $ rm -rf $p1 $p2
  $ hg --cwd ../repo-server debugbuildannotatecache a --debug
  fastannotate: a: 4 new changesets in the main branch
  $ hg --cwd ../repo-local debugbuildannotatecache a --debug
  running * (glob)
  sending hello command
  sending between command
  remote: * (glob) (?)
  remote: capabilities: * (glob)
  remote: * (glob) (?)
  sending protocaps command
  fastannotate: requesting 1 files
  sending getannotate command
  fastannotate: writing * (glob)
  fastannotate: writing * (glob)
  $ diff $p1/a.l $p2/a.l
  $ diff $p1/a.m $p2/a.m

with the clientfetchthreshold config option, the client can build up the cache
without downloading from the server

  $ rm -rf $p1
  $ hg fastannotate a --debug --config fastannotate.clientfetchthreshold=10
  fastannotate: a: 3 new changesets in the main branch
  0: 1
  1: 2
  2: 3
  3: 4
  4: 5

if the fastannotate directory is not writable, the fctx mode still works

  $ rm -rf $p1
  $ touch $p1
  $ hg annotate a --debug --traceback --config fastannotate.modes=fctx
  fastannotate: a: cache broken and deleted
  fastannotate: prefetch failed: * (glob)
  fastannotate: a: cache broken and deleted
  fastannotate: falling back to the vanilla annotate: * (glob)
  0: 1
  1: 2
  2: 3
  3: 4
  4: 5

with serverbuildondemand=False, the server will not build anything

  $ cat >> ../repo-server/.hg/hgrc <<EOF
  > [fastannotate]
  > serverbuildondemand=False
  > EOF
  $ rm -rf $p1 $p2
  $ hg fastannotate a --debug | grep 'fastannotate: writing'
  [1]