2

За последние 48 часов или около того мое маленькое приложение GAE для python начало получать AssertionErrors из ndb.get_multi вызовов.ndb.get_multi return AssertionError

Добавлена ​​полная трассировка, и ошибки генерируются на производственном сервере в ___Bitue_____________ в базе данных в строке 734 файла /base/data/.../ndb/model.py, а сбойное утверждение - b_val не является None с сообщением «Can not wrap None»

Ошибка не связана с какой-либо конкретной сущностью или сущностями, но пока я видел ее только с одним типом сущности (еще для проверки других).

Звонок get_multi предназначен только для дюжины ключей, и ошибка прерывистая, так что повторение ее иногда будет успешным. Или не ...

Я не вижу эту ошибку через удаленную оболочку, но я отмечаю, что моя локальная установка - 1.9.23, в то время как запись в журнале говорит, что производственный сервер 1.9.25 (GoogleAppEngineLauncher говорит, что моя локальная установка на данный момент)

Я добавляю обходное решение, чтобы поймать исключение и перебирать ключи, чтобы получить их индивидуально, но я все еще вижу предупреждение о «приостановленном генераторе» в строке 744 контекста.py ,

Предупреждение появляется при первом получении этого типа сущности из списка, по меньшей мере, для двух разных списков ключей (также как и для AssertionError).

Я не хочу, чтобы обернуть все вызовы get_multi таким образом.

Что происходит?


след вызовов TRACEBACK:

Cannot wrap None 
Traceback (most recent call last): 
    File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 570, in dispatch 
    return method(*args, **kwargs) 
    File "/base/data/home/apps/s~thegapnetball/115.386356111937586421/handlers/assess.py", line 50, in get 
    rs = ndb.get_multi(t.players) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 3905, in get_multi 
    for future in get_multi_async(keys, **ctx_options)] 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/tasklets.py", line 326, in get_result 
    self.check_success() 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/tasklets.py", line 372, in _help_tasklet_along 
    value = gen.send(val) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/context.py", line 751, in get 
    pbs = entity._to_pb(set_key=False).SerializePartialToString() 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 3147, in _to_pb 
    prop._serialize(self, pb, projection=self._projection) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 2379, in _serialize 
    projection=projection) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 1405, in _serialize 
    values = self._get_base_value_unwrapped_as_list(entity) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 1175, in _get_base_value_unwrapped_as_list 
    wrapped = self._get_base_value(entity) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 1163, in _get_base_value 
    return self._apply_to_values(entity, self._opt_call_to_base_type) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 1335, in _apply_to_values 
    value[:] = map(function, value) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 1217, in _opt_call_to_base_type 
    value = _BaseValue(self._call_to_base_type(value)) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 734, in \__init__ 
    assert b_val is not None, "Cannot wrap None" 
AssertionError: Cannot wrap None 
+0

Проблема, похоже, прошла так же загадочно, как и она, но я все равно буду благодарен за любые предложения или советы, если она появится снова. – IDM

+0

Нет, все еще там ... :( – IDM

+0

Вы недавно изменили свой модельный класс? Также вы пробовали выбирать каждый из этих ключей с отдельными попаданиями?Проблема может быть связана не с get_multi, а с базовыми полномочиями –

ответ

3

Тим Хоффман и Патрик Костелло поставил меня на правильном пути, чтобы решить эту проблему.

Я увеличил версию, чтобы защитить некоторые изменения, но занял больше времени, чем я ожидал.

Одно изменение добавило повторяющийся StructuredProperty к модели, полученной из ndb.Model, и я добавил несколько объектов с дополнительным свойством (около 30 из 1100 всего).

Предыдущая версия без дополнительного свойства по-прежнему была по умолчанию и была легко использована, поэтому сущности стали достаточно противоречивыми, чтобы создать прерывистый AssertionError.

Главный урок - принять во внимание рекомендации в статье об обновлении схемы Google, в частности, изменить основного родителя на Expando и/или отключить редактирование хранилища данных до завершения любой миграции.

https://cloud.google.com/appengine/articles/update_schema

Исправление было добавить свойство к предыдущей версии, получить все объекты, а затем положить их.

Спасибо Тим и Патрик за указатель!

+0

большое спасибо за документирование этого - мы ударим то же самое –

+0

Я рад, что это помогло :) – IDM