Beispiel #1
0
        public async Task RespectTxBoundaries()
        {
            using (var storeA = GetDocumentStore())
                using (var storeB = GetDocumentStore())
                {
                    var database1 = await GetDocumentDatabaseInstanceFor(storeA);

                    using (var controller = new ReplicationController(database1))
                    {
                        using (var session = storeA.OpenAsyncSession())
                        {
                            await session.StoreAsync(new User { Name = "Name1" }, "users/1");

                            session.CountersFor("users/1").Increment("likes", 100);
                            await session.StoreAsync(new User { Name = "Name2" }, "users/2");

                            session.CountersFor("users/2").Increment("downloads", 500);
                            await session.SaveChangesAsync();
                        }

                        await SetupReplicationAsync(storeA, storeB);

                        controller.ReplicateOnce();

                        WaitForDocument(storeB, "users/1");

                        using (var session = storeB.OpenAsyncSession())
                        {
                            Assert.NotNull(await session.LoadAsync <User>("users/2"));
                        }
                    }
                }
        }
        public async Task RavenDB_14435()
        {
            using (var src = GetDocumentStore())
                using (var dst = GetDocumentStore())
                {
                    var database = await GetDocumentDatabaseInstanceFor(src);

                    using (var session = src.OpenSession())
                    {
                        session.Store(new User(), "foo/bar");
                        session.SaveChanges();
                    }

                    using (var controller = new ReplicationController(database))
                    {
                        var databaseWatcher1 = new ExternalReplication(dst.Database, $"ConnectionString-{src.Identifier}_1");
                        await AddWatcherToReplicationTopology(src, databaseWatcher1, src.Urls);

                        controller.ReplicateOnce();

                        Assert.NotNull(WaitForDocumentToReplicate <User>(dst, "foo/bar", 10_000));
                        await Task.Delay(ReplicationLoader.MaxInactiveTime.Add(TimeSpan.FromSeconds(10)));

                        var databaseWatcher2 = new ExternalReplication(dst.Database, $"ConnectionString-{src.Identifier}_2");
                        await AddWatcherToReplicationTopology(src, databaseWatcher2, src.Urls);

                        await Task.Delay(TimeSpan.FromSeconds(5));
                    }

                    await EnsureReplicatingAsync(src, dst);
                }
        }
Beispiel #3
0
        public async Task CanIndexSegmentsWithoutTimeSeries()
        {
            using (var master = GetDocumentStore())
                using (var slave = GetDocumentStore())
                {
                    var masterDb = await GetDocumentDatabaseInstanceFor(master);

                    using (var controller = new ReplicationController(masterDb))
                    {
                        await SetupReplicationAsync(master, slave);

                        var baseline = DateTime.UtcNow;

                        using (var session = master.OpenSession())
                        {
                            session.Store(new User {
                                Name = "Karmel"
                            }, "users/karmel");
                            session.SaveChanges();
                        }

                        controller.ReplicateOnce();


                        using (var session = master.OpenSession())
                        {
                            session.TimeSeriesFor("users/karmel", "Heartrate").Append(baseline.AddDays(-30), new[] { 1d }, "watches/fitbit");
                            session.TimeSeriesFor("users/karmel", "Heartrate").Append(baseline, new[] { 1d }, "watches/fitbit");
                            session.SaveChanges();
                        }

                        using (var session = master.OpenSession())
                        {
                            session.TimeSeriesFor("users/karmel", "Heartrate2").Append(baseline.AddDays(-30), new[] { 1d }, "watches/fitbit");
                            session.SaveChanges();
                        }

                        using (var session = master.OpenSession())
                        {
                            session.TimeSeriesFor("users/karmel", "Heartrate3").Append(baseline, new[] { 2d }, "watches/fitbit");
                            session.SaveChanges();
                        }

                        controller.ReplicateOnce();

                        await new TimeSeriesIndex().ExecuteAsync(slave);
                        WaitForIndexing(slave);
                        RavenTestHelper.AssertNoIndexErrors(slave);
                    }
                }
        }
