diff --git a/CHANGELOG.md b/CHANGELOG.md index d58e22b782..065a512002 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/apps/explorer/lib/explorer/counters/average_block_time.ex b/apps/explorer/lib/explorer/counters/average_block_time.ex index ab49650030..390a69398a 100644 --- a/apps/explorer/lib/explorer/counters/average_block_time.ex +++ b/apps/explorer/lib/explorer/counters/average_block_time.ex @@ -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 + 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 - from(block in Block, - limit: 100, - offset: 100, - order_by: [desc: block.number], - select: {block.number, block.timestamp} - ) + 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)