private async Task IndexStartupBehaviorTestInternal(DocumentStore store) { var index = new Companies_ByName(); index.Execute(store); string autoIndexName = null; using (var session = store.OpenSession()) { for (var i = 0; i < 50; i++) { session.Store(new Company { Id = i.ToString() }); } session.SaveChanges(); var companies = session.Query <Company>() .Statistics(out var stats) .Customize(x => x.WaitForNonStaleResults()) .Where(x => x.Name != "Test") .ToList(); autoIndexName = stats.IndexName; } Indexes.WaitForIndexing(store); var database = await Databases.GetDocumentDatabaseInstanceFor(store); var indexInstance = database.IndexStore.GetIndex(index.IndexName); indexInstance.SetState(IndexState.Error); indexInstance = database.IndexStore.GetIndex(autoIndexName); indexInstance.SetState(IndexState.Error); var indexStats = store.Maintenance.Send(new GetIndexStatisticsOperation(index.IndexName)); Assert.Equal(IndexState.Error, indexStats.State); Server.ServerStore.DatabasesLandlord.UnloadDirectly(store.Database); indexStats = store.Maintenance.Send(new GetIndexStatisticsOperation(index.IndexName)); Assert.Equal(IndexState.Normal, indexStats.State); indexStats = store.Maintenance.Send(new GetIndexStatisticsOperation(autoIndexName)); Assert.Equal(IndexState.Normal, indexStats.State); }
public void PatchShouldThrowIfAllowStaleIsSetToFalseAndTimeoutHasPassed() { using (var store = GetDocumentStore()) { var index = new Companies_ByName(); index.Execute(store); using (var session = store.OpenSession()) { session.Store(new Company { Name = "Name1" }); session.SaveChanges(); } Indexes.WaitForIndexing(store); var iq = new IndexQuery { Query = $"from index '{index.IndexName}' as c update {{ c.Name = 'Name2' }}" }; var operation = store.Operations.Send(new PatchByQueryOperation(iq, new QueryOperationOptions { AllowStale = true })); operation.WaitForCompletion(TimeSpan.FromSeconds(30)); Indexes.WaitForIndexing(store); operation = store.Operations.Send(new PatchByQueryOperation(iq, new QueryOperationOptions { AllowStale = false })); operation.WaitForCompletion(TimeSpan.FromSeconds(30)); store.Maintenance.Send(new StopIndexingOperation()); using (var session = store.OpenSession()) { session.Store(new Company { Name = "Name3" }); session.SaveChanges(); } operation = store.Operations.Send(new PatchByQueryOperation(iq, new QueryOperationOptions { AllowStale = true })); operation.WaitForCompletion(TimeSpan.FromSeconds(30)); operation = store.Operations.Send(new PatchByQueryOperation(iq, new QueryOperationOptions { AllowStale = false, StaleTimeout = TimeSpan.FromMilliseconds(1) })); var e = Assert.Throws <RavenException>(() => operation.WaitForCompletion(TimeSpan.FromSeconds(30))); Assert.Contains("Cannot perform bulk operation. Index is stale.", e.Message); } }
public async Task ErrorIndexStartupBehavior_ResetAndRestart_Should_Apply_To_Faulty_Indexes_As_Well() { var path = NewDataPath(); IOExtensions.DeleteDirectory(path); using (var store = GetDocumentStore(new Options { RunInMemory = false, Path = path, ModifyDatabaseRecord = databaseRecord => { databaseRecord.Settings[RavenConfiguration.GetKey(x => x.Core.ThrowIfAnyIndexCannotBeOpened)] = "false"; } })) { var index = new Companies_ByName(); await index.ExecuteAsync(store); var staticIndexName = index.IndexName; string autoIndexName; using (var session = store.OpenAsyncSession()) { _ = await session.Query <Company>() .Statistics(out var stats) .Where(x => x.Name == "HR") .ToListAsync(); autoIndexName = stats.IndexName; } var database = await Databases.GetDocumentDatabaseInstanceFor(store); var staticIndexPath = database.IndexStore.GetIndex(staticIndexName)._environment.Options.BasePath; var autoIndexPath = database.IndexStore.GetIndex(autoIndexName)._environment.Options.BasePath; Server.ServerStore.DatabasesLandlord.UnloadDirectly(store.Database); IOExtensions.DeleteFile(staticIndexPath.Combine(Constants.DatabaseFilename).FullPath); IOExtensions.DeleteDirectory(staticIndexPath.Combine("Journals").FullPath); IOExtensions.DeleteFile(autoIndexPath.Combine(Constants.DatabaseFilename).FullPath); IOExtensions.DeleteDirectory(autoIndexPath.Combine("Journals").FullPath); database = await Databases.GetDocumentDatabaseInstanceFor(store); Assert.Equal(2, database.IndexStore.Count); Assert.True(database.IndexStore.GetIndexes().All(x => x is FaultyInMemoryIndex)); Server.ServerStore.DatabasesLandlord.UnloadDirectly(store.Database); var record = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(store.Database)); record.Settings[RavenConfiguration.GetKey(x => x.Indexing.ErrorIndexStartupBehavior)] = IndexingConfiguration.ErrorIndexStartupBehaviorType.ResetAndStart.ToString(); await store.Maintenance.Server.SendAsync(new UpdateDatabaseOperation(record, record.Etag)); database = await Databases.GetDocumentDatabaseInstanceFor(store); Assert.Equal(2, database.IndexStore.Count); Assert.True(database.IndexStore.GetIndexes().All(x => x is FaultyInMemoryIndex == false)); } }