ntminer 5 years ago
parent
commit
c491677ec7

+ 3 - 2
src/NTMinerDataSchemas/Core/MinerServer/ClientData.cs

@@ -415,8 +415,9 @@ namespace NTMiner.Core.MinerServer {
             this.AESPasswordOn = minerSign.AESPasswordOn;
             this.AESPasswordOn = minerSign.AESPasswordOn;
         }
         }
 
 
-        public SpeedDto ToSpeedData() {
-            return new SpeedDto {
+        public SpeedData ToSpeedData() {
+            return new SpeedData {
+                SpeedOn = this.MinerActiveOn,
                 AutoRestartKernelTimes = this.AutoRestartKernelTimes,
                 AutoRestartKernelTimes = this.AutoRestartKernelTimes,
                 AutoStartDelaySeconds = this.AutoStartDelaySeconds,
                 AutoStartDelaySeconds = this.AutoStartDelaySeconds,
                 BootOn = this.BootOn,
                 BootOn = this.BootOn,

+ 13 - 5
src/NTMinerDataSchemas/Report/SpeedData.cs

@@ -1,4 +1,5 @@
-using NTMiner.Core;
+using Newtonsoft.Json;
+using NTMiner.Core;
 using NTMiner.Core.MinerClient;
 using NTMiner.Core.MinerClient;
 using System;
 using System;
 
 
@@ -6,12 +7,19 @@ namespace NTMiner.Report {
     public class SpeedData : ISpeedData {
     public class SpeedData : ISpeedData {
         private readonly SpeedDto _speedDto;
         private readonly SpeedDto _speedDto;
 
 
-        public SpeedData() {
-            _speedDto = new SpeedDto();
+        [JsonIgnore]
+        public SpeedDto SpeedDto {
+            get {
+                return _speedDto;
+            }
+        }
+
+        public SpeedData() : this(new SpeedDto(), DateTime.Now) {
         }
         }
 
 
-        public SpeedData(SpeedDto speedDto) {
-            _speedDto = speedDto;
+        public SpeedData(SpeedDto speedDto, DateTime speedOn) {
+            this._speedDto = speedDto;
+            this.SpeedOn = speedOn;
         }
         }
 
 
         public DateTime SpeedOn { get; set; }
         public DateTime SpeedOn { get; set; }

+ 3 - 3
src/NTMinerServer/Core/Redis/ISpeedDataRedis.cs

@@ -5,9 +5,9 @@ using System.Threading.Tasks;
 
 
 namespace NTMiner.Core.Redis {
 namespace NTMiner.Core.Redis {
     public interface ISpeedDataRedis {
     public interface ISpeedDataRedis {
-        Task<List<SpeedDto>> GetAllAsync();
-        Task<SpeedDto> GetByClientIdAsync(Guid clientId);
-        Task SetAsync(SpeedDto speedDto);
+        Task<List<SpeedData>> GetAllAsync();
+        Task<SpeedData> GetByClientIdAsync(Guid clientId);
+        Task SetAsync(SpeedData speedData);
         Task DeleteByClientIdAsync(Guid clientId);
         Task DeleteByClientIdAsync(Guid clientId);
     }
     }
 }
 }

+ 9 - 9
src/NTMinerServer/Core/Redis/Impl/SpeedDataRedis.cs

@@ -13,13 +13,13 @@ namespace NTMiner.Core.Redis.Impl {
             _connection = connection;
             _connection = connection;
         }
         }
 
 
-        public Task<List<SpeedDto>> GetAllAsync() {
+        public Task<List<SpeedData>> GetAllAsync() {
             var db = _connection.GetDatabase();
             var db = _connection.GetDatabase();
             return db.HashGetAllAsync(_redisKeySpeedDataByClientId).ContinueWith(t => {
             return db.HashGetAllAsync(_redisKeySpeedDataByClientId).ContinueWith(t => {
-                List<SpeedDto> list = new List<SpeedDto>();
+                List<SpeedData> list = new List<SpeedData>();
                 foreach (var item in t.Result) {
                 foreach (var item in t.Result) {
                     if (item.Value.HasValue) {
                     if (item.Value.HasValue) {
-                        SpeedDto data = VirtualRoot.JsonSerializer.Deserialize<SpeedDto>(item.Value);
+                        SpeedData data = VirtualRoot.JsonSerializer.Deserialize<SpeedData>(item.Value);
                         if (data != null) {
                         if (data != null) {
                             list.Add(data);
                             list.Add(data);
                         }
                         }
@@ -29,14 +29,14 @@ namespace NTMiner.Core.Redis.Impl {
             });
             });
         }
         }
 
 
-        public Task<SpeedDto> GetByClientIdAsync(Guid clientId) {
+        public Task<SpeedData> GetByClientIdAsync(Guid clientId) {
             if (clientId == Guid.Empty) {
             if (clientId == Guid.Empty) {
-                return Task.FromResult<SpeedDto>(null);
+                return Task.FromResult<SpeedData>(null);
             }
             }
             var db = _connection.GetDatabase();
             var db = _connection.GetDatabase();
             return db.HashGetAsync(_redisKeySpeedDataByClientId, clientId.ToString()).ContinueWith(t => {
             return db.HashGetAsync(_redisKeySpeedDataByClientId, clientId.ToString()).ContinueWith(t => {
                 if (t.Result.HasValue) {
                 if (t.Result.HasValue) {
-                    return VirtualRoot.JsonSerializer.Deserialize<SpeedDto>(t.Result);
+                    return VirtualRoot.JsonSerializer.Deserialize<SpeedData>(t.Result);
                 }
                 }
                 else {
                 else {
                     return null;
                     return null;
@@ -44,12 +44,12 @@ namespace NTMiner.Core.Redis.Impl {
             });
             });
         }
         }
 
 
-        public Task SetAsync(SpeedDto speedDto) {
-            if (speedDto == null || speedDto.ClientId == Guid.Empty) {
+        public Task SetAsync(SpeedData speedData) {
+            if (speedData == null || speedData.ClientId == Guid.Empty) {
                 return TaskEx.CompletedTask;
                 return TaskEx.CompletedTask;
             }
             }
             var db = _connection.GetDatabase();
             var db = _connection.GetDatabase();
-            return db.HashSetAsync(_redisKeySpeedDataByClientId, speedDto.ClientId.ToString(), VirtualRoot.JsonSerializer.Serialize(speedDto));
+            return db.HashSetAsync(_redisKeySpeedDataByClientId, speedData.ClientId.ToString(), VirtualRoot.JsonSerializer.Serialize(speedData));
         }
         }
 
 
         public Task DeleteByClientIdAsync(Guid clientId) {
         public Task DeleteByClientIdAsync(Guid clientId) {

+ 8 - 6
src/WebApiServer/Core/Impl/ClientDataSet.cs

@@ -22,11 +22,12 @@ namespace NTMiner.Core.Impl {
                 Write.UserInfo($"从redis加载了 {getMinersTask.Result.Count} 条MinerData,和 {getSpeedsTask.Result.Count} 条SpeedData");
                 Write.UserInfo($"从redis加载了 {getMinersTask.Result.Count} 条MinerData,和 {getSpeedsTask.Result.Count} 条SpeedData");
                 var speedDatas = getSpeedsTask.Result;
                 var speedDatas = getSpeedsTask.Result;
                 List<ClientData> clientDatas = new List<ClientData>();
                 List<ClientData> clientDatas = new List<ClientData>();
+                DateTime speedOn = DateTime.Now.AddMinutes(-3);
                 foreach (var minerData in getMinersTask.Result) {
                 foreach (var minerData in getMinersTask.Result) {
                     var clientData = ClientData.Create(minerData);
                     var clientData = ClientData.Create(minerData);
                     clientDatas.Add(clientData);
                     clientDatas.Add(clientData);
                     var speedData = speedDatas.FirstOrDefault(a => a.ClientId == minerData.ClientId);
                     var speedData = speedDatas.FirstOrDefault(a => a.ClientId == minerData.ClientId);
-                    if (speedData != null) {
+                    if (speedData != null && speedData.SpeedOn > speedOn) {
                         clientData.Update(speedData, out bool _);
                         clientData.Update(speedData, out bool _);
                     }
                     }
                 }
                 }
@@ -37,9 +38,10 @@ namespace NTMiner.Core.Impl {
             _speedDataRedis = speedDataRedis;
             _speedDataRedis = speedDataRedis;
             VirtualRoot.AddEventPath<Per1MinuteEvent>("周期清理Redis中不活跃的来自挖矿端上报的算力记录", LogEnum.DevConsole, action: message => {
             VirtualRoot.AddEventPath<Per1MinuteEvent>("周期清理Redis中不活跃的来自挖矿端上报的算力记录", LogEnum.DevConsole, action: message => {
                 DateTime time = message.BornOn.AddSeconds(-130);
                 DateTime time = message.BornOn.AddSeconds(-130);
-                var toRemoves = _dicByClientId.Where(a => a.Value.MinerActiveOn <= time).Select(a => a.Key).ToArray();
-                foreach (var key in toRemoves) {
-                    _speedDataRedis.DeleteByClientIdAsync(key);
+                var toRemoves = _dicByClientId.Where(a => a.Value.MinerActiveOn != DateTime.MinValue && a.Value.MinerActiveOn <= time).ToArray();
+                foreach (var kv in toRemoves) {
+                    kv.Value.MinerActiveOn = DateTime.MinValue;
+                    _speedDataRedis.DeleteByClientIdAsync(kv.Key);
                 }
                 }
             }, this.GetType());
             }, this.GetType());
             _mqSender = mqSender;
             _mqSender = mqSender;
@@ -56,7 +58,7 @@ namespace NTMiner.Core.Impl {
                     return;
                     return;
                 }
                 }
                 speedDataRedis.GetByClientIdAsync(message.ClientId).ContinueWith(t => {
                 speedDataRedis.GetByClientIdAsync(message.ClientId).ContinueWith(t => {
-                    ReportSpeed(t.Result, message.MinerIp, isFromWsServerNode: true);
+                    ReportSpeed(t.Result.SpeedDto, message.MinerIp, isFromWsServerNode: true);
                 });
                 });
             }, this.GetType());
             }, this.GetType());
             VirtualRoot.AddEventPath<MinerClientWsOpenedMqMessage>("收到MinerClientWsOpenedMq消息后更新NetActiveOn和IsOnline", LogEnum.None, action: message => {
             VirtualRoot.AddEventPath<MinerClientWsOpenedMqMessage>("收到MinerClientWsOpenedMq消息后更新NetActiveOn和IsOnline", LogEnum.None, action: message => {
@@ -125,7 +127,7 @@ namespace NTMiner.Core.Impl {
                 return;
                 return;
             }
             }
             if (!isFromWsServerNode) {
             if (!isFromWsServerNode) {
-                _speedDataRedis.SetAsync(speedDto);
+                _speedDataRedis.SetAsync(new SpeedData(speedDto, DateTime.Now));
             }
             }
             ClientData clientData = GetByClientId(speedDto.ClientId);
             ClientData clientData = GetByClientId(speedDto.ClientId);
             if (clientData == null) {
             if (clientData == null) {

+ 1 - 1
src/WsServer/MinerClientWsMessageHandler.cs

@@ -53,7 +53,7 @@ namespace NTMiner {
             {WsMessage.Speed,
             {WsMessage.Speed,
                 (wsBehavior, loginName, clientId, message) => {
                 (wsBehavior, loginName, clientId, message) => {
                     if (message.TryGetData(out SpeedDto speedDto)) {
                     if (message.TryGetData(out SpeedDto speedDto)) {
-                        WsRoot.SpeedDataRedis.SetAsync(speedDto).ContinueWith(t => {
+                        WsRoot.SpeedDataRedis.SetAsync(new SpeedData(speedDto, DateTime.Now)).ContinueWith(t => {
                             WsRoot.MinerClientMqSender.SendSpeed(loginName, speedDto.ClientId, wsBehavior.Context.UserEndPoint.ToString());
                             WsRoot.MinerClientMqSender.SendSpeed(loginName, speedDto.ClientId, wsBehavior.Context.UserEndPoint.ToString());
                         });
                         });
                     }
                     }