public async Task Can_replicate_multiple_indexes_and_multiple_transformers() { var(source, destination) = await CreateDuoCluster(); using (source) using (destination) { var userByAge = new UserByAgeIndex(); userByAge.Execute(source); var userByName = new UserByNameIndex(); userByName.Execute(source); await SetupReplicationAsync(source, destination); var sw = Stopwatch.StartNew(); var destIndexNames = new string[0]; var timeout = Debugger.IsAttached ? 60 * 1000000 : 3000; while (sw.ElapsedMilliseconds < timeout && destIndexNames.Length != 2) { destIndexNames = destination.Maintenance.Send(new GetIndexNamesOperation(0, 1024)); } sw.Restart(); Assert.NotNull(destIndexNames); //precaution Assert.Equal(2, destIndexNames.Length); Assert.True(destIndexNames.Contains(userByAge.IndexName)); Assert.True(destIndexNames.Contains(userByName.IndexName)); } }
public async Task New_transformer_will_overwrite_index_tombstones() { using (var store = GetDocumentStore()) { const string name = "FooBar"; var userByNameIndex = new UserByNameIndex(name); userByNameIndex.Execute(store); store.DatabaseCommands.DeleteIndex(name); var usernameToUpperTransformer = new UsernameToUpperTransformer(name); usernameToUpperTransformer.Execute(store); var databaseStore = await Server.ServerStore.DatabasesLandlord.TryGetOrCreateResourceStore(store.DefaultDatabase); TransactionOperationContext context; using (databaseStore.ConfigurationStorage.ContextPool.AllocateOperationContext(out context)) using (var tx = context.OpenReadTransaction()) { var metadata = databaseStore.IndexMetadataPersistence.GetIndexMetadataByName(tx.InnerTransaction, context, name); Assert.Equal(1, metadata.ChangeVector.Length); //sanity check /* * transformers and etags share the same tombstone, * so if transformer created, then deleted, then index created under the same name as transformer, the change vector * which represents history of the object will be preserved */ Assert.Equal(3, metadata.ChangeVector[0].Etag); } } }
public async Task Creating_indexes_should_create_relevant_metadata() { using (var store = GetDocumentStore()) { var userByAge = new UserByAgeIndex(); var userByName = new UserByNameIndex(); userByName.Execute(store); userByAge.Execute(store); var databaseStore = await Server.ServerStore.DatabasesLandlord.TryGetOrCreateResourceStore(store.DefaultDatabase); TransactionOperationContext context; using (databaseStore.ConfigurationStorage.ContextPool.AllocateOperationContext(out context)) using (var tx = context.OpenReadTransaction()) { var metadataByName = databaseStore.IndexMetadataPersistence.GetIndexMetadataByName(tx.InnerTransaction, context, userByName.IndexName); Assert.NotNull(metadataByName); var serversideIndexMetadata = databaseStore.IndexStore.GetIndex(userByName.IndexName); Assert.Equal(serversideIndexMetadata.IndexId, metadataByName.Id); var metadataByAge = databaseStore.IndexMetadataPersistence.GetIndexMetadataByName(tx.InnerTransaction, context, userByAge.IndexName); Assert.NotNull(metadataByAge); serversideIndexMetadata = databaseStore.IndexStore.GetIndex(userByAge.IndexName); Assert.Equal(serversideIndexMetadata.IndexId, metadataByAge.Id); } } }
public async Task Deleting_indexes_should_write_tombstones() { using (var store = GetDocumentStore()) { var userByAge = new UserByAgeIndex(); var userByName = new UserByNameIndex(); userByName.Execute(store); userByAge.Execute(store); store.DatabaseCommands.DeleteIndex(userByName.IndexName); store.DatabaseCommands.DeleteIndex(userByAge.IndexName); var databaseStore = await Server.ServerStore.DatabasesLandlord.TryGetOrCreateResourceStore(store.DefaultDatabase); TransactionOperationContext context; using (databaseStore.ConfigurationStorage.ContextPool.AllocateOperationContext(out context)) using (var tx = context.OpenReadTransaction()) { var metadata = databaseStore.IndexMetadataPersistence.GetIndexMetadataByName(tx.InnerTransaction, context, userByAge.IndexName, returnNullIfTombstone: false); Assert.NotNull(metadata); Assert.Equal(-1, metadata.Id); Assert.Equal(userByAge.IndexName.ToLower(), metadata.Name); metadata = databaseStore.IndexMetadataPersistence.GetIndexMetadataByName(tx.InnerTransaction, context, userByName.IndexName, returnNullIfTombstone: false); Assert.NotNull(metadata); Assert.Equal(-1, metadata.Id); Assert.Equal(userByName.IndexName.ToLower(), metadata.Name); } } }
public async Task PurgeTombstonesFrom_should_work_properly() { using (var store = GetDocumentStore()) { var userByAge = new UserByAgeIndex(); var userByName = new UserByNameIndex(); var userByNameAndBirthday = new UserByNameAndBirthday(); userByName.Execute(store); userByAge.Execute(store); userByNameAndBirthday.Execute(store); store.DatabaseCommands.DeleteIndex(userByName.IndexName); store.DatabaseCommands.DeleteIndex(userByNameAndBirthday.IndexName); var databaseStore = await Server.ServerStore.DatabasesLandlord.TryGetOrCreateResourceStore(store.DefaultDatabase); TransactionOperationContext context; using (databaseStore.ConfigurationStorage.ContextPool.AllocateOperationContext(out context)) using (var tx = context.OpenWriteTransaction()) { databaseStore.IndexMetadataPersistence.PurgeTombstonesFrom(tx.InnerTransaction, context, 0, 1024); tx.Commit(); } using (databaseStore.ConfigurationStorage.ContextPool.AllocateOperationContext(out context)) using (var tx = context.OpenReadTransaction()) { var metadataCollection = databaseStore.IndexMetadataPersistence.GetAfter(tx.InnerTransaction, context, 0, 0, 1024); Assert.Equal(1, metadataCollection.Count); Assert.Equal(userByAge.IndexName.ToLower(), metadataCollection[0].Name); } } }
public void Can_replicate_multiple_indexes() { using (var source = GetDocumentStore()) using (var destination = GetDocumentStore()) { var userByAge = new UserByAgeIndex(); userByAge.Execute(source); var userByName = new UserByNameIndex(); userByName.Execute(source); SetupReplication(source, destination); var sw = Stopwatch.StartNew(); var destIndexNames = new string[0]; var timeout = Debugger.IsAttached ? 60 * 1000000 : 3000; while (sw.ElapsedMilliseconds < timeout && destIndexNames.Length != 2) { destIndexNames = destination.DatabaseCommands.GetIndexNames(0, 1024); } Assert.NotNull(destIndexNames); //precaution Assert.Equal(2, destIndexNames.Length); Assert.True(destIndexNames.Contains(userByAge.IndexName)); Assert.True(destIndexNames.Contains(userByName.IndexName)); } }
public void Index_and_transformer_metadata_storage_should_enforce_name_uniqueness_for_writing_transformer_then_index() { using (var store = GetDocumentStore()) { var usernameToUpperTransformer = new UsernameToUpperTransformer("FooBar"); usernameToUpperTransformer.Execute(store); var userByNameIndex = new UserByNameIndex("FooBar"); Assert.Throws <ErrorResponseException>(() => userByNameIndex.Execute(store)); } }
public void Conflicting_indexes_should_record_conflicts_in_metadata() { using (var nodeA = GetDocumentStore()) using (var nodeB = GetDocumentStore()) { var userByAge = new UserByAgeIndex(); var userByName = new UserByNameIndex(userByAge.IndexName); userByAge.Execute(nodeA); SetupReplication(nodeA, nodeB); userByName.Execute(nodeA); } }
public async Task GetAfter_should_work_properly() { using (var store = GetDocumentStore()) { var userByAge = new UserByAgeIndex(); var userByName = new UserByNameIndex(); var userByNameAndBirthday = new UserByNameAndBirthday(); userByName.Execute(store); userByAge.Execute(store); userByNameAndBirthday.Execute(store); var databaseStore = await Server.ServerStore.DatabasesLandlord.TryGetOrCreateResourceStore(store.DefaultDatabase); List <IndexesEtagsStorage.IndexEntryMetadata> metadataItems; TransactionOperationContext context; using (databaseStore.ConfigurationStorage.ContextPool.AllocateOperationContext(out context)) using (var tx = context.OpenReadTransaction()) { metadataItems = databaseStore.IndexMetadataPersistence.GetAfter(tx.InnerTransaction, context, 0, 0, 1024); Assert.Equal(3, metadataItems.Count); metadataItems = databaseStore.IndexMetadataPersistence.GetAfter(tx.InnerTransaction, context, 3, 0, 1024); Assert.Equal(1, metadataItems.Count); } //this one was created last, so it has the largest etag Assert.Equal(userByNameAndBirthday.IndexName.ToLower(), metadataItems[0].Name); store.DatabaseCommands.DeleteIndex(userByName.IndexName); store.DatabaseCommands.DeleteIndex(userByNameAndBirthday.IndexName); using (databaseStore.ConfigurationStorage.ContextPool.AllocateOperationContext(out context)) using (var tx = context.OpenReadTransaction()) { metadataItems = databaseStore.IndexMetadataPersistence.GetAfter(tx.InnerTransaction, context, 0, 0, 1024); Assert.Equal(3, metadataItems.Count); //together with tombstones Assert.Equal(2, metadataItems.Count(item => item.Id == -1)); } } }
public async Task Manually_removed_indexes_would_remove_metadata_on_startup() { var pathPrefix = Guid.NewGuid().ToString(); var databasePath = String.Empty; var indexesPath = String.Empty; try { var userByAgeIndex = new UserByAgeIndex(); var userByNameIndex = new UserByNameIndex(); var usernameToUpperTransformer = new UsernameToUpperTransformer(); DocumentDatabase databaseStore; using (var store = GetDocumentStore(path: pathPrefix)) { userByNameIndex.Execute(store); userByAgeIndex.Execute(store); usernameToUpperTransformer.Execute(store); databaseStore = await Server.ServerStore.DatabasesLandlord.TryGetOrCreateResourceStore(store.DefaultDatabase); TransactionOperationContext context; using (databaseStore.ConfigurationStorage.ContextPool.AllocateOperationContext(out context)) using (var tx = context.OpenReadTransaction()) { Assert.NotNull( databaseStore.IndexMetadataPersistence.GetIndexMetadataByName(tx.InnerTransaction, context, userByNameIndex.IndexName)); Assert.NotNull( databaseStore.IndexMetadataPersistence.GetIndexMetadataByName(tx.InnerTransaction, context, userByAgeIndex.IndexName)); Assert.NotNull( databaseStore.IndexMetadataPersistence.GetIndexMetadataByName(tx.InnerTransaction, context, usernameToUpperTransformer.TransformerName)); } } indexesPath = databaseStore.Configuration.Indexing.IndexStoragePath; databasePath = databaseStore.Configuration.Core.DataDirectory; foreach (var indexFolder in Directory.GetDirectories(indexesPath)) { IOExtensions.DeleteDirectory(indexFolder); } using (var store = GetDocumentStore(path: pathPrefix)) { databaseStore = await Server.ServerStore.DatabasesLandlord.TryGetOrCreateResourceStore(store.DefaultDatabase); TransactionOperationContext context; using (databaseStore.ConfigurationStorage.ContextPool.AllocateOperationContext(out context)) using (var tx = context.OpenReadTransaction()) { Assert.Null( databaseStore.IndexMetadataPersistence.GetIndexMetadataByName(tx.InnerTransaction, context, userByNameIndex.IndexName)); Assert.Null( databaseStore.IndexMetadataPersistence.GetIndexMetadataByName(tx.InnerTransaction, context, userByAgeIndex.IndexName)); Assert.Null( databaseStore.IndexMetadataPersistence.GetIndexMetadataByName(tx.InnerTransaction, context, usernameToUpperTransformer.TransformerName)); } } } finally { IOExtensions.DeleteDirectory(databasePath); IOExtensions.DeleteDirectory(indexesPath); } }