D4053: [RFC]hgweb: garbage collect on every request in hgweb_mod too

pulkit (Pulkit Goyal) phabricator at mercurial-scm.org
Thu Aug 2 14:22:10 UTC 2018


pulkit created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  We recently updated to mercurial 4.6.2 on our servers and also increased number
  of requests to be made on server at one time. This made hgweb instance takes up
  a lot of memory, sometime upto 50GB of memory when requests are made parallely.
  
  This patch is motivated from
  https://www.mercurial-scm.org/repo/hg-committed/rev/ff2370a70fe8 which adds
  gc.collect() call for the server which serves multiple repositories.
  
  I tried profiling this fix, sometimes this shows less memory usage, sometimes
  more, so I am not sure whether this is right and hence RFC tag.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D4053

AFFECTED FILES
  mercurial/hgweb/hgweb_mod.py

CHANGE DETAILS

diff --git a/mercurial/hgweb/hgweb_mod.py b/mercurial/hgweb/hgweb_mod.py
--- a/mercurial/hgweb/hgweb_mod.py
+++ b/mercurial/hgweb/hgweb_mod.py
@@ -305,8 +305,19 @@
         with self._obtainrepo() as repo:
             profile = repo.ui.configbool('profiling', 'enabled')
             with profiling.profile(repo.ui, enabled=profile):
-                for r in self._runwsgi(req, res, repo):
-                    yield r
+                try:
+                    for r in self._runwsgi(req, res, repo):
+                        yield r
+                finally:
+                    # There are known cycles in localrepository that prevent
+                    # those objects (and tons of held references) from being
+                    # collected through normal refcounting. We mitigate those
+                    # leaks by performing an explicit GC on every request.
+                    # TODO remove this once leaks are fixed.
+                    # TODO only run this on requests that create localrepository
+                    # instances instead of every request.
+                    gc.collect()
+
 
     def _runwsgi(self, req, res, repo):
         rctx = requestcontext(self, repo, req, res)



To: pulkit, #hg-reviewers
Cc: mercurial-devel


More information about the Mercurial-devel mailing list