Comments
Patch
@@ -9,6 +9,7 @@
from __future__ import absolute_import
import contextlib
+import gc
import os
from .common import (
@@ -305,8 +306,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)