zhuyifei1999 created this task.
zhuyifei1999 added a project: Pywikibot.
Restricted Application added subscribers: pywikibot-bugs-list, Aklapper.

TASK DESCRIPTION
  BasePage.botMayEdit is annotated with `@cache`
  
    @cache
    def botMayEdit(self) -> bool:
  
  This is an unbounded strongref cache, so whenever `botMayEdit` is called, 
`self` will be added to the cache as key, and the key will never be deleted 
from cache. The `self` will then go on to reference way too many objects and 
keeping them alive. One of my long-running bots used up 4 gigabytes of memory 
before hitting rlimit and getting killed.
  
  I tested that script with guppy3 to visualize just how much is being kept 
alive by botMayEdit cache: (`dominos` is "The set 'dominated' by the set of 
objects in x. This is the objects that will become deallocated, directly or 
indirectly, when the objects in x are deallocated.")
  
  When the bot first starts:
  
    >>> import guppy
    >>> hp = guppy.hpy()
    >>> hp.heap()
    Partition of a set of 270151 objects. Total size = 32191012 bytes.
     Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
         0 114602  42  9772353  30   9772353  30 str
         1  10927   4  5288952  16  15061305  47 dict (no owner)
         2  42074  16  4030904  13  19092209  59 tuple
         3  20385   8  1538948   5  20631157  64 bytes
         4   1565   1  1524032   5  22155189  69 type
         5  10142   4  1464520   5  23619709  73 types.CodeType
         6   9655   4  1390320   4  25010029  78 function
         7  27941  10   796952   2  25806981  80 int
         8   1565   1   790760   2  26597741  83 dict of type
         9   5001   2   690752   2  27288493  85 list
    <552 more rows. Type e.g. '_.more' to view.>
    >>> hp.iso(pywikibot.page.BasePage.botMayEdit).dominos
    Partition of a set of 11848 objects. Total size = 1652473 bytes.
     Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
         0   2474  21   752160  46    752160  46 dict (no owner)
         1   6271  53   498823  30   1250983  76 str
         2   1145  10    95872   6   1346855  82 list
         3    150   1    64576   4   1411431  85 collections.OrderedDict
         4    146   1    56016   3   1467447  89 dict of pywikibot.page.Page
         5    193   2    42328   3   1509775  91 dict of pywikibot.page.Link
         6    158   1    36656   2   1546431  94 set
         7     85   1    21080   1   1567511  95 dict of pywikibot.page.Claim
         8    265   2    19480   1   1586991  96 tuple
         9     46   0    13040   1   1600031  97 dict of pywikibot.page.ItemPage
    <28 more rows. Type e.g. '_.more' to view.>
    >>> pywikibot.page.BasePage.botMayEdit.cache_info()
    CacheInfo(hits=0, misses=5, maxsize=None, currsize=5)
  
  After running for a few minutes:
  
    >>> hp.heap()
    Partition of a set of 1603419 objects. Total size = 208454157 bytes.
     Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
         0 230842  14 71763136  34  71763136  34 dict (no owner)
         1 840630  52 60144617  29 131907753  63 str
         2 129444   8 13086752   6 144994505  70 list
         3  36258   2 13024648   6 158019153  76 collections.OrderedDict
         4  19909   1  7455544   4 165474697  79 dict of pywikibot.page.Link
         5  28394   2  7041712   3 172516409  83 dict of pywikibot.page.Claim
         6  52982   3  4815056   2 177331465  85 tuple
         7  12188   1  3108712   1 180440177  87 dict of pywikibot.page.ItemPage
         8   7112   0  2737112   1 183177289  88 dict of pywikibot.page.Page
         9   8177   1  2124904   1 185302193  89 set
    <557 more rows. Type e.g. '_.more' to view.>
    >>> hp.iso(pywikibot.page.BasePage.botMayEdit).dominos
    Partition of a set of 1049673 objects. Total size = 141565142 bytes.
     Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
         0 193668  18 53690232  38  53690232  38 dict (no owner)
         1 500122  48 33602128  24  87292360  62 str
         2  35999   3 12842600   9 100134960  71 collections.OrderedDict
         3 115539  11 10840032   8 110974992  78 list
         4  19908   2  7455168   5 118430160  84 dict of pywikibot.page.Link
         5  28394   3  7041712   5 125471872  89 dict of pywikibot.page.Claim
         6  12188   1  3108712   2 128580584  91 dict of pywikibot.page.ItemPage
         7   7111   1  2736736   2 131317320  93 dict of pywikibot.page.Page
         8  28394   3  1817216   1 133134536  94 pywikibot.page.Claim
         9   7567   1  1755544   1 134890080  95 set
    <42 more rows. Type e.g. '_.more' to view.>
    >>> pywikibot.page.BasePage.botMayEdit.cache_info()
    CacheInfo(hits=0, misses=225, maxsize=None, currsize=225)
  
  This is since rPWBC8b952048ab61: [bugfix] cache botMayEdit result 
<https://phabricator.wikimedia.org/rPWBC8b952048ab61cbc2b78edf9ff647a5fcd1f1f535>
 / T267770: wikibase_tests fails for TestLoadRevisionsCaching.test_page_text 
<https://phabricator.wikimedia.org/T267770>

TASK DETAIL
  https://phabricator.wikimedia.org/T283957

EMAIL PREFERENCES
  https://phabricator.wikimedia.org/settings/panel/emailpreferences/

To: zhuyifei1999
Cc: Aklapper, pywikibot-bugs-list, Xqt, zhuyifei1999, Shalomori123, Jyoo1011, 
JohnsonLee01, SHEKH, Dijkstra, Khutuck, Zkhalido, Viztor, Wenyi, Tbscho, MayS, 
Mdupont, JJMC89, Dvorapa, Altostratus, Avicennasis, mys_721tx, jayvdb, Masti, 
Alchimista
_______________________________________________
pywikibot-bugs mailing list -- pywikibot-bugs@lists.wikimedia.org
To unsubscribe send an email to pywikibot-bugs-le...@lists.wikimedia.org

Reply via email to