Пример #1
0
        private void OnCacheTimer(object state)
        {
            var tpState = (IndexServiceState)state;

            try
            {
                if (tpState.Net.Api.EndsWith("/Api"))
                {
                    using (var client = ApiFab.CreateNodeApi(tpState.Net.Ip))
                    {
                        // Service available
                        if (tpState.Net.Updating)
                        {
                            tpState.Net.Updating = false;
                        }

                        // Request blocks
                        if ((!tpState.PoolsOut.Any() && !tpState.PoolsIn.Any()))
                        {
                            var result = client.PoolListGet(0, SizeOut);
                            tpState.PoolsOut = result.Pools.Select(p => new PoolInfo(p)).ToList();
                        }
                        else
                        {
                            var result = client.PoolListGet(0, 20);
                            lock (tpState.PoolsLock)
                            {
                                var firstPoolNum = tpState.PoolsIn.Any()
                                    ? tpState.PoolsIn[0].Number
                                    : tpState.PoolsOut[0].Number;
                                var nPools = result.Pools.TakeWhile(p => (p.PoolNumber > firstPoolNum) || (p.PoolNumber < firstPoolNum - 1000)).Select(p => new PoolInfo(p)).ToList();
                                tpState.PoolsIn = nPools.Concat(tpState.PoolsIn).ToList();
                            }
                        }

                        // Request stats
                        if (tpState.StatRequestCounter == 0)
                        {
                            var stats = client.StatsGet();
                            if (stats != null && stats.Stats.Count >= 4)
                            {
                                var statsSorted = stats.Stats.OrderBy(s => s.PeriodDuration).ToList();
                                var statData    = new StatData();
                                for (var i = 0; i < 4; i++)
                                {
                                    statData.Pdata[i] = new PeriodData(statsSorted[i]);
                                }
                                // Smart contracts count = n
                                using (var db = ApiFab.GetDbContext())
                                    statData.Correct(db.Smarts.Count(s => s.Network == tpState.Net.Id));
                                tpState.StatData = statData;
                            }
                        }
                    }
                }
                else
                {
                    using (var client = ApiFab.CreateTestApi(tpState.Net.Ip))
                    {
                        // Service available
                        if (tpState.Net.Updating)
                        {
                            tpState.Net.Updating = false;
                        }

                        // Request blocks
                        if ((!tpState.PoolsOut.Any() && !tpState.PoolsIn.Any()))
                        {
                            var result = client.PoolListGet(0, SizeOut);
                            tpState.PoolsOut = result.Pools.Where(p => p.PoolNumber > 0).Select(p => new PoolInfo(p)).ToList();
                        }
                        else
                        {
                            var result = client.PoolListGet(0, 20);
                            lock (tpState.PoolsLock)
                            {
                                var firstPoolNum = tpState.PoolsIn.Any()
                                    ? tpState.PoolsIn[0].Number
                                    : tpState.PoolsOut[0].Number;
                                var nPools = result.Pools.Where(p => p.PoolNumber > 0).TakeWhile(p => (p.PoolNumber > firstPoolNum) || (p.PoolNumber < firstPoolNum - 1000)).Select(p => new PoolInfo(p)).ToList();
                                tpState.PoolsIn = nPools.Concat(tpState.PoolsIn).ToList();
                            }
                        }

                        // Request stats
                        if (tpState.StatRequestCounter == 0)
                        {
                            var stats = client.StatsGet();
                            if (stats != null && stats.Stats.Count >= 4)
                            {
                                var statsSorted = stats.Stats.OrderBy(s => s.PeriodDuration).ToList();
                                var statData    = new StatData();
                                for (var i = 0; i < 4; i++)
                                {
                                    statData.Pdata[i] = new PeriodData(statsSorted[i]);
                                }
                                tpState.StatData = statData;
                            }
                        }
                    }
                }
                if (tpState.StatRequestCounter < (120000 / Period))
                {
                    tpState.StatRequestCounter++;
                }
                else
                {
                    tpState.StatRequestCounter = 0;
                }
            }
            catch (Thrift.Transport.TTransportException e)
            {
                tpState.Net.Updating = true;
                _logger.LogError(e, "TTransportException in TpsSource.OnCacheTimer");
            }
            catch (Exception e)
            {
                _logger.LogError(e, "Exception in TpsSource.OnCacheTimer");
            }
            tpState.TimerForCache.Change(Period, 0);
        }