When running with the celery backend, the tool will emit tasks from one operation and put them on a queue, rather then executing them directly. When run without that queue active, however, this mode of spawning subsidiary tasks leads to recursion errors when Python limits the stack depth of the process.
This probably means we should handle the non-queued execution of crawlers differently, e.g. by using a Python Queue to put tasks into a local pool in order to have them executed.
ERROR:<CENSORED>.parse:maximum recursion depth exceeded while calling a Python object
Traceback (most recent call last):
File "/Users/fl/Code/occrp/memorious/memorious/logic/context.py", line 75, in execute
res = self.stage.method(self, data)
File "/Users/fl/Code/occrp/data.occrp.org/crawlers/src/<CENSORED>.py", line 48, in parse
context.emit(data={'url': next_url})
File "/Users/fl/Code/occrp/memorious/memorious/logic/context.py", line 53, in emit
handle.apply_async((state, stage, data), countdown=delay)
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/celery/app/task.py", line 523, in apply_async
link=link, link_error=link_error, **options)
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/celery/app/task.py", line 741, in apply
ret = tracer(task_id, args, kwargs, request)
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/celery/app/trace.py", line 388, in trace_task
I, R, state, retval = on_error(task_request, exc, uuid)
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/celery/app/trace.py", line 374, in trace_task
R = retval = fun(*args, **kwargs)
File "/Users/fl/Code/occrp/memorious/memorious/logic/context.py", line 217, in handle
context.execute(data)
File "/Users/fl/Code/occrp/memorious/memorious/logic/context.py", line 71, in execute
self.operation_id = op.id
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", line 237, in __get__
return self.impl.get(instance_state(instance), dict_)
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", line 579, in get
value = state._load_expired(state, passive)
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/sqlalchemy/orm/state.py", line 592, in _load_expired
self.manager.deferred_scalar_loader(self, toload)
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/sqlalchemy/orm/loading.py", line 713, in load_scalar_attributes
only_load_props=attribute_names)
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/sqlalchemy/orm/loading.py", line 223, in load_on_ident
return q.one()
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2814, in one
ret = self.one_or_none()
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2784, in one_or_none
ret = list(self)
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2855, in __iter__
return self._execute_and_instances(context)
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2878, in _execute_and_instances
result = conn.execute(querycontext.statement, self._params)
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 945, in execute
return meth(self, multiparams, params)
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/sqlalchemy/sql/elements.py", line 263, in _execute_on_connection
return connection._execute_clauseelement(self, multiparams, params)
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1046, in _execute_clauseelement
if not self.schema_for_object.is_default else None)
File "<string>", line 1, in <lambda>
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/sqlalchemy/sql/elements.py", line 436, in compile
return self._compiler(dialect, bind=bind, **kw)
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/sqlalchemy/sql/elements.py", line 442, in _compiler
return dialect.statement_compiler(dialect, self, **kw)
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/sqlalchemy/sql/compiler.py", line 435, in __init__
Compiled.__init__(self, dialect, statement, **kwargs)
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/sqlalchemy/sql/compiler.py", line 216, in __init__
self.string = self.process(self.statement, **compile_kwargs)
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/sqlalchemy/sql/compiler.py", line 242, in process
return obj._compiler_dispatch(self, **kwargs)
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/sqlalchemy/sql/visitors.py", line 81, in _compiler_dispatch
return meth(self, **kw)
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/sqlalchemy/sql/compiler.py", line 1747, in visit_select
text, select, inner_columns, froms, byfrom, kwargs)
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/sqlalchemy/sql/compiler.py", line 1831, in _compose_select_body
t = select._whereclause._compiler_dispatch(self, **kwargs)
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/sqlalchemy/sql/visitors.py", line 93, in _compiler_dispatch
return meth(self, **kw)
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/sqlalchemy/sql/compiler.py", line 1034, in visit_binary
return self._generate_generic_binary(binary, opstring, **kw)
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/sqlalchemy/sql/compiler.py", line 1059, in _generate_generic_binary
self, eager_grouping=eager_grouping, **kw)
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/sqlalchemy/sql/visitors.py", line 93, in _compiler_dispatch
return meth(self, **kw)
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/sqlalchemy/sql/compiler.py", line 1192, in visit_bindparam
name = self._truncate_bindparam(bindparam)
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/sqlalchemy/sql/compiler.py", line 1248, in _truncate_bindparam
bind_name = self._truncated_identifier("bindparam", bind_name)
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/sqlalchemy/sql/compiler.py", line 1259, in _truncated_identifier
anonname = name.apply_map(self.anon_map)
File "/Users/fl/.virtualenvs/funes/lib/python2.7/site-packages/sqlalchemy/sql/elements.py", line 4071, in apply_map
return self % map_
RuntimeError: maximum recursion depth exceeded while calling a Python object