public override void ClearReplicationInformationLocalCache(IAsyncFilesCommands client) { var serverClient = (IAsyncFilesCommandsImpl)client; var urlForFilename = serverClient.UrlFor(); var serverHash = ServerHash.GetServerHash(urlForFilename); ReplicationInformerLocalCache.ClearReplicationInformationFromLocalCache(serverHash); }
public List <DocumentStore> CreateRaftCluster(int numberOfNodes, string activeBundles = null, Action <DocumentStore> configureStore = null, [CallerMemberName] string databaseName = null, bool inMemory = true, bool fiddler = false) { if (configureStore == null) { configureStore = defaultConfigureStore; } var nodes = Enumerable.Range(0, numberOfNodes) .Select(x => GetNewServer(GetPort(), activeBundles: activeBundles, databaseName: databaseName, runInMemory: inMemory, configureConfig: configuration => { configuration.Cluster.ElectionTimeout *= 10; configuration.Cluster.HeartbeatTimeout *= 10; })) .ToList(); var allNodesFinishedJoining = new ManualResetEventSlim(); var random = new Random(); var leader = nodes[random.Next(0, numberOfNodes - 1)]; leader.Options.ClusterManager.Value.InitializeTopology(forceCandidateState: true); Assert.True(leader.Options.ClusterManager.Value.Engine.WaitForLeader(), "Leader was not elected by himself in time"); leader.Options.ClusterManager.Value.Engine.TopologyChanged += command => { if (command.Requested.AllNodeNames.All(command.Requested.IsVoter)) { allNodesFinishedJoining.Set(); } }; for (var i = 0; i < numberOfNodes; i++) { var n = nodes[i]; if (n == leader) { continue; } Assert.True(leader.Options.ClusterManager.Value.Engine.AddToClusterAsync(new NodeConnectionInfo { Name = RaftHelper.GetNodeName(n.SystemDatabase.TransactionalStorage.Id), Uri = RaftHelper.GetNodeUrl(n.SystemDatabase.Configuration.ServerUrl) }).Wait(3000), "Failed to add node to cluster"); } if (numberOfNodes == 1) { allNodesFinishedJoining.Set(); } Assert.True(allNodesFinishedJoining.Wait(10000 * numberOfNodes), "Not all nodes become voters. " + leader.Options.ClusterManager.Value.Engine.CurrentTopology); Assert.True(leader.Options.ClusterManager.Value.Engine.WaitForLeader(), "Wait for leader timedout"); WaitForClusterToBecomeNonStale(nodes); foreach (var node in nodes) { var url = node.SystemDatabase.ServerUrl.ForDatabase(databaseName); var serverHash = ServerHash.GetServerHash(url); ReplicationInformerLocalCache.ClearClusterNodesInformationLocalCache(serverHash); ReplicationInformerLocalCache.ClearReplicationInformationFromLocalCache(serverHash); } var documentStores = nodes .Select(node => NewRemoteDocumentStore(ravenDbServer: node, fiddler: fiddler, activeBundles: activeBundles, configureStore: configureStore, databaseName: databaseName)) .ToList(); foreach (var documentStore in documentStores) { ((ClusterAwareRequestExecuter)((ServerClient)documentStore.DatabaseCommands).RequestExecuter).WaitForLeaderTimeout = TimeSpan.FromSeconds(30); } return(documentStores); }