예제 #1
0
        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);
                }
        }
예제 #2
0
        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);
                }
        }
예제 #3
0
        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));
                }
        }
예제 #4
0
        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);
            }
        }
예제 #5
0
        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));
                    }
            }
        }
예제 #6
0
        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());
                }
        }
예제 #7
0
        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());
                }
        }
예제 #8
0
        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);
            }
        }
예제 #9
0
        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);
            }
        }
예제 #10
0
        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));
                    }
            }
        }