Hello, I have a standard GAE project on Python 2.7 using Flask for handling
web requests. The project has threadsafe: yes configured.
I'm seeing an issue where two requests that are very close in timing
failing with two separate errors. Since these errors/requests come in pairs
often, I believe they're related.
One error will say "Deadlock waiting for <Future ...>" with an arbitrary
stack trace, the other will be the following set_result cannot be called
twice:
Traceback (most recent call last):
File
"/base/data/home/apps/s~appname/2017-07-26-002.402945478053763657/lib/appname/flask_extras.py",
line 91, in wrap
result = func(*args, **kwargs)
File
"/base/data/home/apps/s~appname/2017-07-26-002.402945478053763657/appname/auth.py",
line 242, in wrap
result = func(session, *args, **kwargs)
File
"/base/data/home/apps/s~appname/2017-07-26-002.402945478053763657/appname/apps/api.py",
line 695, in post_content_content_id_votes
_wait_all(futures)
File
"/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/tasklets.py",
line 1087, in synctasklet_wrapper
return taskletfunc(*args, **kwds).get_result()
File
"/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/tasklets.py",
line 383, in get_result
self.check_success()
File
"/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/tasklets.py",
line 378, in check_success
self.wait()
File
"/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/tasklets.py",
line 362, in wait
if not ev.run1():
File
"/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/eventloop.py",
line 268, in run1
delay = self.run0()
File
"/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/eventloop.py",
line 230, in run0
callback(*args, **kwds)
File
"/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/tasklets.py",
line 533, in _on_future_completion
self._help_tasklet_along(ns, ds_conn, gen, val)
File
"/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/tasklets.py",
line 444, in _help_tasklet_along
self.set_result(result)
File
"/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/tasklets.py",
line 322, in set_result
raise RuntimeError('Result cannot be set twice.')
RuntimeError: Result cannot be set twice.
Is there any obvious reasons why this would happen? Could it be the
treadsafe configuration?
As far as I've been able to confirm, I don't call get_result() or perform
any synchronous ndb calls in any of the crashing functions, and I wait for
all Futures to complete before returning from the function (that said,
would ndb.toplevel(...) have any effect in this case?)
Appreciate any help!
--
You received this message because you are subscribed to the Google Groups
"Google App Engine" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/google-appengine.
To view this discussion on the web visit
https://groups.google.com/d/msgid/google-appengine/538deef9-1cb6-4b47-9f3f-0bb9dda5ab17%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.