Exemple #1
0
 public void Update(CoinSnapshotData data)
 {
     this.Speed = data.Speed;
     this.MainCoinMiningCount = data.MainCoinMiningCount;
     this.MainCoinOnlineCount = data.MainCoinOnlineCount;
     this.Timestamp           = data.Timestamp;
 }
Exemple #2
0
 private CoinSnapshotDataViewModels()
 {
     if (WpfUtil.IsInDesignMode)
     {
         return;
     }
     foreach (var coinVm in AppRoot.CoinVms.AllCoins)
     {
         _dicByCoinCode.Add(coinVm.Code, new CoinSnapshotDataViewModel(CoinSnapshotData.CreateEmpty(coinVm.Code)));
     }
 }
Exemple #3
0
        private void Snapshot(List <ClientCoinSnapshotData> clientCoinSpeedList, DateTime timestamp)
        {
            InitOnece();
            Dictionary <string, List <ClientCoinSnapshotData> > clientCoinSpeedDic = clientCoinSpeedList.GroupBy(a => a.CoinCode).ToDictionary(a => a.Key, a => a.ToList());
            List <CoinSnapshotData> data = new List <CoinSnapshotData>();

            lock (_locker) {
                foreach (var item in clientCoinSpeedDic)
                {
                    Dictionary <Guid, ClientCoinSnapshotData> dic = new Dictionary <Guid, ClientCoinSnapshotData>();
                    foreach (var clientCoinSnapshotData in item.Value)
                    {
                        if (!dic.ContainsKey(clientCoinSnapshotData.ClientId))
                        {
                            dic.Add(clientCoinSnapshotData.ClientId, clientCoinSnapshotData);
                        }
                        else
                        {
                            dic[clientCoinSnapshotData.ClientId] = clientCoinSnapshotData;
                        }
                    }
                    long             speed         = dic.Values.Sum(a => a.Speed);
                    int              shareDelta    = dic.Values.Sum(a => a.ShareDelta);
                    CoinSnapshotData snapshotdData = new CoinSnapshotData {
                        Id                  = ObjectId.NewObjectId(),
                        CoinCode            = item.Key,
                        MainCoinMiningCount = _root.ClientSet.CountMainCoinMining(item.Key),
                        MainCoinOnlineCount = _root.ClientSet.CountMainCoinOnline(item.Key),
                        DualCoinMiningCount = _root.ClientSet.CountDualCoinMining(item.Key),
                        DualCoinOnlineCount = _root.ClientSet.CountDualCoinOnline(item.Key),
                        Timestamp           = timestamp,
                        ShareDelta          = shareDelta,
                        Speed               = speed
                    };
                    data.Add(snapshotdData);
                }
                _dataList.AddRange(data);
                DateTime time = timestamp.AddMinutes(-20);
                List <CoinSnapshotData> toRemoves = _dataList.Where(a => a.Timestamp < time).ToList();
                foreach (var item in toRemoves)
                {
                    _dataList.Remove(item);
                }
            }
            if (data.Count > 0)
            {
                using (LiteDatabase db = HostRoot.CreateReportDb()) {
                    var col = db.GetCollection <CoinSnapshotData>();
                    col.Insert(data);
                }
                Global.Logger.InfoDebugLine("拍摄快照" + data.Count + "张,快照时间戳:" + timestamp.ToString("yyyy-MM-dd HH:mm:ss fff"));
            }
        }
Exemple #4
0
            private CoinSnapshotDataViewModels()
            {
                if (WpfUtil.IsInDesignMode)
                {
                    return;
                }
#if DEBUG
                NTStopwatch.Start();
#endif
                foreach (var coinVm in AppRoot.CoinVms.AllCoins)
                {
                    _dicByCoinCode.Add(coinVm.Code, new CoinSnapshotDataViewModel(CoinSnapshotData.CreateEmpty(coinVm.Code)));
                }
#if DEBUG
                var elapsedMilliseconds = NTStopwatch.Stop();
                if (elapsedMilliseconds.ElapsedMilliseconds > NTStopwatch.ElapsedMilliseconds)
                {
                    Write.DevTimeSpan($"耗时{elapsedMilliseconds} {this.GetType().Name}.ctor");
                }
#endif
            }
