ntminer 5 years ago
parent
commit
9a4e6731a4

+ 16 - 4
src/NTMinerDataSchemas/Core/MinerServer/ServerState.cs

@@ -1,11 +1,14 @@
-namespace NTMiner.Core.MinerServer {
+using System;
+
+namespace NTMiner.Core.MinerServer {
     public class ServerState {
         public static readonly ServerState Empty = new ServerState {
             JsonFileVersion = string.Empty,
             MinerClientVersion = string.Empty,
             Time = 0,
             MessageTimestamp = 0,
-            OutputKeywordTimestamp = 0
+            OutputKeywordTimestamp = 0,
+            WsStatus = WsStatus.Undefined
         };
 
         public static ServerState FromLine(string line) {
@@ -14,6 +17,7 @@
             long time = Timestamp.GetTimestamp();
             long messageTimestamp = 0;
             long kernelOutputKeywordTimestamp = 0;
+            WsStatus wsStatus = WsStatus.Undefined;
             if (!string.IsNullOrEmpty(line)) {
                 line = line.Trim();
                 string[] parts = line.Split(new char[] { '|' });
@@ -32,20 +36,24 @@
                 if (parts.Length > 4) {
                     long.TryParse(parts[4], out kernelOutputKeywordTimestamp);
                 }
+                if (parts.Length > 5) {
+                    Enum.TryParse(parts[5], out wsStatus);
+                }
             }
             return new ServerState {
                 JsonFileVersion = jsonFileVersion,
                 MinerClientVersion = minerClientVersion,
                 Time = time,
                 MessageTimestamp = messageTimestamp,
-                OutputKeywordTimestamp = kernelOutputKeywordTimestamp
+                OutputKeywordTimestamp = kernelOutputKeywordTimestamp,
+                WsStatus = wsStatus
             };
         }
 
         public ServerState() { }
 
         public string ToLine() {
-            return $"{this.JsonFileVersion}|{this.MinerClientVersion}|{this.Time.ToString()}|{this.MessageTimestamp.ToString()}|{this.OutputKeywordTimestamp.ToString()}";
+            return $"{JsonFileVersion}|{MinerClientVersion}|{Time.ToString()}|{MessageTimestamp.ToString()}|{OutputKeywordTimestamp.ToString()}|{WsStatus.ToString()}";
         }
 
         /// <summary>
@@ -68,5 +76,9 @@
         /// 内核输出关键字时间戳
         /// </summary>
         public long OutputKeywordTimestamp { get; set; }
+        /// <summary>
+        /// <see cref="MinerServer.WsStatus"/>
+        /// </summary>
+        public WsStatus WsStatus { get; set; }
     }
 }

+ 13 - 0
src/NTMinerDataSchemas/Core/MinerServer/WsStatus.cs

@@ -0,0 +1,13 @@
+namespace NTMiner.Core.MinerServer {
+    /// <summary>
+    /// 服务器Ws服务的状态,该状态在ServerState中夹带着返回给客户端从而提供给客户端一个提早发现服务端Ws服务可用状态的机会。
+    /// 为什么说提早呢?
+    /// 因为挖矿端每重试连接Ws服务失败一次会延长重试周期,从而多次重试不成功后周期会大于2分钟,而每两分钟会有一次算力上报,
+    /// 算力上报成功时的返回值中带有服务端Ws服务的状态,从而客户端总是有机会在两分钟左右发现服务端的Ws服务的可用状态。
+    /// </summary>
+    public enum WsStatus {
+        Undefined,
+        Online,
+        Offline
+    }
+}

+ 1 - 0
src/NTMinerDataSchemas/NTMinerDataSchemas.csproj

@@ -49,6 +49,7 @@
     <Compile Include="Core\MinerServer\IClientData.cs" />
     <Compile Include="Core\MinerServer\IMinerSign.cs" />
     <Compile Include="Core\MinerServer\MinerSign.cs" />
+    <Compile Include="Core\MinerServer\WsStatus.cs" />
     <Compile Include="Core\OperationResultDto.cs" />
     <Compile Include="Core\OperationResultData.cs" />
     <Compile Include="Core\Profile\WorkIgnoreAttribute.cs" />

+ 3 - 1
src/WebApiServer/Core/IWsServerNodeSet.cs

@@ -1,9 +1,11 @@
-using NTMiner.Ws;
+using NTMiner.Core.MinerServer;
+using NTMiner.Ws;
 using System;
 using System.Collections.Generic;
 
 namespace NTMiner.Core {
     public interface IWsServerNodeSet {
+        WsStatus WsStatus { get; }
         string GetTargetNode(Guid clientId);
         void SetNodeState(WsServerNodeState data);
         void RemoveNode(string address);

+ 8 - 1
src/WebApiServer/Core/Impl/WsServerNodeSet.cs

@@ -1,4 +1,5 @@
-using NTMiner.Core.Mq.Senders;
+using NTMiner.Core.MinerServer;
+using NTMiner.Core.Mq.Senders;
 using NTMiner.Ws;
 using System;
 using System.Collections.Generic;
@@ -44,6 +45,12 @@ namespace NTMiner.Core.Impl {
             }, this.GetType());
         }
 
+        public WsStatus WsStatus {
+            get {
+                return _dicByIp.Count != 0 ? WsStatus.Online : WsStatus.Offline;
+            }
+        }
+
         public string GetTargetNode(Guid clientId) {
             return _consistentHash.GetTargetNode(clientId);
         }

+ 2 - 1
src/WebApiServer/WebApiRoot.cs

@@ -156,7 +156,8 @@ namespace NTMiner {
                 MinerClientVersion = minerClientVersion,
                 Time = Timestamp.GetTimestamp(),
                 MessageTimestamp = Timestamp.GetTimestamp(ServerMessageTimestamp),
-                OutputKeywordTimestamp = Timestamp.GetTimestamp(KernelOutputKeywordTimestamp)
+                OutputKeywordTimestamp = Timestamp.GetTimestamp(KernelOutputKeywordTimestamp),
+                WsStatus = WsServerNodeSet.WsStatus
             };
         }