/// <inheritdoc />
        public Task UpdatePerformanceAsync(IPAddress address, JudgeNodePerformanceInfo performanceInfo)
        {
            Contract.NotNull(address, nameof(address));
            Contract.NotNull(performanceInfo, nameof(performanceInfo));

            WithStore(store =>
            {
                if (store.TryGetValue(address, out var info))
                {
                    info.Performance   = performanceInfo;
                    info.LastHeartBeat = DateTime.UtcNow;
                    info.LastSeen      = DateTime.UtcNow;
                }
                else
                {
                    var newInfo = new JudgeNodeInfo(address)
                    {
                        Performance   = performanceInfo,
                        LastHeartBeat = DateTime.UtcNow,
                        LastSeen      = DateTime.UtcNow
                    };
                    store.Add(address, newInfo);
                    RemoveExpiredOnNecessary();
                }
            });

            return(Task.CompletedTask);
        }
        /// <inheritdoc />
        public Task UpdateLastSeenAsync(IPAddress address)
        {
            Contract.NotNull(address, nameof(address));

            WithStore(store =>
            {
                if (store.TryGetValue(address, out var info))
                {
                    info.LastSeen = DateTime.UtcNow;
                }
                else
                {
                    var newInfo = new JudgeNodeInfo(address)
                    {
                        LastSeen = DateTime.UtcNow
                    };
                    store.Add(address, newInfo);
                    RemoveExpiredOnNecessary();
                }
            });

            return(Task.CompletedTask);
        }