Exemple #5
0
        /// <summary>
        ///
        /// </summary>
        private void Snapshot(DateTime now)
        {
            InitOnece();
            try {
                int onlineCount = 0;
                int miningCount = 0;
                Dictionary <string, CoinSnapshotData> dicByCoinCode = new Dictionary <string, CoinSnapshotData>();
                foreach (var clientData in _root.ClientSet.AsEnumerable())
                {
                    if (HostRoot.Instance.HostConfig.IsPull)
                    {
                        if (clientData.ModifiedOn.AddSeconds(15) < now)
                        {
                            continue;
                        }
                    }
                    else
                    {
                        if (clientData.ModifiedOn.AddSeconds(130) < now)
                        {
                            continue;
                        }
                    }

                    onlineCount++;

                    if (string.IsNullOrEmpty(clientData.MainCoinCode))
                    {
                        continue;
                    }

                    if (!dicByCoinCode.TryGetValue(clientData.MainCoinCode, out CoinSnapshotData mainCoinSnapshotData))
                    {
                        mainCoinSnapshotData = new CoinSnapshotData()
                        {
                            Timestamp = now,
                            CoinCode  = clientData.MainCoinCode
                        };
                        dicByCoinCode.Add(clientData.MainCoinCode, mainCoinSnapshotData);
                    }

                    if (clientData.IsMining)
                    {
                        miningCount++;
                        mainCoinSnapshotData.MainCoinMiningCount += 1;
                        mainCoinSnapshotData.Speed            += clientData.MainCoinSpeed;
                        mainCoinSnapshotData.ShareDelta       += clientData.GetMainCoinShareDelta(HostRoot.Instance.HostConfig.IsPull);
                        mainCoinSnapshotData.RejectShareDelta += clientData.GetMainCoinRejectShareDelta(HostRoot.Instance.HostConfig.IsPull);
                    }

                    mainCoinSnapshotData.MainCoinOnlineCount += 1;

                    if (!string.IsNullOrEmpty(clientData.DualCoinCode) && clientData.IsDualCoinEnabled)
                    {
                        if (!dicByCoinCode.TryGetValue(clientData.DualCoinCode, out CoinSnapshotData dualCoinSnapshotData))
                        {
                            dualCoinSnapshotData = new CoinSnapshotData()
                            {
                                Timestamp = now,
                                CoinCode  = clientData.DualCoinCode
                            };
                            dicByCoinCode.Add(clientData.DualCoinCode, dualCoinSnapshotData);
                        }

                        if (clientData.IsMining)
                        {
                            dualCoinSnapshotData.DualCoinMiningCount += 1;
                            dualCoinSnapshotData.Speed            += clientData.DualCoinSpeed;
                            dualCoinSnapshotData.ShareDelta       += clientData.GetDualCoinShareDelta(HostRoot.Instance.HostConfig.IsPull);
                            dualCoinSnapshotData.RejectShareDelta += clientData.GetDualCoinRejectShareDelta(HostRoot.Instance.HostConfig.IsPull);
                        }

                        dualCoinSnapshotData.DualCoinOnlineCount += 1;
                    }
                }

                HostRoot.ClientCount.Update(onlineCount, miningCount);
                if (dicByCoinCode.Count > 0)
                {
                    _dataList.AddRange(dicByCoinCode.Values);
                    using (LiteDatabase db = HostRoot.CreateReportDb()) {
                        var col = db.GetCollection <CoinSnapshotData>();
                        col.Insert(dicByCoinCode.Values);
                    }
                    Write.DevDebug("拍摄快照" + dicByCoinCode.Count + "张,快照时间戳:" + now.ToString("yyyy-MM-dd HH:mm:ss fff"));
                }
            }
            catch (Exception e) {
                Logger.ErrorDebugLine(e);
            }
        }
