Beispiel #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);


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