public void AllCompareExchangeAndExpirationPreserveAfterServerSchemaUpgradeFrom50000(string path, string[] expected)
        {
            var folder = NewDataPath(forceCreateDir: true);

            DoNotReuseServer();

            var zipPath = new PathSetting(path);

            Assert.True(File.Exists(zipPath.FullPath));

            ZipFile.ExtractToDirectory(zipPath.FullPath, folder);

            using (var server = GetNewServer(new ServerCreationOptions {
                DeletePrevious = false, RunInMemory = false, DataDirectory = folder, RegisterForDisposal = false
            }))
            {
                using (server.ServerStore.Engine.ContextPool.AllocateOperationContext(out ClusterOperationContext context))
                {
                    context.OpenReadTransaction();
                    var tmp = expected.ToList();
                    foreach (var expired in CompareExchangeExpirationStorage.GetExpiredValues(context, long.MaxValue))
                    {
                        string k = expired.keySlice.ToString();

                        Assert.Contains(k, expected);
                        tmp.Remove(k);
                    }

                    Assert.Equal(0, tmp.Count);
                }
            }
        }
Example #2
0
        public bool Update(UpdateStep step)
        {
            step.WriteTx.DeleteTree(CompareExchangeExpirationStorage.CompareExchangeByExpiration);
            step.WriteTx.CreateTree(CompareExchangeExpirationStorage.CompareExchangeByExpiration);

            foreach (var(key, value) in GetAllCompareExchange(step.ReadTx))
            {
                if (CompareExchangeExpirationStorage.TryGetExpires(value, out var ticks))
                {
                    Put(step.WriteTx, key, ticks);
                }
            }

            return(true);
        }
        public async Task CanSnapshotCompareExchangeWithExpiration()
        {
            var count = 45;

            var(_, leader) = await CreateRaftCluster(1, watcherCluster : true);

            using (var store = GetDocumentStore(options: new Options
            {
                Server = leader
            }))
            {
                var expiry           = DateTime.Now.AddMinutes(2);
                var compareExchanges = new Dictionary <string, User>();
                await CompareExchangeExpirationTest.AddCompareExchangesWithExpire(count, compareExchanges, store, expiry);

                await CompareExchangeExpirationTest.AssertCompareExchanges(compareExchanges, store, expiry);

                using (leader.ServerStore.Engine.ContextPool.AllocateOperationContext(out ClusterOperationContext context))
                    using (context.OpenReadTransaction())
                    {
                        Assert.Equal(count, CompareExchangeExpirationStorage.GetExpiredValues(context, long.MaxValue).Count());
                    }

                var server2    = GetNewServer();
                var server2Url = server2.ServerStore.GetNodeHttpServerUrl();
                Servers.Add(server2);

                using (var requestExecutor = ClusterRequestExecutor.CreateForSingleNode(leader.WebUrl, null))
                    using (requestExecutor.ContextPool.AllocateOperationContext(out var ctx))
                    {
                        await requestExecutor.ExecuteAsync(new AddClusterNodeCommand(server2Url, watcher : true), ctx);

                        var addDatabaseNode = new AddDatabaseNodeOperation(store.Database);
                        await store.Maintenance.Server.SendAsync(addDatabaseNode);
                    }

                using (server2.ServerStore.Engine.ContextPool.AllocateOperationContext(out ClusterOperationContext context))
                    using (context.OpenReadTransaction())
                    {
                        Assert.Equal(count, CompareExchangeExpirationStorage.GetExpiredValues(context, long.MaxValue).Count());
                    }

                var now = DateTime.UtcNow;
                leader.ServerStore.Observer.Time.UtcDateTime = () => now.AddMinutes(3);

                var leaderCount = WaitForValue(() =>
                {
                    using (leader.ServerStore.Engine.ContextPool.AllocateOperationContext(out ClusterOperationContext context))
                        using (context.OpenReadTransaction())
                        {
                            return(CompareExchangeExpirationStorage.GetExpiredValues(context, long.MaxValue).Count());
                        }
                }, 0, interval: 333);

                Assert.Equal(0, leaderCount);

                var server2count = WaitForValue(() =>
                {
                    using (server2.ServerStore.Engine.ContextPool.AllocateOperationContext(out ClusterOperationContext context))
                        using (context.OpenReadTransaction())
                        {
                            return(CompareExchangeExpirationStorage.GetExpiredValues(context, long.MaxValue).Count());
                        }
                }, 0, interval: 333);

                Assert.Equal(0, server2count);
            }
        }