Exemple #6
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="user">传null表示是内网群控调用</param>
        /// <param name="query"></param>
        /// <param name="total"></param>
        /// <param name="coinSnapshots"></param>
        /// <param name="onlineCount"></param>
        /// <param name="miningCount"></param>
        /// <returns></returns>
        public List <ClientData> QueryClients(
            IUser user,
            QueryClientsRequest query,
            out int total,
            out CoinSnapshotData[] coinSnapshots,
            out int onlineCount,
            out int miningCount)
        {
            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();
            coinSnapshots = new CoinSnapshotData[0];
            onlineCount   = 0;
            miningCount   = 0;
            if (!IsReadied || query == null)
            {
                total = 0;
                return(new List <ClientData>());
            }
            List <ClientData> list = new List <ClientData>();

            ClientData[] data       = null;
            bool         isIntranet = user == null;

            if (isIntranet)
            {
                data = _dicByObjectId.Values.ToArray();
            }
            else if (user.IsAdmin())
            {
                data = _dicByObjectId.Values.ToArray();
            }
            else
            {
                string loginName = user.LoginName;
                if (string.IsNullOrEmpty(loginName))
                {
                    total = 0;
                    return(new List <ClientData>());
                }
                if (!_clientDatasByLoginName.TryGetValue(loginName, out ClientDatas clientDatas))
                {
                    clientDatas = new ClientDatas(loginName, _dicByObjectId.Values.Where(a => a.LoginName == loginName).ToList());
                    _clientDatasByLoginName[loginName] = clientDatas;
                }
                data = clientDatas.Datas;
            }
            bool isFilterByGroup     = query.GroupId.HasValue && query.GroupId.Value != Guid.Empty;
            bool isFilterByMinerIp   = !string.IsNullOrEmpty(query.MinerIp);
            bool isFilterByMinerName = !string.IsNullOrEmpty(query.MinerName);
            bool isFilterByVersion   = !string.IsNullOrEmpty(query.Version);
            bool isFilterByWork      = query.WorkId.HasValue && query.WorkId.Value != Guid.Empty;
            bool isFilterByCoin      = !isFilterByWork && !string.IsNullOrEmpty(query.Coin);
            bool isFilterByPool      = !isFilterByWork && !string.IsNullOrEmpty(query.Pool);
            bool isFilterByWallet    = !isFilterByWork && !string.IsNullOrEmpty(query.Wallet);
            bool isFilterByKernel    = !isFilterByWork && !string.IsNullOrEmpty(query.Kernel);
            bool isFilterByGpuType   = query.GpuType != GpuType.Empty;
            bool isFilterByGpuName   = !string.IsNullOrEmpty(query.GpuName);
            bool isFilterByGpuDriver = !string.IsNullOrEmpty(query.GpuDriver);

            for (int i = 0; i < data.Length; i++)
            {
                var  item      = data[i];
                bool isInclude = true;
                if (isInclude && isFilterByGroup)
                {
                    isInclude = item.GroupId == query.GroupId.Value;
                }
                if (isInclude)
                {
                    switch (query.MineState)
                    {
                    case MineStatus.All:
                        break;

                    case MineStatus.Mining:
                        isInclude = item.IsMining == true;
                        break;

                    case MineStatus.UnMining:
                        isInclude = item.IsMining == false;
                        break;

                    default:
                        break;
                    }
                }
                if (isInclude && isFilterByMinerIp)
                {
                    isInclude = !string.IsNullOrEmpty(item.LocalIp) && item.LocalIp.Contains(query.MinerIp);
                    if (!isInclude)
                    {
                        if (query.MinerIp.IndexOf(':') != -1)
                        {
                            isInclude = query.MinerIp.Equals(item.MinerIp);
                        }
                        else if (!string.IsNullOrEmpty(item.MinerIp))
                        {
                            // MinerIp可能带有端口号
                            int    index   = item.MinerIp.IndexOf(':');
                            string minerIp = item.MinerIp;
                            if (index != -1)
                            {
                                minerIp = minerIp.Substring(0, index);
                            }
                            isInclude = query.MinerIp.Equals(minerIp);
                        }
                    }
                }
                if (isInclude && isFilterByMinerName)
                {
                    isInclude = (!string.IsNullOrEmpty(item.MinerName) && item.MinerName.IndexOf(query.MinerName, StringComparison.OrdinalIgnoreCase) != -1) ||
                                (!string.IsNullOrEmpty(item.WorkerName) && item.WorkerName.IndexOf(query.MinerName, StringComparison.OrdinalIgnoreCase) != -1);
                }
                if (isInclude && isFilterByVersion)
                {
                    isInclude = !string.IsNullOrEmpty(item.Version) && item.Version.Contains(query.Version);
                }
                if (isInclude)
                {
                    if (isFilterByWork)
                    {
                        isInclude = item.WorkId == query.WorkId.Value;
                    }
                    else
                    {
                        if (isInclude && isFilterByCoin)
                        {
                            isInclude = query.Coin.Equals(item.MainCoinCode) || query.Coin.Equals(item.DualCoinCode);
                        }
                        if (isInclude && isFilterByPool)
                        {
                            isInclude = query.Pool.Equals(item.MainCoinPool) || query.Pool.Equals(item.DualCoinPool);
                        }
                        if (isInclude && isFilterByWallet)
                        {
                            isInclude = query.Wallet.Equals(item.MainCoinWallet) || query.Wallet.Equals(item.DualCoinWallet);
                        }
                        if (isInclude && isFilterByKernel)
                        {
                            isInclude = !string.IsNullOrEmpty(item.Kernel) && item.Kernel.IgnoreCaseContains(query.Kernel);
                        }
                    }
                }
                if (isInclude && isFilterByGpuType)
                {
                    isInclude = item.GpuType == query.GpuType;
                }
                if (isInclude && isFilterByGpuName)
                {
                    isInclude = !string.IsNullOrEmpty(item.GpuInfo) && item.GpuInfo.IgnoreCaseContains(query.GpuName);
                }
                if (isInclude && isFilterByGpuDriver)
                {
                    isInclude = !string.IsNullOrEmpty(item.GpuDriver) && item.GpuDriver.IgnoreCaseContains(query.GpuDriver);
                }
                if (isInclude)
                {
                    list.Add(item);
                }
            }
            total = list.Count();
            list.Sort(new ClientDataComparer(query.SortDirection, query.SortField));
            coinSnapshots = VirtualRoot.CreateCoinSnapshots(_isPull, DateTime.Now, data, out onlineCount, out miningCount).ToArray();
            var      results = list.Take(query).ToList();
            DateTime time    = DateTime.Now.AddSeconds(_isPull ? -20 : -180);

            // 一定时间未上报算力视为0算力
            foreach (var clientData in results)
            {
                if (clientData.MinerActiveOn < time)
                {
                    clientData.DualCoinSpeed = 0;
                    clientData.MainCoinSpeed = 0;
                }
            }
            stopwatch.Stop();
            _queryClientsMilliseconds.Enqueue(stopwatch.ElapsedMilliseconds);
            while (_queryClientsMilliseconds.Count > 100)
            {
                _queryClientsMilliseconds.Dequeue();
            }
            return(results);
        }
