Skip to content

Commit

Permalink
RavenDB-23698 - WaitingForNonStaleResults doesn't identify an index f…
Browse files Browse the repository at this point in the history
…or all documents
  • Loading branch information
grisha-kotler committed Feb 4, 2025
1 parent a6325ae commit 3fcd111
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 4 deletions.
5 changes: 1 addition & 4 deletions src/Raven.Server/Documents/Handlers/BatchHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -563,11 +563,8 @@ private static List<Index> GetImpactedIndexesToWaitForToBecomeNonStale(DocumentD
if (index.State is IndexState.Disabled)
continue;

if (index.Collections.Contains(Constants.Documents.Collections.AllDocumentsCollection) ||
index.WorksOnAnyCollection(modifiedCollections))
{
if (index.WorksOnAnyCollection(modifiedCollections))
indexesToCheck.Add(index);
}
}
}
return indexesToCheck;
Expand Down
3 changes: 3 additions & 0 deletions src/Raven.Server/Documents/Indexes/Index.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4291,6 +4291,9 @@ public virtual bool WorksOnAnyCollection(HashSet<string> collections)
if (Collections.Count == 0)
return false;

if (HandleAllDocs)
return true;

return Collections.Overlaps(collections);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,12 @@
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Threading.Tasks;
using Raven.Client.Documents;
using Raven.Client.Documents.Indexes;
using Raven.Client.Documents.Operations.Indexes;
using Raven.Client.Exceptions;
using Raven.Tests.Core.Utils.Entities;
using Tests.Infrastructure;
using Xunit;
using Xunit.Abstractions;

Expand Down Expand Up @@ -100,5 +104,87 @@ public void Throws_if_exceeds_timeout()
}
}
}

[RavenFact(RavenTestCategory.Indexes)]
public async Task CanWaitForNonStaleResultsForAllDocsIndex()
{
const string companyName1 = "Hibernating Rhinos";
const string companyName2 = "RavenDB";

using (var store = GetDocumentStore())
{
var index = new AllDocsMapIndex();
await index.ExecuteAsync(store);

using (var session = store.OpenAsyncSession())
{
session.Advanced.WaitForIndexesAfterSaveChanges();
await session.StoreAsync(new Company { Name = companyName1 });
await session.SaveChangesAsync();
}

using (var session = store.OpenAsyncSession())
{
var count = await session.Query<AllDocsMapIndex.Result, AllDocsMapIndex>().CountAsync();
Assert.Equal(1, count);
}

await store.Maintenance.SendAsync(new DisableIndexOperation(index.IndexName));

using (var session = store.OpenAsyncSession())
{
session.Advanced.WaitForIndexesAfterSaveChanges(timeout: TimeSpan.FromSeconds(1), throwOnTimeout: true, indexes: [index.IndexName]);

var list = await session.Query<AllDocsMapIndex.Result, AllDocsMapIndex>().ToListAsync();
foreach (var company in list)
{
company.Name = companyName2;
}

var error = await Assert.ThrowsAsync<RavenTimeoutException>(async() => await session.SaveChangesAsync());
Assert.Contains(index.IndexName, error.Message);
}

await store.Maintenance.SendAsync(new EnableIndexOperation(index.IndexName));
Indexes.WaitForIndexing(store, timeout: TimeSpan.FromSeconds(15));

using (var session = store.OpenAsyncSession())
{
var count = await session.Query<AllDocsMapIndex.Result, AllDocsMapIndex>()
.Where(x => x.Name == companyName2).CountAsync();

Assert.Equal(1, count);
}
}
}

private class AllDocsMapIndex : AbstractIndexCreationTask<object>
{
public class Result
{
public string Name { get; set; }
}

public override IndexDefinition CreateIndexDefinition()
{
var index = new IndexDefinition
{
Name = IndexName,

Maps =
{
@"
from doc in docs
select new
{
Name = doc.Name
}"
}
};

return index;
}
}

}
}

0 comments on commit 3fcd111

Please sign in to comment.