Closed vEpiphyte closed 2 years ago
Something extra weird - using breakpoint()
to step to the location of the recursion error gives me a different RecursionError. This is available on the bug_provtext_coverage_bp
branch of the synapse project.
(syn3104) epiphyte@vertex005c:~/PycharmProjects/synapse$ git reflog -n 1
6b6eeb81 (HEAD -> bug_provtest_coverage_bp, origin/bug_provtest_coverage_bp) HEAD@{0}: commit: Add breakpoint
(syn3104) epiphyte@vertex005c:~/PycharmProjects/synapse$ git rev-parse HEAD
6b6eeb81a39a4c47e4cfdebf4004a455250ce36e
(syn3104) epiphyte@vertex005c:~/PycharmProjects/synapse$ python -m coverage run -m pytest -v -s -rs synapse/tests/test_lib_provenance.py
========================================================================================= test session starts =========================================================================================
platform linux -- Python 3.10.4, pytest-6.2.5, py-1.11.0, pluggy-1.0.0 -- /home/epiphyte/.pyenv/versions/3.10.4/envs/syn3104/bin/python
cachedir: .pytest_cache
rootdir: /home/epiphyte/PycharmProjects/synapse, configfile: pytest.ini
plugins: forked-1.4.0, xdist-2.5.0, cov-3.0.0
collecting ... callling colorama init
post colorama init
collected 3 items
synapse/tests/test_lib_provenance.py::ProvenanceTest::test_prov
------------------------------------------------------------ live log call -----------------------------------------------------
2022-06-09 08:49:27 [DEBUG] Using selector: EpollSelector [selector_events.py:__init__:MainThread:MainProcess]
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> PDB set_trace >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/provenance.py(84)claim()
-> if stacklen > 256:
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/provenance.py(90)claim()
-> if not ProvenanceEnabled:
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/provenance.py(93)claim()
-> stack.push(typ, **info)
(Pdb) s
--Call--
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/provenance.py(57)push()
-> def push(self, typ, **info):
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/provenance.py(58)push()
-> tuplinfo = tuple((k, info[k]) for k in sorted(info.keys()))
(Pdb) s
--Call--
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/provenance.py(58)<genexpr>()
-> tuplinfo = tuple((k, info[k]) for k in sorted(info.keys()))
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/provenance.py(58)<genexpr>()
-> tuplinfo = tuple((k, info[k]) for k in sorted(info.keys()))
(Pdb) s
--Return--
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/provenance.py(58)<genexpr>()->('name', 'uniq')
-> tuplinfo = tuple((k, info[k]) for k in sorted(info.keys()))
(Pdb) s
--Call--
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/provenance.py(58)<genexpr>()->('name', 'uniq')
-> tuplinfo = tuple((k, info[k]) for k in sorted(info.keys()))
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/provenance.py(58)<genexpr>()->('name', 'uniq')
-> tuplinfo = tuple((k, info[k]) for k in sorted(info.keys()))
(Pdb) s
--Return--
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/provenance.py(58)<genexpr>()->None
-> tuplinfo = tuple((k, info[k]) for k in sorted(info.keys()))
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/provenance.py(59)push()
-> self.provs.append((typ, tuplinfo))
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/provenance.py(60)push()
-> self.idens.append((None, True))
(Pdb) s
--Return--
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/provenance.py(60)push()->None
-> self.idens.append((None, True))
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/provenance.py(95)claim()
-> try:
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/provenance.py(96)claim()
-> yield
(Pdb) s
--Return--
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/provenance.py(96)claim()->None
-> yield
(Pdb) s
--Return--
> /home/epiphyte/.pyenv/versions/3.10.4/lib/python3.10/contextlib.py(135)__enter__()->None
-> return next(self.gen)
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/ast.py(926)run()
-> async def genx():
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/ast.py(938)run()
-> genr, empty = await pullone(genx())
(Pdb) s
--Call--
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/ast.py(890)pullone()
-> async def pullone(genr):
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/ast.py(891)pullone()
-> gotone = None
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/ast.py(892)pullone()
-> async for gotone in genr:
(Pdb) s
--Call--
> /home/epiphyte/.pyenv/versions/3.10.4/lib/python3.10/asyncio/base_events.py(526)_asyncgen_firstiter_hook()
-> def _asyncgen_firstiter_hook(self, agen):
(Pdb) s
> /home/epiphyte/.pyenv/versions/3.10.4/lib/python3.10/asyncio/base_events.py(527)_asyncgen_firstiter_hook()
-> if self._asyncgens_shutdown_called:
(Pdb) s
> /home/epiphyte/.pyenv/versions/3.10.4/lib/python3.10/asyncio/base_events.py(533)_asyncgen_firstiter_hook()
-> self._asyncgens.add(agen)
(Pdb) s
--Call--
> /home/epiphyte/.pyenv/versions/3.10.4/lib/python3.10/_weakrefset.py(86)add()
-> def add(self, item):
(Pdb) s
> /home/epiphyte/.pyenv/versions/3.10.4/lib/python3.10/_weakrefset.py(87)add()
-> if self._pending_removals:
(Pdb) s
> /home/epiphyte/.pyenv/versions/3.10.4/lib/python3.10/_weakrefset.py(89)add()
-> self.data.add(ref(item, self._remove))
(Pdb) s
--Return--
> /home/epiphyte/.pyenv/versions/3.10.4/lib/python3.10/_weakrefset.py(89)add()->None
-> self.data.add(ref(item, self._remove))
(Pdb) s
--Return--
> /home/epiphyte/.pyenv/versions/3.10.4/lib/python3.10/asyncio/base_events.py(533)_asyncgen_firstiter_hook()->None
-> self._asyncgens.add(agen)
(Pdb) s
--Call--
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/ast.py(926)genx()
-> async def genx():
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/ast.py(928)genx()
-> async for node, path in genr:
(Pdb) s
--Call--
> /home/epiphyte/.pyenv/versions/3.10.4/lib/python3.10/asyncio/base_events.py(526)_asyncgen_firstiter_hook()
-> def _asyncgen_firstiter_hook(self, agen):
(Pdb) s
> /home/epiphyte/.pyenv/versions/3.10.4/lib/python3.10/asyncio/base_events.py(527)_asyncgen_firstiter_hook()
-> if self._asyncgens_shutdown_called:
(Pdb) s
> /home/epiphyte/.pyenv/versions/3.10.4/lib/python3.10/asyncio/base_events.py(533)_asyncgen_firstiter_hook()
-> self._asyncgens.add(agen)
(Pdb) s
--Call--
> /home/epiphyte/.pyenv/versions/3.10.4/lib/python3.10/_weakrefset.py(86)add()
-> def add(self, item):
(Pdb) s
> /home/epiphyte/.pyenv/versions/3.10.4/lib/python3.10/_weakrefset.py(87)add()
-> if self._pending_removals:
(Pdb) s
> /home/epiphyte/.pyenv/versions/3.10.4/lib/python3.10/_weakrefset.py(89)add()
-> self.data.add(ref(item, self._remove))
(Pdb) s
--Return--
> /home/epiphyte/.pyenv/versions/3.10.4/lib/python3.10/_weakrefset.py(89)add()->None
-> self.data.add(ref(item, self._remove))
(Pdb) s
--Return--
> /home/epiphyte/.pyenv/versions/3.10.4/lib/python3.10/asyncio/base_events.py(533)_asyncgen_firstiter_hook()->None
-> self._asyncgens.add(agen)
(Pdb) s
--Call--
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/ast.py(908)run()
-> async def run(self, runt, genr):
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/ast.py(910)run()
-> name = await self.kids[0].compute(runt, None)
(Pdb) s
--Call--
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/ast.py(2978)compute()
-> async def compute(self, runt, path):
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/ast.py(2979)compute()
-> return self.valu
(Pdb) s
--Return--
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/ast.py(2979)compute()->'uniq'
-> return self.valu
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/ast.py(912)run()
-> ctor = runt.snap.core.getStormCmd(name)
(Pdb) s
--Call--
> /home/epiphyte/PycharmProjects/synapse/synapse/cortex.py(4269)getStormCmd()
-> def getStormCmd(self, name):
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/cortex.py(4270)getStormCmd()
-> return self.stormcmds.get(name)
(Pdb) s
--Return--
> /home/epiphyte/PycharmProjects/synapse/synapse/cortex.py(4270)getStormCmd()-><class 'synap...torm.UniqCmd'>
-> return self.stormcmds.get(name)
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/ast.py(913)run()
-> if ctor is None:
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/ast.py(917)run()
-> runtsafe = self.kids[1].isRuntSafe(runt)
(Pdb) s
--Call--
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/ast.py(2972)isRuntSafe()
-> def isRuntSafe(self, runt):
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/ast.py(2973)isRuntSafe()
-> return True
(Pdb) s
--Return--
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/ast.py(2973)isRuntSafe()->True
-> return True
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/ast.py(919)run()
-> scmd = ctor(runt, runtsafe)
(Pdb) s
--Call--
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2438)__init__()
-> def __init__(self, runt, runtsafe):
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2440)__init__()
-> self.opts = None
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2441)__init__()
-> self.argv = None
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2443)__init__()
-> self.runt = runt
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2444)__init__()
-> self.runtsafe = runtsafe
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2446)__init__()
-> self.pars = self.getArgParser()
(Pdb) s
--Call--
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(3223)getArgParser()
-> def getArgParser(self):
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(3224)getArgParser()
-> pars = Cmd.getArgParser(self)
(Pdb) s
--Call--
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2462)getArgParser()
-> def getArgParser(self):
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2463)getArgParser()
-> return Parser(prog=self.getName(), descr=self.getDescr())
(Pdb) s
--Call--
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2456)getName()
-> def getName(self):
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2457)getName()
-> return self.name
(Pdb) s
--Return--
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2457)getName()->'uniq'
-> return self.name
(Pdb) s
--Call--
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2459)getDescr()
-> def getDescr(self):
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2460)getDescr()
-> return self.__class__.__doc__
(Pdb) s
--Return--
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2460)getDescr()->'\n Filter... uniq\n\n '
-> return self.__class__.__doc__
(Pdb) s
--Call--
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2064)__init__()
-> def __init__(self, prog=None, descr=None, root=None):
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2066)__init__()
-> if root is None:
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2067)__init__()
-> root = self
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2069)__init__()
-> self.prog = prog
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2070)__init__()
-> self.descr = descr
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2072)__init__()
-> self.root = root
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2073)__init__()
-> self.exited = False
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2074)__init__()
-> self.mesgs = []
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2076)__init__()
-> self.optargs = {}
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2077)__init__()
-> self.posargs = []
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2078)__init__()
-> self.allargs = []
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2080)__init__()
-> self.inputs = None
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2082)__init__()
-> self.reqopts = []
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2084)__init__()
-> self.add_argument('--help', '-h', action='store_true', default=False, help='Display the command usage.')
(Pdb) s
--Call--
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2089)add_argument()
-> def add_argument(self, *names, **opts):
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2091)add_argument()
-> assert len(names)
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2093)add_argument()
-> argtype = opts.get('type')
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2094)add_argument()
-> if argtype is not None and argtype not in s_datamodel.Model().types:
(Pdb) s
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2099)add_argument()
-> dest = self._get_dest(names)
(Pdb) s
--Call--
> /home/epiphyte/PycharmProjects/synapse/synapse/lib/storm.py(2110)_get_dest()
-> def _get_dest(self, names):FAILED
synapse/tests/test_lib_provenance.py::ProvenanceTest::test_prov_disabled SKIPPED (test)
synapse/tests/test_lib_provenance.py::ProvenanceTest::test_prov_no_extra SKIPPED (Pending provenance cache)
===========================================FAILURES ==================================
___________________________ProvenanceTest.test_prov _____________________________
args = (), kwargs = {}, coro = <coroutine object ProvenanceTest.test_prov at 0x7f9ee8604e40>
def wrap(*args, **kwargs):
coro = f(*args, **kwargs)
if not iAmLoop():
> return sync(coro)
synapse/glob.py:118:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
synapse/glob.py:87: in sync
return asyncio.run_coroutine_threadsafe(coro, loop).result(timeout)
../../.pyenv/versions/3.10.4/lib/python3.10/concurrent/futures/_base.py:446: in result
return self.__get_result()
../../.pyenv/versions/3.10.4/lib/python3.10/concurrent/futures/_base.py:391: in __get_result
raise self._exception
synapse/tests/test_lib_provenance.py:87: in test_prov
await real.nodes(q)
synapse/cortex.py:4658: in nodes
return await view.nodes(text, opts=opts)
synapse/lib/view.py:406: in nodes
return [n async for n in self.eval(text, opts=opts)]
synapse/lib/view.py:406: in <listcomp>
return [n async for n in self.eval(text, opts=opts)]
synapse/lib/view.py:374: in eval
async for node in snap.eval(text, opts=opts, user=user):
synapse/lib/snap.py:578: in eval
async for node, path in runt.execute():
synapse/lib/storm.py:1954: in execute
async for item in self.query.iterNodePaths(self, genr=genr):
synapse/lib/ast.py:192: in iterNodePaths
async for node, path in genr:
synapse/lib/ast.py:163: in run
async for node, path in genr:
synapse/lib/ast.py:938: in run
genr, empty = await pullone(genx())
synapse/lib/ast.py:892: in pullone
async for gotone in genr:
synapse/lib/ast.py:928: in genx
async for node, path in genr:
synapse/lib/ast.py:938: in run
genr, empty = await pullone(genx())
E RecursionError: maximum recursion depth exceeded while calling a Python object
!!! Recursion detected (same locals & position)
The instructions from the first comment reproduce the problem for me. I don't know what's going on yet.
I think coverage is not causing the recursion error, but is making it more likely. If I add sys.setrecursionlimit(775)
to the top of test_lib_provenance.py, then it fails with the same error even without coverage measurement. I don't see what the change is in the stack when running coverage, but it seems to be adding enough frames somewhere to make the deep recursion hit the limit sooner.
I doubt there's anything I can change in coverage to make this different.
Describe the bug When using Coverage on my project with Python 3.10.4, a RecursionError is encountered. This appears similar to https://github.com/nedbat/coveragepy/issues/1298 . The following shows executing a unit test with and without coverage, with coverage failing.
To Reproduce How can we reproduce the problem? Please be specific. Don't link to a failing CI job. Answer the questions below:
Python 3.10.4 (built using pyenv). This has also been seen in Python 3.10.4, available from CircleCI's
cimg/python:3.10
docker container.What version of coverage.py shows the problem? The output of
coverage debug sys
is helpful.What versions of what packages do you have installed? The output of
pip freeze
is helpful.I don't have a small reproduction - this is occurring inside of test code that is triggering application level recursion safety checks. This is public code so it should be reproducible.
Expected behavior Do not encounter Python RecursionErrors if possible :D
Additional context I'm more than happy to try various coverage patches or assist with any additional information needed to help understand this issue.