/// <summary> /// Reports about new reputation for a given location. /// </summary> public virtual void ReportReputation(MachineLocation location, MachineReputation reputation) { if (!Enabled) { return; } var reputationState = _reputations.GetOrAdd(location, _ => new ReputationState()); string displayLocation = location.ToString(); ChangeReputation(reputation, reputationState, displayLocation, reason: ""); }
public async Task ReputationTrackerTests(MachineReputation badReputation) { await RunTestAsync( new Context(Logger), 3, async context => { var sessions = context.Sessions; var session0 = context.GetDistributedSession(0); var redisStore0 = (RedisContentLocationStore)session0.ContentLocationStore; string content = "MyContent"; // Inserting the content into session 0 var putResult0 = await sessions[0].PutContentAsync(context, content).ShouldBeSuccess(); // Inserting the content into sessions 1 and 2 await sessions[1].PutContentAsync(context, content).ShouldBeSuccess(); await sessions[2].PutContentAsync(context, content).ShouldBeSuccess(); var getBulkResult = await redisStore0.GetBulkAsync(context, new[] { putResult0.ContentHash }, Token, UrgencyHint.Nominal).ShouldBeSuccess(); Assert.Equal(3, getBulkResult.ContentHashesInfo[0].Locations.Count); var firstLocation = getBulkResult.ContentHashesInfo[0].Locations[0]; var reputation = redisStore0.MachineReputationTracker.GetReputation(firstLocation); Assert.Equal(MachineReputation.Good, reputation); // Changing the reputation redisStore0.MachineReputationTracker.ReportReputation(firstLocation, badReputation); reputation = redisStore0.MachineReputationTracker.GetReputation(firstLocation); Assert.Equal(badReputation, reputation); getBulkResult = await redisStore0.GetBulkAsync(context, new[] { putResult0.ContentHash }, Token, UrgencyHint.Nominal).ShouldBeSuccess(); Assert.Equal(3, getBulkResult.ContentHashesInfo[0].Locations.Count); // Location of the machine with bad reputation should be the last one in the list. Assert.Equal(firstLocation, getBulkResult.ContentHashesInfo[0].Locations[2]); // Causing reputation to expire TestClock.UtcNow += TimeSpan.FromHours(1); reputation = redisStore0.MachineReputationTracker.GetReputation(firstLocation); Assert.Equal(MachineReputation.Good, reputation); }); }
/// <summary> /// Reports about new reputation for a given location. /// </summary> public virtual void ReportReputation(MachineLocation location, MachineReputation reputation) { if (!Enabled) { return; } if (reputation == MachineReputation.Good && _clusterState != null && _clusterState.TryResolveMachineId(location, out var machineId) && (_clusterState.IsMachineMarkedInactive(machineId) || _clusterState.IsMachineMarkedClosed(machineId))) { _context.Debug($"Marked machine {machineId}='{location}' active due to report of good reputation."); _clusterState.MarkMachineActive(machineId).IgnoreFailure(); } var reputationState = _reputations.GetOrAdd(location, _ => new ReputationState()); string displayLocation = location.ToString(); ChangeReputation(reputation, reputationState, displayLocation, reason: ""); }
private void ChangeReputation(MachineReputation reputation, ReputationState reputationState, string displayLocation, string reason) { bool reputationChanged = false; var oldReputation = reputationState.Reputation; lock (reputationState) { reputationChanged = reputationState.Reputation != reputation; // Setting a new reputation. // NOTE: This means that the transition from 'Bad' to 'Missing' is possible here. We allow this because Missing means // we were able to connect to the machine, which means that we restored connectivity and the machine's reputation should no // longer be 'Bad' reputationState.Reputation = reputation; switch (reputation) { case MachineReputation.Bad: case MachineReputation.Timeout: reputationState.ExpireTime = _clock.UtcNow + _configuration.BadReputationTtl; break; case MachineReputation.Missing: reputationState.ExpireTime = _clock.UtcNow + _configuration.MissingContentReputationTtl; break; case MachineReputation.Good: reputationState.ExpireTime = DateTime.MaxValue; break; } } if (reputationChanged) { _context.Debug($"Changed reputation{reason} (new: {reputation}, old: {oldReputation}) for machine with location {displayLocation}."); } }
void IDistributedContentCopierHost.ReportReputation(MachineLocation location, MachineReputation reputation) { // Don't report reputation as this component modifies machine locations so they won't be recognized // by the machine reputation tracker }
/// <inheritdoc /> public void ReportReputation(MachineLocation location, MachineReputation reputation) { }
/// <inheritdoc /> public void ReportReputation(MachineLocation location, MachineReputation reputation) => MachineReputationTracker.ReportReputation(location, reputation);
void IDistributedContentCopierHost.ReportReputation(MachineLocation location, MachineReputation reputation) { _contentLocationStore.MachineReputationTracker.ReportReputation(location, reputation); }