Exemple #1
0
        private void CanRedefineFailoverBehaviorFromServerSide(FailoverBehavior storeBehavior, FailoverBehavior serverBehavior)
        {
            var clusterStores = CreateRaftCluster(1, "replication");

            using (var store = clusterStores[0])
            {
                using (var session = store.OpenSession())
                {
                    session.Store(new ReplicationDocument
                    {
                        ClientConfiguration = new ReplicationClientConfiguration
                        {
                            FailoverBehavior = serverBehavior
                        }
                    }, "Raven/Replication/Destinations");
                    session.SaveChanges();
                }

                using (var secondStore = new DocumentStore
                {
                    Url = store.Url,
                    Conventions =
                    {
                        FailoverBehavior = storeBehavior
                    },
                    DefaultDatabase = store.DefaultDatabase
                }.Initialize())
                {
                    Assert.True(SpinWait.SpinUntil(() => secondStore.Conventions.FailoverBehavior == serverBehavior, TimeSpan.FromSeconds(30)));
                }
            }
        }
        private void CanRedefineFailoverBehaviorFromServerSide(FailoverBehavior storeBehavior, FailoverBehavior serverBehavior)
        {
            var clusterStores = CreateRaftCluster(1, "replication");

            using (var store = clusterStores[0])
            {
                using (var session = store.OpenSession())
                {
                    session.Store(new ReplicationDocument
                    {
                        ClientConfiguration = new ReplicationClientConfiguration
                        {
                            FailoverBehavior = serverBehavior
                        }
                    }, "Raven/Replication/Destinations");
                    session.SaveChanges();
                }

                using (var secondStore = new DocumentStore
                {
                    Url = store.Url,
                    Conventions =
                    {
                        FailoverBehavior = storeBehavior
                    },
                    DefaultDatabase = store.DefaultDatabase
                }.Initialize())
                {
                    var client = ((AsyncServerClient)secondStore.AsyncDatabaseCommands);
                    AsyncHelpers.RunSync(() => client.RequestExecuter.UpdateReplicationInformationIfNeededAsync(client, force: true));
                    Assert.True(SpinWait.SpinUntil(() => secondStore.Conventions.FailoverBehavior == serverBehavior, TimeSpan.FromSeconds(30)));
                }
            }
        }
Exemple #3
0
        private void CanReadFromMultipleServersInternal(int numberOfNodes, FailoverBehavior failoverBehavior)
        {
            var clusterStores = CreateRaftCluster(numberOfNodes, activeBundles: "Replication", configureStore: store => store.Conventions.FailoverBehavior = failoverBehavior);

            SetupClusterConfiguration(clusterStores);
            Enumerable.Range(0, numberOfNodes).ForEach(i => clusterStores[0].DatabaseCommands.Put($"keys/{i}", null, new RavenJObject(), new RavenJObject()));

            using (ForceNonClusterRequests(clusterStores))
            {
                clusterStores.ForEach(store => WaitForDocument(store.DatabaseCommands, $"keys/{numberOfNodes - 1}"));
            }

            //Here i want to fetch the topology after a leader was elected so all stores will have latest topology.
            clusterStores.ForEach(store =>
            {
                var client = ((AsyncServerClient)store.AsyncDatabaseCommands);
                AsyncHelpers.RunSync(() => client.RequestExecuter.UpdateReplicationInformationIfNeededAsync(client, force: true));
            });
            var tasks = new List <ReplicationTask>();

            foreach (var server in servers)
            {
                server.Options.DatabaseLandlord.ForAllDatabases(database => tasks.Add(database.StartupTasks.OfType <ReplicationTask>().First()));
                server.Options.ClusterManager.Value.Engine.Dispose();
            }

            foreach (var task in tasks)
            {
                task.Pause();
                SpinWait.SpinUntil(() => task.IsRunning == false, TimeSpan.FromSeconds(3));
            }

            servers.ForEach(server => server.Options.RequestManager.ResetNumberOfRequests());

            using (ForceNonClusterRequests(clusterStores))
            {
                for (int i = 0; i < clusterStores.Count; i++)
                {
                    var store = clusterStores[i];
                    Enumerable.Range(0, numberOfNodes).ForEach(j => store.DatabaseCommands.Get($"keys/{j}"));
                }
            }
            servers.ForEach(server =>
            {
                Assert.True(server.Options.RequestManager.NumberOfRequests >= numberOfNodes);
            });

            servers.Clear();
        }
Exemple #4
0
        private void WithFailoversInternal(int numberOfNodes, FailoverBehavior failoverBehavior)
        {
            using (WithCustomDatabaseSettings(doc => doc.Settings["Raven/Replication/ReplicationRequestTimeout"] = "4000"))
            {
                var clusterStores = CreateRaftCluster(numberOfNodes, activeBundles: "Replication", configureStore: s => s.Conventions.FailoverBehavior = failoverBehavior);

                foreach (var documentStore in clusterStores)
                {
                    // set lower timeout to reduce test time
                    documentStore.JsonRequestFactory.RequestTimeout = TimeSpan.FromSeconds(15);
                }

                SetupClusterConfiguration(clusterStores);

                clusterStores.ForEach(store =>
                                      AsyncHelpers.RunSync(() => ((ServerClient)store.DatabaseCommands).RequestExecuter.UpdateReplicationInformationIfNeededAsync((AsyncServerClient)store.AsyncDatabaseCommands, force: true)));

                for (int i = 0; i < clusterStores.Count; i++)
                {
                    var store = clusterStores[i];

                    store.DatabaseCommands.Put("keys/" + i, null, new RavenJObject(), new RavenJObject());
                }

                using (ForceNonClusterRequests(clusterStores))
                {
                    for (int i = 0; i < clusterStores.Count; i++)
                    {
                        clusterStores.ForEach(store => WaitForDocument(store.DatabaseCommands, "keys/" + i));
                    }
                }

                var oldLeader = servers.First(x => x.Options.ClusterManager.Value.IsLeader());
                oldLeader.Dispose();

                for (int i = 0; i < clusterStores.Count; i++)
                {
                    var store = clusterStores[i];

                    store.DatabaseCommands.Put("keys/" + (i + clusterStores.Count), null, new RavenJObject(), new RavenJObject());
                }

                for (int i = 0; i < clusterStores.Count; i++)
                {
                    clusterStores.ForEach(store => WaitForDocument(store.DatabaseCommands, "keys/" + (i + clusterStores.Count)));
                }
            }
        }
Exemple #5
0
        public HttpJsonRequest AddReplicationStatusHeaders(string thePrimaryUrl, string currentUrl, IDocumentStoreReplicationInformer replicationInformer, FailoverBehavior failoverBehavior, Action <NameValueCollection, string, string> handleReplicationStatusChanges)
        {
            if (thePrimaryUrl.Equals(currentUrl, StringComparison.OrdinalIgnoreCase))
            {
                return(this);
            }
            if (replicationInformer.GetFailureCount(thePrimaryUrl) <= 0)
            {
                return(this); // not because of failover, no need to do this.
            }
            var lastPrimaryCheck = replicationInformer.GetFailureLastCheck(thePrimaryUrl);

            headers.Set(Constants.RavenClientPrimaryServerUrl, ToRemoteUrl(thePrimaryUrl));
            headers.Set(Constants.RavenClientPrimaryServerLastCheck, lastPrimaryCheck.ToString("s"));

            primaryUrl   = thePrimaryUrl;
            operationUrl = currentUrl;

            HandleReplicationStatusChanges = handleReplicationStatusChanges;

            return(this);
        }
Exemple #6
0
		public HttpJsonRequest AddReplicationStatusHeaders(string thePrimaryUrl, string currentUrl, ReplicationInformer replicationInformer, FailoverBehavior failoverBehavior, Action<NameValueCollection, string, string> handleReplicationStatusChanges)
		{
			if (thePrimaryUrl.Equals(currentUrl, StringComparison.InvariantCultureIgnoreCase))
				return this;
			if (replicationInformer.GetFailureCount(thePrimaryUrl) <= 0)
				return this; // not because of failover, no need to do this.

			var lastPrimaryCheck = replicationInformer.GetFailureLastCheck(thePrimaryUrl);
			webRequest.Headers.Add(Constants.RavenClientPrimaryServerUrl, ToRemoteUrl(thePrimaryUrl));
			webRequest.Headers.Add(Constants.RavenClientPrimaryServerLastCheck, lastPrimaryCheck.ToString("s"));

			primaryUrl = thePrimaryUrl;
			operationUrl = currentUrl;

			HandleReplicationStatusChanges = handleReplicationStatusChanges;

			return this;
		}