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); }