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); 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)); WaitForUserToContinueTheTest(source); } }
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 void Can_replicate_multiple_indexes_and_multiple_transformers() { using (var source = GetDocumentStore()) using (var destination = GetDocumentStore()) { var userByAge = new UserByAgeIndex(); userByAge.Execute(source); var usernameToUpperTransformer = new UsernameToUpperTransformer(); usernameToUpperTransformer.Execute(source); var userByName = new UserByNameIndex(); userByName.Execute(source); var usernameToLowerTransformer = new UsernameToLowerTransformer(); usernameToLowerTransformer.Execute(source); SetupReplication(source, destination); var sw = Stopwatch.StartNew(); var destIndexNames = new string[0]; var destTransformerNames = new string[0]; var timeout = Debugger.IsAttached ? 60 * 1000000 : 3000; while (sw.ElapsedMilliseconds < timeout && destIndexNames.Length != 2) { destIndexNames = destination.DatabaseCommands.GetIndexNames(0, 1024); } sw.Restart(); while (sw.ElapsedMilliseconds < timeout && destTransformerNames.Length != 2) { destTransformerNames = destination.DatabaseCommands.GetTransformers(0, 1024).Select(x => x.Name).ToArray(); } Assert.NotNull(destIndexNames); //precaution Assert.Equal(2, destIndexNames.Length); Assert.True(destIndexNames.Contains(userByAge.IndexName)); Assert.True(destIndexNames.Contains(userByName.IndexName)); Assert.NotNull(destTransformerNames); //precaution Assert.Equal(2, destTransformerNames.Length); Assert.True(destTransformerNames.Contains(usernameToUpperTransformer.TransformerName)); Assert.True(destTransformerNames.Contains(usernameToLowerTransformer.TransformerName)); } }
public void Adding_conflict_should_set_the_original_metadata_as_conflicted() { using (var store = GetDocumentStore()) { var userByAge = new UserByAgeIndex(); userByAge.Execute(store); var databaseStoreTask = Server.ServerStore.DatabasesLandlord.TryGetOrCreateResourceStore(store.DefaultDatabase); databaseStoreTask.Wait(); var databaseStore = databaseStoreTask.Result; IndexesEtagsStorage.IndexEntryMetadata metadata; TransactionOperationContext context; using (databaseStore.ConfigurationStorage.ContextPool.AllocateOperationContext(out context)) using (var tx = context.OpenReadTransaction()) metadata = databaseStore.IndexMetadataPersistence.GetIndexMetadataByName(tx.InnerTransaction, context, userByAge.IndexName); Assert.False(metadata.IsConflicted); var definitionJson = new DynamicJsonValue { ["Foo"] = "Bar" }; using (databaseStore.ConfigurationStorage.ContextPool.AllocateOperationContext(out context)) using (var tx = context.OpenWriteTransaction()) using (var definintion = context.ReadObject(definitionJson, string.Empty)) { databaseStore.IndexMetadataPersistence.AddConflict( context, tx.InnerTransaction, userByAge.IndexName, IndexEntryType.Index, new ChangeVectorEntry[0], definintion); tx.Commit(); } using (databaseStore.ConfigurationStorage.ContextPool.AllocateOperationContext(out context)) using (var tx = context.OpenReadTransaction()) metadata = databaseStore.IndexMetadataPersistence.GetIndexMetadataByName(tx.InnerTransaction, context, userByAge.IndexName); Assert.True(metadata.IsConflicted); } }
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 Can_replicate_index() { var(source, destination) = await CreateDuoCluster(); using (source) using (destination) { var userByAge = new UserByAgeIndex(); userByAge.Execute(source); var sw = Stopwatch.StartNew(); var destIndexNames = new string[0]; var timeout = Debugger.IsAttached ? 60 * 1000000 : 3000; while (sw.ElapsedMilliseconds < timeout && destIndexNames.Length != 1) { destIndexNames = destination.Maintenance.Send(new GetIndexNamesOperation(0, 1024)); } Assert.NotNull(destIndexNames); //precaution Assert.Equal(1, destIndexNames.Length); Assert.Equal(userByAge.IndexName, destIndexNames.First()); } }
public void Can_replicate_index() { using (var source = GetDocumentStore()) using (var destination = GetDocumentStore()) { SetupReplication(source, destination); var userByAge = new UserByAgeIndex(); userByAge.Execute(source); var sw = Stopwatch.StartNew(); var destIndexNames = new string[0]; var timeout = Debugger.IsAttached ? 60 * 1000000 : 3000; while (sw.ElapsedMilliseconds < timeout && destIndexNames.Length != 1) { destIndexNames = destination.DatabaseCommands.GetIndexNames(0, 1024); } Assert.NotNull(destIndexNames); //precaution Assert.Equal(1, destIndexNames.Length); Assert.Equal(userByAge.IndexName, destIndexNames.First()); } }
public async Task Setting_conflicted_should_work() { using (var store = GetDocumentStore()) { var userByAge = new UserByAgeIndex(); userByAge.Execute(store); var databaseStore = await Server.ServerStore.DatabasesLandlord.TryGetOrCreateResourceStore(store.DefaultDatabase); IndexesEtagsStorage.IndexEntryMetadata metadata; TransactionOperationContext context; using (databaseStore.ConfigurationStorage.ContextPool.AllocateOperationContext(out context)) using (var tx = context.OpenReadTransaction()) metadata = databaseStore.IndexMetadataPersistence.GetIndexMetadataByName(tx.InnerTransaction, context, userByAge.IndexName); Assert.NotNull(metadata); //sanity check Assert.False(metadata.IsConflicted); using (databaseStore.ConfigurationStorage.ContextPool.AllocateOperationContext(out context)) using (var tx = context.OpenWriteTransaction()) { Assert.True(databaseStore.IndexMetadataPersistence.TrySetConflictedByName(context, tx.InnerTransaction, userByAge.IndexName)); tx.Commit(); } using (databaseStore.ConfigurationStorage.ContextPool.AllocateOperationContext(out context)) using (var tx = context.OpenReadTransaction()) metadata = databaseStore.IndexMetadataPersistence.GetIndexMetadataByName(tx.InnerTransaction, context, userByAge.IndexName); Assert.True(metadata.IsConflicted); } }
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); } }
public void DeleteConflictsFor_should_delete_all_conflict_records() { using (var store = GetDocumentStore()) { var userByAge = new UserByAgeIndex(); userByAge.Execute(store); var databaseStoreTask = Server.ServerStore.DatabasesLandlord.TryGetOrCreateResourceStore(store.DefaultDatabase); databaseStoreTask.Wait(); var databaseStore = databaseStoreTask.Result; var definitionJson = new DynamicJsonValue { ["Foo"] = "Bar" }; var definitionJson2 = new DynamicJsonValue { ["Foo"] = "Bar" }; TransactionOperationContext context; using (databaseStore.ConfigurationStorage.ContextPool.AllocateOperationContext(out context)) using (var tx = context.OpenWriteTransaction()) using (var definintion = context.ReadObject(definitionJson, string.Empty)) using (var definintion2 = context.ReadObject(definitionJson2, string.Empty)) { databaseStore.IndexMetadataPersistence.AddConflict( context, tx.InnerTransaction, userByAge.IndexName, IndexEntryType.Index, new ChangeVectorEntry[0], definintion); databaseStore.IndexMetadataPersistence.AddConflict( context, tx.InnerTransaction, userByAge.IndexName, IndexEntryType.Index, new ChangeVectorEntry[0], definintion2); tx.Commit(); } using (databaseStore.ConfigurationStorage.ContextPool.AllocateOperationContext(out context)) using (var tx = context.OpenWriteTransaction()) { var changeVectors = databaseStore.IndexMetadataPersistence.DeleteConflictsFor(tx.InnerTransaction, context, userByAge.IndexName); tx.Commit(); Assert.Equal(2, changeVectors.Count); } using (databaseStore.ConfigurationStorage.ContextPool.AllocateOperationContext(out context)) using (var tx = context.OpenReadTransaction()) { Assert.Empty(databaseStore.IndexMetadataPersistence.GetConflictsFor(tx.InnerTransaction, context, userByAge.IndexName, 0, 1024)); } } }