Exemple #7
0
        private void RefreshTotalSpeedChart(int limit)
        {
            //NTMinerRoot.Current.DebugLine($"获取总算力数据,范围{leftTime} - {rightTime}");
            RpcRoot.Server.ControlCenterService.GetLatestSnapshotsAsync(
                limit,
                (response, exception) => {
                if (response == null)
                {
                    return;
                }

                if (!response.IsSuccess())
                {
                    Write.UserFail(response.ReadMessage(exception));
                    return;
                }
                UIThread.Execute(() => {
                    bool isOnlyOne      = limit == 1;
                    Vm.TotalMiningCount = response.TotalMiningCount;
                    Vm.TotalOnlineCount = response.TotalOnlineCount;
                    foreach (var chartVm in Vm.ChartVms)
                    {
                        var list = response.Data.Where(a => a.CoinCode == chartVm.CoinVm.Code).ToList();
                        if (list.Count == 0)
                        {
                            list.Add(new CoinSnapshotData {
                                CoinCode            = chartVm.CoinVm.Code,
                                DualCoinOnlineCount = 0,
                                DualCoinMiningCount = 0,
                                MainCoinOnlineCount = 0,
                                MainCoinMiningCount = 0,
                                RejectShareDelta    = 0,
                                ShareDelta          = 0,
                                Speed     = 0,
                                Timestamp = DateTime.Now.AddSeconds(-5)
                            });
                        }
                        CoinSnapshotData one = null;
                        if (isOnlyOne)
                        {
                            one = list.Last();
                        }
                        else
                        {
                            list = list.OrderBy(a => a.Timestamp).ToList();
                        }
                        CoinSnapshotData latestData = list.Last();
                        chartVm.SnapshotDataVm.Update(latestData);
                        foreach (var riser in chartVm.Series)
                        {
                            if (riser.Title == "speed")
                            {
                                if (list.Count > 0)
                                {
                                    if (isOnlyOne)
                                    {
                                        riser.Values.Add(new MeasureModel()
                                        {
                                            DateTime = one.Timestamp,
                                            Value    = one.Speed
                                        });
                                    }
                                    else
                                    {
                                        foreach (var item in list)
                                        {
                                            riser.Values.Add(new MeasureModel()
                                            {
                                                DateTime = item.Timestamp,
                                                Value    = item.Speed
                                            });
                                        }
                                    }
                                }
                            }
                            else if (riser.Title == "onlineCount")
                            {
                                if (isOnlyOne)
                                {
                                    riser.Values.Add(new MeasureModel()
                                    {
                                        DateTime = one.Timestamp,
                                        Value    = one.MainCoinOnlineCount + one.DualCoinOnlineCount
                                    });
                                }
                                else
                                {
                                    foreach (var item in list)
                                    {
                                        riser.Values.Add(new MeasureModel()
                                        {
                                            DateTime = item.Timestamp,
                                            Value    = item.MainCoinOnlineCount + item.DualCoinOnlineCount
                                        });
                                    }
                                }
                            }
                            else if (riser.Title == "miningCount")
                            {
                                if (isOnlyOne)
                                {
                                    riser.Values.Add(new MeasureModel()
                                    {
                                        DateTime = one.Timestamp,
                                        Value    = one.MainCoinMiningCount + one.DualCoinMiningCount
                                    });
                                }
                                else
                                {
                                    foreach (var item in list)
                                    {
                                        riser.Values.Add(new MeasureModel()
                                        {
                                            DateTime = item.Timestamp,
                                            Value    = item.MainCoinMiningCount + item.DualCoinMiningCount
                                        });
                                    }
                                }
                            }
                            else if (riser.Title == "rejectShare")
                            {
                                if (isOnlyOne)
                                {
                                    riser.Values.Add(new MeasureModel()
                                    {
                                        DateTime = one.Timestamp,
                                        Value    = one.RejectShareDelta
                                    });
                                }
                                else
                                {
                                    foreach (var item in list)
                                    {
                                        riser.Values.Add(new MeasureModel()
                                        {
                                            DateTime = item.Timestamp,
                                            Value    = item.RejectShareDelta
                                        });
                                    }
                                }
                            }
                            else if (riser.Title == "acceptShare")
                            {
                                if (isOnlyOne)
                                {
                                    riser.Values.Add(new MeasureModel()
                                    {
                                        DateTime = one.Timestamp,
                                        Value    = one.ShareDelta
                                    });
                                }
                                else
                                {
                                    foreach (var item in list)
                                    {
                                        riser.Values.Add(new MeasureModel()
                                        {
                                            DateTime = item.Timestamp,
                                            Value    = item.ShareDelta
                                        });
                                    }
                                }
                            }
                        }
                        DateTime now = DateTime.Now.AddSeconds(10);
                        foreach (var riser in chartVm.Series)
                        {
                            IChartValues valuesTotal = riser.Values;
                            if (valuesTotal.Count > 0 && ((MeasureModel)valuesTotal[0]).DateTime.AddMinutes(NTMinerRoot.SpeedHistoryLengthByMinute) < now)
                            {
                                valuesTotal.RemoveAt(0);
                            }
                        }
                        chartVm.SetAxisLimits(now);
                    }
                });
            });
        }
 public CoinSnapshotDataViewModel(CoinSnapshotData data)
 {
     _data = data;
 }
        private void RefreshTotalSpeedChart(int limit)
        {
            //NTMinerRoot.Current.DebugLine($"获取总算力数据,范围{leftTime} - {rightTime}");
            var coinCodes = NTMinerRoot.Current.CoinSet.Select(a => a.Code).ToList();

            Server.ControlCenterService.GetLatestSnapshots(
                limit,
                coinCodes,
                (response) => {
                if (response == null)
                {
                    return;
                }
                Execute.OnUIThread(() => {
                    bool isOnlyOne      = limit == 1;
                    Vm.TotalMiningCount = response.TotalMiningCount;
                    Vm.TotalOnlineCount = response.TotalOnlineCount;
                    //NTMinerRoot.Current.DebugLine($"获取了{data.Count}条");
                    foreach (var chartVm in Vm.TotalVms)
                    {
                        var list = response.Data.Where(a => a.CoinCode == chartVm.CoinVm.Code).ToList();
                        if (list.Count != 0)
                        {
                            list = list.OrderBy(a => a.Timestamp).ToList();
                            CoinSnapshotData latestData = list.Last();
                            chartVm.SnapshotDataVm.Update(latestData);
                            foreach (var seriy in chartVm.Series)
                            {
                                if (seriy.Title == "speed")
                                {
                                    if (list.Count > 0)
                                    {
                                        if (isOnlyOne)
                                        {
                                            var item = list.Last();
                                            seriy.Values.Add(new MeasureModel()
                                            {
                                                DateTime = item.Timestamp,
                                                Value    = item.Speed
                                            });
                                        }
                                        else
                                        {
                                            foreach (var item in list)
                                            {
                                                seriy.Values.Add(new MeasureModel()
                                                {
                                                    DateTime = item.Timestamp,
                                                    Value    = item.Speed
                                                });
                                            }
                                        }
                                    }
                                }
                                else if (seriy.Title == "onlineCount")
                                {
                                    if (isOnlyOne)
                                    {
                                        var item = list.Last();
                                        seriy.Values.Add(new MeasureModel()
                                        {
                                            DateTime = item.Timestamp,
                                            Value    = item.MainCoinOnlineCount + item.DualCoinOnlineCount
                                        });
                                    }
                                    else
                                    {
                                        foreach (var item in list)
                                        {
                                            seriy.Values.Add(new MeasureModel()
                                            {
                                                DateTime = item.Timestamp,
                                                Value    = item.MainCoinOnlineCount + item.DualCoinOnlineCount
                                            });
                                        }
                                    }
                                }
                                else if (seriy.Title == "miningCount")
                                {
                                    if (isOnlyOne)
                                    {
                                        var item = list.Last();
                                        seriy.Values.Add(new MeasureModel()
                                        {
                                            DateTime = item.Timestamp,
                                            Value    = item.MainCoinMiningCount + item.DualCoinMiningCount
                                        });
                                    }
                                    else
                                    {
                                        foreach (var item in list)
                                        {
                                            seriy.Values.Add(new MeasureModel()
                                            {
                                                DateTime = item.Timestamp,
                                                Value    = item.MainCoinMiningCount + item.DualCoinMiningCount
                                            });
                                        }
                                    }
                                }
                            }
                        }
                        DateTime now = DateTime.Now;
                        foreach (var seriy in chartVm.Series)
                        {
                            IChartValues valuesTotal = seriy.Values;
                            if (valuesTotal.Count > 0 && ((MeasureModel)valuesTotal[0]).DateTime.AddMinutes(NTMinerRoot.Current.SpeedHistoryLengthByMinute) < now)
                            {
                                valuesTotal.RemoveAt(0);
                            }
                        }
                    }
                });
            });
        }
