Mercurial > hg
view tests/test-identify.t @ 47343:9f798c1b0d89 stable
cext: fix memory leak in phases computation
Without this a buffer whose size in bytes is the number of
changesets in the repository is leaked each time the repository is
opened and changeset phases are computed.
Impact: the current code in hgwebdir creates a new `localrepository`
instance for each HTTP request. Since any pull or push is made of several
requests, a team of 100 people can easily produce thousands of such
requests per day.
Being a low-level malloc, this leak can't be seen with the gc module and
tools relying on that, but was spotted by valgrind immediately.
Reproduction
------------
for i in range(cl_args.iterations):
repo = hg.repository(baseui, repo_path)
rev = repo.revs(rev).first()
ctx = repo[rev]
del ctx
del repo
# avoid any pollution by other type of leak
# (that should be fixed in 5.8)
repoview._filteredrepotypes.clear()
gc.collect()
Measurements
------------
Resident Set Size (RSS), taken on a clone of
mozilla-central for performance analysis (440 000
changesets).
before:
5.8+hg19.5ac0f2a8ba72 1000 iterations: 1606MB
5.8+hg19.5ac0f2a8ba72 10000 iterations: 5723MB
after:
5.8+hg20.e2084d39e145 1000 iterations: 555MB
5.8+hg20.e2084d39e145 10000 iterations: 555MB
(double checked, not a copy/paste error)
(e2084d39e14 is the present changeset, before amendment
of the message to add the measurements)
author | Georges Racinet <georges.racinet@octobus.net> |
---|---|
date | Sun, 06 Jun 2021 01:24:30 +0200 |
parents | 95c4cca641f6 |
children |
line wrap: on
line source
#require serve #if no-outer-repo no repo $ hg id abort: there is no Mercurial repository here (.hg not found) [10] #endif create repo $ hg init test $ cd test $ echo a > a $ hg ci -Ama adding a basic id usage $ hg id cb9a9f314b8b tip $ hg id --debug cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b tip $ hg id -q cb9a9f314b8b $ hg id -v cb9a9f314b8b tip with options $ hg id -r. cb9a9f314b8b tip $ hg id -n 0 $ hg id -t tip $ hg id -b default $ hg id -i cb9a9f314b8b $ hg id -n -t -b -i cb9a9f314b8b 0 default tip $ hg id -Tjson [ { "bookmarks": [], "branch": "default", "dirty": "", "id": "cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b", "node": "ffffffffffffffffffffffffffffffffffffffff", "parents": ["cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b"], "tags": ["tip"] } ] test template keywords and functions which require changectx: $ hg id -T '{rev} {node|shortest}\n' 2147483647 ffff $ hg id -T '{parents % "{rev} {node|shortest} {desc}\n"}' 0 cb9a a $ hg id -T '{parents}\n' cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b test nested template: '{tags}'/'{node}' constants shouldn't override the default keywords, but '{id}' persists because there's no default keyword for '{id}' (issue5612) $ hg id -T '{tags}\n' tip $ hg id -T '{revset("null:.") % "{rev}:{node|short} {tags} {id|short}\n"}' -1:000000000000 cb9a9f314b8b 0:cb9a9f314b8b tip cb9a9f314b8b with modifications $ echo b > a $ hg id -n -t -b -i cb9a9f314b8b+ 0+ default tip $ hg id -Tjson [ { "bookmarks": [], "branch": "default", "dirty": "+", "id": "cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b+", "node": "ffffffffffffffffffffffffffffffffffffffff", "parents": ["cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b"], "tags": ["tip"] } ] other local repo $ cd .. $ hg -R test id cb9a9f314b8b+ tip #if no-outer-repo $ hg id test cb9a9f314b8b+ tip #endif with remote http repo $ cd test $ hg serve -p $HGPORT1 -d --pid-file=hg.pid $ cat hg.pid >> $DAEMON_PIDS $ hg id http://localhost:$HGPORT1/ cb9a9f314b8b remote with rev number? $ hg id -n http://localhost:$HGPORT1/ abort: can't query remote revision number, branch, or tags [10] remote with tags? $ hg id -t http://localhost:$HGPORT1/ abort: can't query remote revision number, branch, or tags [10] remote with branch? $ hg id -b http://localhost:$HGPORT1/ abort: can't query remote revision number, branch, or tags [10] test bookmark support $ hg bookmark Y $ hg bookmark Z $ hg bookmarks Y 0:cb9a9f314b8b * Z 0:cb9a9f314b8b $ hg id cb9a9f314b8b+ tip Y/Z $ hg id --bookmarks Y Z test remote identify with bookmarks $ hg id http://localhost:$HGPORT1/ cb9a9f314b8b Y/Z $ hg id --bookmarks http://localhost:$HGPORT1/ Y Z $ hg id -r . http://localhost:$HGPORT1/ cb9a9f314b8b Y/Z $ hg id --bookmarks -r . http://localhost:$HGPORT1/ Y Z test invalid lookup $ hg id -r noNoNO http://localhost:$HGPORT1/ abort: unknown revision 'noNoNO' [255] Make sure we do not obscure unknown requires file entries (issue2649) $ echo fake >> .hg/requires $ hg id abort: repository requires features unknown to this Mercurial: fake (see https://mercurial-scm.org/wiki/MissingRequirement for more information) [255] $ cd .. #if no-outer-repo $ hg id test abort: repository requires features unknown to this Mercurial: fake (see https://mercurial-scm.org/wiki/MissingRequirement for more information) [255] #endif