Mercurial > hg
view tests/test-phase-archived.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 | 64de5f44eec3 |
children | 0c70d888a484 |
line wrap: on
line source
========================================================= Test features and behaviors related to the archived phase ========================================================= $ cat << EOF >> $HGRCPATH > [format] > internal-phase=yes > [extensions] > strip= > [experimental] > EOF $ hg init repo $ cd repo $ echo root > a $ hg add a $ hg ci -m 'root' Test that bundle can unarchive a changeset ------------------------------------------ $ echo foo >> a $ hg st M a $ hg ci -m 'unbundletesting' $ hg log -G @ changeset: 1:883aadbbf309 | tag: tip | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: unbundletesting | o changeset: 0:c1863a3840c6 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: root $ hg strip --soft --rev '.' 1 files updated, 0 files merged, 0 files removed, 0 files unresolved saved backup bundle to $TESTTMP/repo/.hg/strip-backup/883aadbbf309-efc55adc-backup.hg $ hg log -G @ changeset: 0:c1863a3840c6 tag: tip user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: root $ hg log -G --hidden o changeset: 1:883aadbbf309 | tag: tip | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: unbundletesting | @ changeset: 0:c1863a3840c6 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: root $ hg unbundle .hg/strip-backup/883aadbbf309-efc55adc-backup.hg adding changesets adding manifests adding file changes added 0 changesets with 0 changes to 1 files (run 'hg update' to get a working copy) $ hg log -G o changeset: 1:883aadbbf309 | tag: tip | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: unbundletesting | @ changeset: 0:c1863a3840c6 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: root Test that history rewriting command can use the archived phase when allowed to ------------------------------------------------------------------------------ $ hg up 'desc(unbundletesting)' 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ echo bar >> a $ hg commit --amend --config experimental.cleanup-as-archived=yes $ hg log -G @ changeset: 2:d1e73e428f29 | tag: tip | parent: 0:c1863a3840c6 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: unbundletesting | o changeset: 0:c1863a3840c6 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: root $ hg log -G --hidden @ changeset: 2:d1e73e428f29 | tag: tip | parent: 0:c1863a3840c6 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: unbundletesting | | o changeset: 1:883aadbbf309 |/ user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: unbundletesting | o changeset: 0:c1863a3840c6 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: root $ ls -1 .hg/strip-backup/ 883aadbbf309-efc55adc-amend.hg 883aadbbf309-efc55adc-backup.hg $ hg unbundle .hg/strip-backup/883aadbbf309*amend.hg adding changesets adding manifests adding file changes added 0 changesets with 0 changes to 1 files (run 'hg update' to get a working copy) $ hg log -G @ changeset: 2:d1e73e428f29 | tag: tip | parent: 0:c1863a3840c6 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: unbundletesting | | o changeset: 1:883aadbbf309 |/ user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: unbundletesting | o changeset: 0:c1863a3840c6 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: root