Как обращаться с устаревшими индексами во время тестирования? - PullRequest
10 голосов
/ 30 января 2012

Я использую RavenDB в режиме In-Memory для модульного тестирования. Мои запросы подкреплены статическими индексами. Я не использую WaitForNonStaleResults() API (и не хочу).

Типичный рабочий процесс для теста:

  1. Инициализация RavenDB в режиме In-Memory
  2. Интегрировать индексы, используя IndexCreation.CreateIndexes(Assembly, IDocumentStore)
  3. Вставить тестовые данные (для проверки поведения запроса)
  4. Выполнить запрос
  5. Проверить вывод запроса

Я заметил, что шаги 1-3 происходят так быстро, что статические индексы не успевают обновиться до шага 4 - поэтому индексы устарели.

Я создал быстрый обходной путь для этого. После шага 3 я выполняю:

while (documentStore.DocumentDatabase.Statistics.StaleIndexes.Length != 0)
    Thread.Sleep(10);

Это кажется громоздким. Что я хотел бы знать, это:

  • Нормально ли устаревание индексов при работе RavenDB в режиме In-Memory?
  • Есть ли лучший способ избежать устаревших индексов во время тестирования?

1 Ответ

14 голосов
/ 30 января 2012

Перешли это к RavenDB usergroup и имеют работающее решение.

Это нормально для индексов, которые устаревают при работе RavenDB в режиме In-Memory?

Да.Индекс - это индекс.

Есть ли лучший способ избежать устаревших индексов во время тестирования?

Да.Настройте глобальные соглашения при инициализации хранилища документов:

var store = new EmbeddableDocumentStore();
store.RunInMemory = true;
store.Conventions = new DocumentConvention
{
    DefaultQueryingConsistency = ConsistencyOptions.QueryYourWrites
};

store.Initialize();

Примечание: ConsistencyOptions.QueryYourWrites не работает с индексами Map / Reduce, то есть с разделами Reduce => ....Для этого вы должны использовать Customize(x => x.WaitForNonStale...()) при запросе

Обновление: Существует другой подход , который может быть лучше (лично я еще не пробовал).Вы могли бы реализовать IDocumentQueryListener, чтобы заставить все запросы возвращать не устаревшие результаты:

var store = new EmbeddableDocumentStore { RunInMemory = true };
store.Initialize();

store.RegisterListener(new ForceNonStaleQueryListener());

public class ForceNonStaleQueryListener : IDocumentQueryListener
{
    public void BeforeQueryExecuted(IDocumentQueryCustomization customization)
    {
        queryCustomization.WaitForNonStaleResults();
    }
}
...