2013-05-11 2 views
0

Я устанавливаю и срываю базу данных MongoDB во время функционального теста.Почему индекс не создается после разрыва, если некоторые соединения сохраняются?

Одна из моих моделей будет использовать GridFS, и я собираюсь запустить этот тест (который также вызывает настройку и срыв). Предположим, что мы начали с чистой пустой базы данных под названием test_repoapi:

  1. python serve.py testing.ini
  2. nosetests -a 'write-file'

Второй раз, когда я запустить тест, я получаю это:

OperationFailure: command SON([('filemd5', ObjectId('518ec7d84b8aa41dec957d3c')), ('root', u'fs')]) failed: need an index on { files_id : 1 , n : 1 } 

If мы смотрим на клиента:

> use test_repoapi 
switched to db test_repoapi 
> show collections 
fs.chunks 
system.indexes 
users 

Вот лог: http://pastebin.com/1adX4svG

Есть три вида меток времени:

(1) верхний, когда я первый начал веб-приложение

(2) что-нибудь, прежде чем 23:06:27 были первая итерация

(3), то все остальное были второй итерации

Как вы можете видеть, что я сделал initializ чтобы удалить базу данных. Два возможных объяснения:

(1) Веб-приложение содержит два активных соединений с базой данных, и

(2) Какой-то «блокировка» препятствует индекс от полностью создан. Также посмотрите fs.files не было воссоздано.

Обходным способом является остановка веб-приложения, запуск заново и запуск теста; то ошибка не появится.

Кстати, я использую Mongoengine как мой ODM в своем веб-приложении.

Любые мысли по этому поводу?

+1

Какая версия mongoengine? И можете ли вы предоставить тестовый пример? Pymongo делает кеширование результатов sure_index. – Ross

ответ

0

Раньше у нас была аналогичная проблема с mongoengine, которая не смогла воссоздать индексы после drop_collection() во время тестов, так как не сумела осознать, что выпавшая коллекция также снижает индексы. Но это происходило с обычными коллекциями и довольно древней версией mongoengine (и звонок в QuerySet._reset_already_indexed() исправил ее для нас - но мы не нуждались в этом с 0,6)

Возможно, это еще один случай, когда mongoengine внутренне отслеживает какие индексы были созданы, и просто не удалось понять, что база данных/коллекция исчезла, и эти индексы необходимо воссоздать? FWIW с использованием drop_collection() между тестами работает для нас, и это включает в себя GridFS.

Смежные вопросы