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); } } }
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); } }