Example #1
0
        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);
        }
Example #2
0
        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);
            }
        }
Example #3
0
        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));
            }
        }