I am using RavenDB in In-Memory mode for unit testing. My queries are backed by static indexes. I am not using WaitForNonStaleResults() API (nor do I want to).
Typical workflow for a test is:
- Initialise RavenDB in In-Memory mode
- Integrate indexes using
IndexCreation.CreateIndexes(Assembly, IDocumentStore) - Insert test data (for verifying query behaviour)
- Run query
- Verify query output
I have noticed steps 1-3 happen so quickly, that static indexes don’t have time to get updated before step 4 – therefore the indexes are stale.
I have created a quick work-around for this. After step 3, I execute:
while (documentStore.DocumentDatabase.Statistics.StaleIndexes.Length != 0)
Thread.Sleep(10);
This feels cumbersome. What I would like to know is:
- Is it normal for indexes to be stale when running RavenDB in In-Memory mode?
- Is there a better way to avoid stale indexes during testing?
Cross-posted this to RavenDB usergroup and have a working solution.
Yes. An index is an index.
Yes. Configure global conventions when initialising document store:
Note:
ConsistencyOptions.QueryYourWritesdoesn’t work with Map/Reduce indexes, i.e. indexes with aReduce => ...section. For these you have to useCustomize(x => x.WaitForNonStale...())when queryingUpdate: There is another approach, which may be better (haven’t personally tried it yet). You could implement IDocumentQueryListener to force all queries to return non-stale results: