//TODO: When counter replication will be refactored (simplified) -> the parameter should be removed; now its a constraint of the interface public void RefreshReplicationInformation() { JsonDocument document; var serverHash = ServerHash.GetServerHash(counterStore.Url); try { var replicationFetchTask = counterStore.GetReplicationsAsync(); replicationFetchTask.Wait(); if (replicationFetchTask.Status != TaskStatus.Faulted) { failureCounters.ResetFailureCount(counterStore.Url); } document = new JsonDocument { DataAsJson = RavenJObject.FromObject(replicationFetchTask.Result) }; } catch (Exception e) { log.ErrorException("Could not contact master for fetching replication information. Something is wrong.", e); document = ReplicationInformerLocalCache.TryLoadReplicationInformationFromLocalCache(serverHash); if (document == null || document.DataAsJson == null) { throw; } } ReplicationInformerLocalCache.TrySavingReplicationInformationToLocalCache(serverHash, document); UpdateReplicationInformationFromDocument(document); }
/// <summary> /// Refreshes the replication information. /// Expert use only. /// </summary> public override void RefreshReplicationInformation(IAsyncFilesCommands commands) { lock (this) { var serverClient = (IAsyncFilesCommandsImpl)commands; string urlForFilename = serverClient.UrlFor(); var serverHash = ServerHash.GetServerHash(urlForFilename); JsonDocument document = null; try { var config = serverClient.Configuration.GetKeyAsync <RavenJObject>(SynchronizationConstants.RavenSynchronizationDestinations).Result; failureCounts[urlForFilename] = new FailureCounter(); // we just hit the master, so we can reset its failure count if (config != null) { var destinationsArray = config.Value <RavenJArray>("Destinations"); if (destinationsArray != null) { document = new JsonDocument(); document.DataAsJson = new RavenJObject() { { "Destinations", destinationsArray } }; } } } catch (Exception e) { log.ErrorException("Could not contact master for new replication information", e); document = ReplicationInformerLocalCache.TryLoadReplicationInformationFromLocalCache(serverHash); } if (document == null) { lastReplicationUpdate = SystemTime.UtcNow; // checked and not found return; } ReplicationInformerLocalCache.TrySavingReplicationInformationToLocalCache(serverHash, document); UpdateReplicationInformationFromDocument(document); lastReplicationUpdate = SystemTime.UtcNow; } }
/// <summary> /// Refreshes the replication information. /// Expert use only. /// </summary> public override void RefreshReplicationInformation(IAsyncFilesCommands commands) { lock (this) { var serverClient = (IAsyncFilesCommandsImpl)commands; var urlForFilename = serverClient.UrlFor(); var serverHash = ServerHash.GetServerHash(urlForFilename); JsonDocument document = null; try { var destinations = serverClient.Synchronization.GetDestinationsAsync().Result; FailureCounters.FailureCounts[urlForFilename] = new FailureCounter(); // we just hit the master, so we can reset its failure count if (destinations != null) { document = new JsonDocument { DataAsJson = new RavenJObject { { "Destinations", RavenJToken.FromObject(destinations) } } }; } } catch (Exception e) { Log.ErrorException("Could not contact master for new replication information", e); document = ReplicationInformerLocalCache.TryLoadReplicationInformationFromLocalCache(serverHash); } if (document == null) { lastReplicationUpdate = SystemTime.UtcNow; ReplicationDestinations.Clear(); // clear destinations that could be retrieved from local storage return; } if (IsInvalidDestinationsDocument(document) == false) { ReplicationInformerLocalCache.TrySavingReplicationInformationToLocalCache(serverHash, document); UpdateReplicationInformationFromDocument(document); } lastReplicationUpdate = SystemTime.UtcNow; } }
internal bool UpdateTopology(AsyncServerClient serverClient, OperationMetadata node, ReplicationDocumentWithClusterInformation replicationDocument, string serverHash, OperationMetadata prevLeader) { Nodes = GetNodes(node, replicationDocument); var newLeader = Nodes.SingleOrDefault(x => x.ClusterInformation.IsLeader); var document = new JsonDocument { DataAsJson = RavenJObject.FromObject(replicationDocument) }; ReplicationInformerLocalCache.TrySavingReplicationInformationToLocalCache(serverHash, document); if (replicationDocument.ClientConfiguration != null) { if (replicationDocument.ClientConfiguration.FailoverBehavior == null) { if (Log.IsDebugEnabled) { Log.Debug($"Server side failoever configuration is set to let client decide, client decided on {serverClient.convention.FailoverBehavior}. "); } replicationDocument.ClientConfiguration.FailoverBehavior = serverClient.convention.FailoverBehavior; } else if (Log.IsDebugEnabled) { Log.Debug($"Server enforced failoever behavior {replicationDocument.ClientConfiguration.FailoverBehavior}. "); } serverClient.convention.UpdateFrom(replicationDocument.ClientConfiguration); } if (newLeader != null) { SetLeaderNodeToKnownLeader(newLeader); return(true); } //here we try to set leader node to null but we might fail since it was changed. //We just need to make sure that the leader node is not null and we can stop searching. if (SetLeaderNodeToNullIfPrevIsTheSame(prevLeader) == false && LeaderNode != null) { return(true); } return(false); }