From ad2d37160569a5239378ba95806e948a6da7aa99 Mon Sep 17 00:00:00 2001 From: Darren Ranalli Date: Mon, 9 Apr 2007 07:34:20 +0000 Subject: [PATCH] log some items from leaking containers, shorter delay before first check --- direct/src/showbase/ContainerLeakDetector.py | 55 ++++++++++++++------ 1 file changed, 39 insertions(+), 16 deletions(-) diff --git a/direct/src/showbase/ContainerLeakDetector.py b/direct/src/showbase/ContainerLeakDetector.py index 4a4a0bb255..053be13fd0 100755 --- a/direct/src/showbase/ContainerLeakDetector.py +++ b/direct/src/showbase/ContainerLeakDetector.py @@ -1,7 +1,7 @@ from pandac.PandaModules import PStatCollector from direct.directnotify.DirectNotifyGlobal import directNotify from direct.showbase.PythonUtil import Queue, invertDictLossless -from direct.showbase.PythonUtil import itype, serialNum, safeRepr +from direct.showbase.PythonUtil import itype, serialNum, safeRepr, fastRepr from direct.showbase.Job import Job import types, weakref, random, __builtin__ @@ -20,7 +20,7 @@ def _createContainerLeak(): if random.random() < .01: key = random.choice(base.leakContainer.keys()) ContainerLeakDetector.notify.debug( - 'removing reference to leakContainer key %s so it will be garbage-collected' % key) + 'removing reference to leakContainer key %s so it will be garbage-collected' % safeRepr(key)) del base.leakContainer[key] return task.cont task = taskMgr.add(leakContainer, 'leakContainer-%s' % serialNum()) @@ -29,6 +29,8 @@ class CheckContainers(Job): """ Job to check container sizes and find potential leaks; sub-job of ContainerLeakDetector """ + ReprItems = 5 + def __init__(self, name, leakDetector, index): Job.__init__(self, name) self._leakDetector = leakDetector @@ -99,22 +101,28 @@ class CheckContainers(Job): self._leakDetector._index2delay[self._index-1]) / 60. name = self._leakDetector.getContainerNameById(id) if idx2id2len[self._index-1][id] != 0: - percent = int(100. * (float(diff) / idx2id2len[self._index-1][id])) + percent = 100. * (float(diff) / float(idx2id2len[self._index-1][id])) + for container in self._leakDetector.getContainerByIdGen(id): + yield None self.notify.warning( - '%s grew %s%% in %.2f minutes (currently %s items)' % ( - name, percent, minutes, idx2id2len[self._index][id])) + '%s (%s) grew %.2f%% in %.2f minutes (currently %s items): %s' % ( + name, itype(container), percent, minutes, idx2id2len[self._index][id], + fastRepr(container, maxLen=CheckContainers.ReprItems))) yield None - if (self._index > 3 and + if (self._index > 2 and id in idx2id2len[self._index-2] and id in idx2id2len[self._index-3]): diff2 = idx2id2len[self._index-1][id] - idx2id2len[self._index-2][id] diff3 = idx2id2len[self._index-2][id] - idx2id2len[self._index-3][id] - if self._index <= 5: + if self._index <= 4: if diff > 0 and diff2 > 0 and diff3 > 0: name = self._leakDetector.getContainerNameById(id) - msg = ('%s consistently increased in size over the last ' - '3 periods (currently %s items)' % - (name, idx2id2len[self._index][id])) + for container in self._leakDetector.getContainerByIdGen(id): + yield None + msg = ('%s (%s) consistently increased in size over the last ' + '3 periods (currently %s items): %s' % + (name, itype(container), idx2id2len[self._index][id], + fastRepr(container, maxLen=CheckContainers.ReprItems))) self.notify.warning(msg) yield None elif (id in idx2id2len[self._index-4] and @@ -125,10 +133,14 @@ class CheckContainers(Job): diff5 = idx2id2len[self._index-4][id] - idx2id2len[self._index-5][id] if diff > 0 and diff2 > 0 and diff3 > 0 and diff4 > 0 and diff5 > 0: name = self._leakDetector.getContainerNameById(id) - msg = ('%s consistently increased in size over the last ' - '5 periods (currently %s items)' % - (name, idx2id2len[self._index][id])) - self.notify.warning('%s, sending notification' % msg) + for container in self._leakDetector.getContainerByIdGen(id): + yield None + msg = ('%s (%s) consistently increased in size over the last ' + '5 periods (currently %s items): %s' % + (name, itype(container), idx2id2len[self._index][id], + fastRepr(container, maxLen=CheckContainers.ReprItems))) + self.notify.warning(msg) + self.notify.warning('sending notification...') yield None for result in self._leakDetector.getContainerByIdGen(id): yield None @@ -316,6 +328,9 @@ class ContainerRef: #import pdb;pdb.set_trace() evalStr = '' curObj = None + # make sure the indirections don't go away on us + for indirection in self._indirections: + indirection.acquire() for indirection in self._indirections: yield None if not indirection.isDictKey(): @@ -328,6 +343,9 @@ class ContainerRef: # try to look up this key in the curObj dictionary curObj = indirection.dereferenceDictKey(curObj) evalStr = '' + for indirection in self._indirections: + yield None + indirection.release() yield self._evalWithObj(evalStr, curObj) @@ -336,6 +354,9 @@ class ContainerRef: prevIndirection = None curIndirection = None nextIndirection = None + # make sure the indirections don't go away on us + for indirection in self._indirections: + indirection.acquire() for i in xrange(len(self._indirections)): yield None if i > 0: @@ -349,6 +370,9 @@ class ContainerRef: nextIndirection = None str += curIndirection.getString(prevIndirection=prevIndirection, nextIndirection=nextIndirection) + for indirection in self._indirections: + yield None + indirection.release() yield str def __repr__(self): @@ -373,9 +397,8 @@ class ContainerLeakDetector(Job): self._serialNum = serialNum() self._priority = (Job.Priorities.Low + Job.Priorities.Normal) / 2 self._checkContainersJob = None - # run first check after one hour if firstCheckDelay is None: - firstCheckDelay = 60. * 15. + firstCheckDelay = 60. * (15./2) self._nextCheckDelay = firstCheckDelay self._pruneTaskPeriod = config.GetFloat('leak-detector-prune-period', 60. * 30.) self._index2containerId2len = {}