Beispiel #4
0
        public async Task RealSupportForTransactionMarkerAcrossMultiUpdates()
        {
            using (var store1 = GetDocumentStore())
                using (var store2 = GetDocumentStore())
                {
                    var database1 = await Databases.GetDocumentDatabaseInstanceFor(store1);

                    using (var controller = new ReplicationController(database1))
                    {
                        await RevisionsHelper.SetupRevisions(Server.ServerStore, store1.Database, configuration =>
                        {
                            configuration.Collections["Users"].PurgeOnDelete = false;
                        });

                        await RevisionsHelper.SetupRevisions(Server.ServerStore, store2.Database, configuration =>
                        {
                            configuration.Collections["Users"].PurgeOnDelete = false;
                        });

                        using (var session = store1.OpenAsyncSession())
                        {
                            await session.StoreAsync(new User { Id = "users/oren", Name = "Oren", Balance = 10 });

                            await session.StoreAsync(new User { Id = "users/fitzchak", Name = "Fitzchak", Balance = 10 });

                            await session.StoreAsync(new User { Id = "users/michael", Name = "Michael", Balance = 10 });

                            await session.SaveChangesAsync();
                        }

                        using (var session = store1.OpenAsyncSession())
                        {
                            var fitzchak = await session.LoadAsync <User>("users/fitzchak");

                            var michael = await session.LoadAsync <User>("users/michael");

                            michael.Balance  -= 10;
                            fitzchak.Balance += 10;
                            await session.SaveChangesAsync();
                        }

                        using (var session = store1.OpenAsyncSession())
                        {
                            var fitzchak = await session.LoadAsync <User>("users/fitzchak");

                            var oren = await session.LoadAsync <User>("users/oren");

                            fitzchak.Balance -= 5;
                            oren.Balance     += 5;
                            await session.SaveChangesAsync();
                        }

                        using (var session = store1.OpenAsyncSession())
                        {
                            var michael = await session.LoadAsync <User>("users/michael");

                            session.Delete(michael);
                            var fitzchak = await session.LoadAsync <User>("users/fitzchak");

                            var oren = await session.LoadAsync <User>("users/oren");

                            fitzchak.Balance -= 5;
                            oren.Balance     += 5;
                            await session.SaveChangesAsync();
                        }


                        using (var session = store1.OpenAsyncSession())
                        {
                            await session.StoreAsync(new User { Id = "users/michael", Name = "Michael", Balance = 10 });

                            var oren = await session.LoadAsync <User>("users/oren");

                            oren.Balance -= 10;
                            await session.SaveChangesAsync();
                        }

                        await SetupReplicationAsync(store1, store2);

                        controller.ReplicateOnce();

                        using (var session = store2.OpenAsyncSession())
                        {
                            Assert.True(WaitForDocument <User>(store2, "users/michael", u => u.Balance == 10));
                            var fitzchak = await session.LoadAsync <User>("users/fitzchak");

                            var oren = await session.LoadAsync <User>("users/oren");

                            Assert.Equal(10, fitzchak.Balance);
                            Assert.Equal(10, oren.Balance);
                        }

                        controller.ReplicateOnce();
                        using (var session = store2.OpenAsyncSession())
                        {
                            Assert.True(WaitForDocument <User>(store2, "users/michael", u => u.Balance == 0));
                            var fitzchak = await session.LoadAsync <User>("users/fitzchak");

                            var oren = await session.LoadAsync <User>("users/oren");

                            Assert.Equal(20, fitzchak.Balance);
                            Assert.Equal(10, oren.Balance);
                        }

                        controller.ReplicateOnce();
                        using (var session = store2.OpenAsyncSession())
                        {
                            Assert.True(WaitForDocument <User>(store2, "users/oren", u => u.Balance == 15));
                            var fitzchak = await session.LoadAsync <User>("users/fitzchak");

                            var michael = await session.LoadAsync <User>("users/michael");

                            Assert.Equal(15, fitzchak.Balance);
                            Assert.Equal(0, michael.Balance);
                        }

                        controller.ReplicateOnce();
                        using (var session = store2.OpenAsyncSession())
                        {
                            Assert.True(WaitForDocument <User>(store2, "users/oren", u => u.Balance == 20));
                            var fitzchak = await session.LoadAsync <User>("users/fitzchak");

                            var michael = await session.LoadAsync <User>("users/michael");

                            Assert.Equal(10, fitzchak.Balance);
                            Assert.Null(michael);
                        }

                        controller.ReplicateOnce();
                        using (var session = store2.OpenAsyncSession())
                        {
                            Assert.True(WaitForDocument <User>(store2, "users/oren", u => u.Balance == 10));
                            var fitzchak = await session.LoadAsync <User>("users/fitzchak");

                            var michael = await session.LoadAsync <User>("users/michael");

                            Assert.Equal(10, fitzchak.Balance);
                            Assert.Equal(10, michael.Balance);
                        }
                    }
                }
        }
Beispiel #5
0
        public async Task ShouldNotRemoveStatsOfExistingTimeSeries()
        {
            using (var store1 = GetDocumentStore())
                using (var store2 = GetDocumentStore())
                {
                    var users = new List <string>()
                    {
                        "user/1",
                        "user/2",
                        "user/11",
                        "user/21",
                        "user/12",
                        "user/22",
                        "user/3",
                        "user/13"
                    };

                    using (var session = store1.OpenSession())
                    {
                        foreach (string user in users)
                        {
                            session.Store(new User {
                                Name = "EGR"
                            }, user);
                        }

                        session.SaveChanges();
                    }

                    foreach (string user in users)
                    {
                        using (var session = store1.OpenSession())
                        {
                            var tsf = session.TimeSeriesFor(user, "raven");
                            for (int i = 0; i <= 30; i++)
                            {
                                tsf.Append(_baseline.AddDays(i), i);
                            }

                            session.SaveChanges();
                        }
                    }

                    foreach (string user in users)
                    {
                        using (var session = store1.OpenSession())
                        {
                            var tsf = session.TimeSeriesFor(user, "raven");
                            tsf.Delete(_baseline, _baseline.AddDays(29));
                            session.SaveChanges();
                        }
                    }

                    var storage = await Server.ServerStore.DatabasesLandlord.TryGetOrCreateResourceStore(store1.Database);

                    var cleaner = storage.TombstoneCleaner;

                    await SetupReplicationAsync(store1, store2);
                    await EnsureReplicatingAsync(store1, store2);

                    using (var controller = new ReplicationController(storage))
                    {
                        foreach (string user in users)
                        {
                            using (var session = store1.OpenSession())
                            {
                                var tsf = session.TimeSeriesFor(user, "raven");
                                tsf.Delete(_baseline.AddDays(29), _baseline.AddDays(29));
                                tsf.Delete(_baseline.AddDays(30), _baseline.AddDays(30));
                                session.SaveChanges();
                            }
                        }

                        controller.ReplicateOnce();

                        await cleaner.ExecuteCleanup();
                    }

                    await EnsureReplicatingAsync(store1, store2);

                    await cleaner.ExecuteCleanup();

                    var tss = storage.DocumentsStorage.TimeSeriesStorage;

                    using (storage.DocumentsStorage.ContextPool.AllocateOperationContext(out DocumentsOperationContext ctx))
                        using (ctx.OpenReadTransaction())
                        {
                            Assert.Equal(0, tss.Stats.GetNumberOfEntries(ctx));
                        }
                }
        }