Exemple #10
0
        public static ICollection <CoinSnapshotData> CreateCoinSnapshots(bool isPull, DateTime now, ClientData[] data, out int onlineCount, out int miningCount)
        {
            onlineCount = 0;
            miningCount = 0;
            Dictionary <string, CoinSnapshotData> dicByCoinCode = new Dictionary <string, CoinSnapshotData>();

            foreach (var clientData in data)
            {
                if (isPull)
                {
                    if (clientData.MinerActiveOn.AddSeconds(15) < now)
                    {
                        if (clientData.IsMining)
                        {
                            clientData.IsMining = false;
                        }
                        continue;
                    }
                }
                else
                {
                    if (clientData.MinerActiveOn.AddSeconds(130) < now)
                    {
                        if (clientData.IsMining)
                        {
                            clientData.IsMining = false;
                        }
                        continue;
                    }
                }

                onlineCount++;

                if (string.IsNullOrEmpty(clientData.MainCoinCode))
                {
                    continue;
                }

                if (!dicByCoinCode.TryGetValue(clientData.MainCoinCode, out CoinSnapshotData mainCoinSnapshotData))
                {
                    mainCoinSnapshotData = new CoinSnapshotData()
                    {
                        Timestamp = now,
                        CoinCode  = clientData.MainCoinCode
                    };
                    dicByCoinCode.Add(clientData.MainCoinCode, mainCoinSnapshotData);
                }

                if (clientData.IsMining)
                {
                    miningCount++;
                    mainCoinSnapshotData.MainCoinMiningCount += 1;
                    // TODO:考虑是否应该针对每一个币种配置一个最大正常算力
                    if ("ETH".Equals(clientData.MainCoinCode, StringComparison.OrdinalIgnoreCase))
                    {
                        if (clientData.MainCoinSpeed < 2 * NTKeyword.DoubleG)
                        {
                            mainCoinSnapshotData.Speed += clientData.MainCoinSpeed;
                        }
                    }
                    else
                    {
                        mainCoinSnapshotData.Speed += clientData.MainCoinSpeed;
                    }
                }

                mainCoinSnapshotData.MainCoinOnlineCount += 1;

                if (!string.IsNullOrEmpty(clientData.DualCoinCode) && clientData.IsDualCoinEnabled)
                {
                    if (!dicByCoinCode.TryGetValue(clientData.DualCoinCode, out CoinSnapshotData dualCoinSnapshotData))
                    {
                        dualCoinSnapshotData = new CoinSnapshotData()
                        {
                            Timestamp = now,
                            CoinCode  = clientData.DualCoinCode
                        };
                        dicByCoinCode.Add(clientData.DualCoinCode, dualCoinSnapshotData);
                    }

                    if (clientData.IsMining)
                    {
                        // TODO:考虑是否应该针对每一个币种配置一个最大正常算力
                        if ("ETH".Equals(clientData.DualCoinCode, StringComparison.OrdinalIgnoreCase))
                        {
                            if (clientData.DualCoinSpeed < 2 * NTKeyword.DoubleG)
                            {
                                dualCoinSnapshotData.Speed += clientData.DualCoinSpeed;
                            }
                        }
                        else
                        {
                            dualCoinSnapshotData.Speed += clientData.DualCoinSpeed;
                        }
                    }
                }
            }

            return(dicByCoinCode.Values);
        }
