public override void Dispose()
        {
            foreach (var disposable in _toDispose)
                disposable.Dispose();

            foreach (var server in Servers)
            {
                if (IsGlobalServer(server))
                    continue; // must not dispose the global server

                if (ServersForDisposal.Contains(server) == false)
                    ServersForDisposal.Add(server);
            }

            base.Dispose();
        }
        public async Task CanSnapshotManyCompareExchangeWithExpirationToManyNodes()
        {
            var count      = 3 * 1024;
            var nodesCount = 7;

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

                for (int i = 0; i < nodesCount; i++)
                {
                    var follower = GetNewServer();
                    ServersForDisposal.Add(follower);

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

                    await follower.ServerStore.Engine.WaitForTopology(Leader.TopologyModification.NonVoter);
                }

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

                var val = await WaitForValueAsync(async() =>
                {
                    var stats = await store.Maintenance.SendAsync(new GetDetailedStatisticsOperation());
                    return(stats.CountOfCompareExchange);
                }, 0);

                Assert.Equal(0, val);
            }
        }