示例#1
0
        /// <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: "");
        }
示例#2
0
        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)
 {
 }
示例#7
0
 /// <inheritdoc />
 public void ReportReputation(MachineLocation location, MachineReputation reputation) =>
 MachineReputationTracker.ReportReputation(location, reputation);
 void IDistributedContentCopierHost.ReportReputation(MachineLocation location, MachineReputation reputation)
 {
     _contentLocationStore.MachineReputationTracker.ReportReputation(location, reputation);
 }