Exemple #11
0
        public static ICollection <CoinSnapshotData> CreateCoinSnapshots(bool isPull, DateTime now, IEnumerable <ClientData> data, out int onlineCount, out int miningCount)
        {
            onlineCount = 0;
            miningCount = 0;
            Dictionary <string, CoinSnapshotData> dicByCoinCode = new Dictionary <string, CoinSnapshotData>();

            foreach (var clientData in data)
            {
                if (isPull)
                {
                    if (clientData.MinerActiveOn.AddSeconds(15) < now)
                    {
                        continue;
                    }
                }
                else
                {
                    if (clientData.MinerActiveOn.AddSeconds(130) < now)
                    {
                        continue;
                    }
                }

                onlineCount++;

                if (string.IsNullOrEmpty(clientData.MainCoinCode))
                {
                    continue;
                }

                if (!dicByCoinCode.TryGetValue(clientData.MainCoinCode, out CoinSnapshotData mainCoinSnapshotData))
                {
                    mainCoinSnapshotData = new CoinSnapshotData()
                    {
                        Timestamp = now,
                        CoinCode  = clientData.MainCoinCode
                    };
                    dicByCoinCode.Add(clientData.MainCoinCode, mainCoinSnapshotData);
                }

                if (clientData.IsMining)
                {
                    miningCount++;
                    mainCoinSnapshotData.MainCoinMiningCount += 1;
                    mainCoinSnapshotData.Speed            += clientData.MainCoinSpeed;
                    mainCoinSnapshotData.ShareDelta       += clientData.GetMainCoinShareDelta(isPull);
                    mainCoinSnapshotData.RejectShareDelta += clientData.GetMainCoinRejectShareDelta(isPull);
                }

                mainCoinSnapshotData.MainCoinOnlineCount += 1;

                if (!string.IsNullOrEmpty(clientData.DualCoinCode) && clientData.IsDualCoinEnabled)
                {
                    if (!dicByCoinCode.TryGetValue(clientData.DualCoinCode, out CoinSnapshotData dualCoinSnapshotData))
                    {
                        dualCoinSnapshotData = new CoinSnapshotData()
                        {
                            Timestamp = now,
                            CoinCode  = clientData.DualCoinCode
                        };
                        dicByCoinCode.Add(clientData.DualCoinCode, dualCoinSnapshotData);
                    }

                    if (clientData.IsMining)
                    {
                        dualCoinSnapshotData.DualCoinMiningCount += 1;
                        dualCoinSnapshotData.Speed            += clientData.DualCoinSpeed;
                        dualCoinSnapshotData.ShareDelta       += clientData.GetDualCoinShareDelta(isPull);
                        dualCoinSnapshotData.RejectShareDelta += clientData.GetDualCoinRejectShareDelta(isPull);
                    }

                    dualCoinSnapshotData.DualCoinOnlineCount += 1;
                }
            }

            return(dicByCoinCode.Values);
        }
