Correct avg time calculation

pull/3449/head
Victor Baranov 4 years ago
parent a19fe18974
commit 44d1949050
  1. 1
      CHANGELOG.md
  2. 32
      apps/explorer/lib/explorer/counters/average_block_time.ex

@ -17,6 +17,7 @@
### Fixes
- [#3449](https://github.com/poanetwork/blockscout/pull/3449) - Correct avg time calculation
- [#3440](https://github.com/poanetwork/blockscout/pull/3440) - Rewrite missing blocks range query
- [#3439](https://github.com/poanetwork/blockscout/pull/3439) - Dark mode color fixes (search, charts)
- [#3437](https://github.com/poanetwork/blockscout/pull/3437) - Fix Postgres Docker container

@ -5,7 +5,7 @@ defmodule Explorer.Counters.AverageBlockTime do
Caches the number of token holders of a token.
"""
import Ecto.Query, only: [from: 2]
import Ecto.Query, only: [from: 2, where: 2]
alias Explorer.Chain.Block
alias Explorer.Repo
@ -62,27 +62,28 @@ defmodule Explorer.Counters.AverageBlockTime do
end
defp refresh_timestamps do
timestamps_query =
if Application.get_env(:explorer, :include_uncles_in_average_block_time) do
base_query =
from(block in Block,
limit: 100,
offset: 100,
order_by: [desc: block.number],
select: {block.number, block.timestamp}
)
timestamps_query =
if Application.get_env(:explorer, :include_uncles_in_average_block_time) do
base_query
else
from(block in Block,
limit: 100,
offset: 100,
order_by: [desc: block.number],
where: block.consensus == true,
select: {block.number, block.timestamp}
)
base_query
|> where(consensus: true)
end
timestamps =
timestamps_row =
timestamps_query
|> Repo.all()
timestamps =
timestamps_row
|> Enum.sort_by(fn {_, timestamp} -> timestamp end, &>=/2)
|> Enum.map(fn {number, timestamp} ->
{number, DateTime.to_unix(timestamp, :millisecond)}
@ -111,12 +112,13 @@ defmodule Explorer.Counters.AverageBlockTime do
defp durations(timestamps) do
timestamps
|> Enum.reduce({[], nil}, fn {_, timestamp}, {durations, last_timestamp} ->
|> Enum.reduce({[], nil, nil}, fn {block_number, timestamp}, {durations, last_block_number, last_timestamp} ->
if last_timestamp do
duration = last_timestamp - timestamp
{[duration | durations], timestamp}
block_numbers_range = last_block_number - block_number
duration = (last_timestamp - timestamp) / block_numbers_range
{[duration | durations], block_number, timestamp}
else
{durations, timestamp}
{durations, block_number, timestamp}
end
end)
|> elem(0)

Loading…
Cancel
Save