rhiaro
rhiaro

Reputation: 175

Async query throws AssertionError first time (AppEngine, NDB)

When I use fetch_async() on a query it crashes with AssertionError the first time it is run. If I run it again immediately, it's fine.

Eg.

With model:

class User(ndb.Model):
    user = ndb.UserProperty()
    name = ndb.StringProperty()
    penname = ndb.StringProperty()
    first_login = ndb.DateTimeProperty(auto_now_add=True)
    contact = ndb.BooleanProperty()

The following works straight away, returning an empty list:

users = User.query(User.penname == "asdf").fetch()

But this crashes:

future = User.query(User.penname == "asdf").fetch_async()
users = future.get_result()

With:

Traceback (most recent call last):
  File "/opt/google-appengine-python/google/appengine/ext/admin/__init__.py", line 320, in post
    exec(compiled_code, globals())
  File "<string>", line 6, in <module>
  File "/opt/google-appengine-python/google/appengine/ext/ndb/tasklets.py", line 320, in get_result
    self.check_success()
  File "/opt/google-appengine-python/google/appengine/ext/ndb/tasklets.py", line 357, in _help_tasklet_along
    value = gen.throw(exc.__class__, exc, tb)
  File "/opt/google-appengine-python/google/appengine/ext/ndb/query.py", line 887, in _run_to_list
    batch = yield rpc
  File "/opt/google-appengine-python/google/appengine/ext/ndb/tasklets.py", line 435, in _on_rpc_completion
    result = rpc.get_result()
  File "/opt/google-appengine-python/google/appengine/api/apiproxy_stub_map.py", line 592, in get_result
    return self.__get_result_hook(self)
  File "/opt/google-appengine-python/google/appengine/datastore/datastore_query.py", line 2386, in __query_result_hook
    self._batch_shared.conn.check_rpc_success(rpc)
  File "/opt/google-appengine-python/google/appengine/datastore/datastore_rpc.py", line 1191, in check_rpc_success
    rpc.check_success()
  File "/opt/google-appengine-python/google/appengine/api/apiproxy_stub_map.py", line 558, in check_success
    self.__rpc.CheckSuccess()
  File "/opt/google-appengine-python/google/appengine/api/apiproxy_rpc.py", line 156, in _WaitImpl
    self.request, self.response)
  File "/opt/google-appengine-python/google/appengine/api/datastore_file_stub.py", line 568, in MakeSyncCall
    response)
  File "/opt/google-appengine-python/google/appengine/api/apiproxy_stub.py", line 87, in MakeSyncCall
    method(request, response)
  File "/opt/google-appengine-python/google/appengine/datastore/datastore_stub_util.py", line 2367, in UpdateIndexesWrapper
    self._UpdateIndexes()
  File "/opt/google-appengine-python/google/appengine/datastore/datastore_stub_util.py", line 2656, in _UpdateIndexes
    self._index_yaml_updater.UpdateIndexYaml()
  File "/opt/google-appengine-python/google/appengine/datastore/datastore_stub_index.py", line 244, in UpdateIndexYaml
    all_indexes, manual_indexes)
  File "/opt/google-appengine-python/google/appengine/datastore/datastore_stub_index.py", line 85, in GenerateIndexFromHistory
    required, kind, ancestor, props, num_eq_filters = datastore_index.CompositeIndexForQuery(query)
  File "/opt/google-appengine-python/google/appengine/datastore/datastore_index.py", line 424, in CompositeIndexForQuery
    assert filter.property(0).name() == ineq_property
AssertionError

But if I run it again immediately, for example by doing:

future = User.query(User.penname == "asdf").fetch_async()

try:
    users = future.get_result()
except:
    users = future.get_result()

It works.

This has been cropping up all over the place and I'm struggling to pin down the root cause.

Upvotes: 0

Views: 362

Answers (1)

rhiaro
rhiaro

Reputation: 175

The solution was to upgrade to the 1.7.1 SDK.

Upvotes: 2

Related Questions