Exemple #12
0
        public List <ClientData> QueryClients(
            IUser user,
            QueryClientsRequest query,
            out int total,
            out CoinSnapshotData[] coinSnapshots,
            out int onlineCount,
            out int miningCount)
        {
            coinSnapshots = new CoinSnapshotData[0];
            onlineCount   = 0;
            miningCount   = 0;
            if (!IsReadied)
            {
                total = 0;
                return(new List <ClientData>());
            }
            List <ClientData> list = new List <ClientData>();
            var  data                = _dicByObjectId.Values.ToArray();
            bool isFilterByUser      = user != null && !string.IsNullOrEmpty(user.LoginName) && !user.IsAdmin();
            bool isFilterByGroup     = query.GroupId.HasValue && query.GroupId.Value != Guid.Empty;
            bool isFilterByMinerIp   = !string.IsNullOrEmpty(query.MinerIp);
            bool isFilterByMinerName = !string.IsNullOrEmpty(query.MinerName);
            bool isFilterByVersion   = !string.IsNullOrEmpty(query.Version);
            bool isFilterByWork      = query.WorkId.HasValue && query.WorkId.Value != Guid.Empty;
            bool isFilterByCoin      = !isFilterByWork && !string.IsNullOrEmpty(query.Coin);
            bool isFilterByPool      = !isFilterByWork && !string.IsNullOrEmpty(query.Pool);
            bool isFilterByWallet    = !isFilterByWork && !string.IsNullOrEmpty(query.Wallet);
            bool isFilterByKernel    = !isFilterByWork && !string.IsNullOrEmpty(query.Kernel);
            bool isFilterByGpuType   = query.GpuType != GpuType.Empty;
            bool isFilterByGpuName   = !string.IsNullOrEmpty(query.GpuName);
            bool isFilterByGpuDriver = !string.IsNullOrEmpty(query.GpuDriver);

            for (int i = 0; i < data.Length; i++)
            {
                var  item      = data[i];
                bool isInclude = true;
                if (isInclude && isFilterByUser)
                {
                    isInclude = user.LoginName.Equals(item.LoginName);
                }
                if (isInclude && isFilterByGroup)
                {
                    isInclude = item.GroupId == query.GroupId.Value;
                }
                if (isInclude)
                {
                    switch (query.MineState)
                    {
                    case MineStatus.All:
                        break;

                    case MineStatus.Mining:
                        isInclude = item.IsMining == true;
                        break;

                    case MineStatus.UnMining:
                        isInclude = item.IsMining == false;
                        break;

                    default:
                        break;
                    }
                }
                if (isInclude && isFilterByMinerIp)
                {
                    isInclude = query.MinerIp.Equals(item.MinerIp) || (!string.IsNullOrEmpty(item.LocalIp) && item.LocalIp.Contains(query.MinerIp));
                }
                if (isInclude && isFilterByMinerName)
                {
                    isInclude = (!string.IsNullOrEmpty(item.MinerName) && item.MinerName.IndexOf(query.MinerName, StringComparison.OrdinalIgnoreCase) != -1) ||
                                (!string.IsNullOrEmpty(item.WorkerName) && item.WorkerName.IndexOf(query.MinerName, StringComparison.OrdinalIgnoreCase) != -1);
                }
                if (isInclude && isFilterByVersion)
                {
                    isInclude = !string.IsNullOrEmpty(item.Version) && item.Version.Contains(query.Version);
                }
                if (isInclude)
                {
                    if (isFilterByWork)
                    {
                        isInclude = item.WorkId == query.WorkId.Value;
                    }
                    else
                    {
                        if (isInclude && isFilterByCoin)
                        {
                            isInclude = query.Coin.Equals(item.MainCoinCode) || query.Coin.Equals(item.DualCoinCode);
                        }
                        if (isInclude && isFilterByPool)
                        {
                            isInclude = query.Pool.Equals(item.MainCoinPool) || query.Pool.Equals(item.DualCoinPool);
                        }
                        if (isInclude && isFilterByWallet)
                        {
                            isInclude = query.Wallet.Equals(item.MainCoinWallet) || query.Wallet.Equals(item.DualCoinWallet);
                        }
                        if (isInclude && isFilterByKernel)
                        {
                            isInclude = !string.IsNullOrEmpty(item.Kernel) && item.Kernel.IgnoreCaseContains(query.Kernel);
                        }
                    }
                }
                if (isInclude && isFilterByGpuType)
                {
                    isInclude = item.GpuType == query.GpuType;
                }
                if (isInclude && isFilterByGpuName)
                {
                    isInclude = !string.IsNullOrEmpty(item.GpuInfo) && item.GpuInfo.IgnoreCaseContains(query.GpuName);
                }
                if (isInclude && isFilterByGpuDriver)
                {
                    isInclude = !string.IsNullOrEmpty(item.GpuDriver) && item.GpuDriver.IgnoreCaseContains(query.GpuDriver);
                }
                if (isInclude)
                {
                    list.Add(item);
                }
            }
            total = list.Count();
            list.Sort(new ClientDataComparer(query.SortDirection, query.SortField));
            ClientData[] items = (user == null || user.IsAdmin()) ? data : data.Where(a => a.LoginName == user.LoginName).ToArray();
            coinSnapshots = VirtualRoot.CreateCoinSnapshots(_isPull, DateTime.Now, items, out onlineCount, out miningCount).ToArray();
            var      results = list.Take(query).ToList();
            DateTime time    = DateTime.Now.AddSeconds(_isPull ? -20 : -180);

            // 一定时间未上报算力视为0算力
            foreach (var clientData in results)
            {
                if (clientData.MinerActiveOn < time)
                {
                    clientData.DualCoinSpeed = 0;
                    clientData.MainCoinSpeed = 0;
                }
            }
            return(results);
        }