Skip to content

Commit b1477d2

Browse files
committed
Implement ELECTRIC_IDLE_WAL_SIZE_CHECK_PERIOD and ELECTRIC_IDLE_WAL_SIZE_THRESHOLD
1 parent 843172a commit b1477d2

File tree

4 files changed

+28
-3
lines changed

4 files changed

+28
-3
lines changed

packages/sync-service/config/runtime.exs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,14 @@ config :electric,
271271
"ELECTRIC_REPLICATION_IDLE_TIMEOUT",
272272
&Electric.Config.parse_human_readable_time!/1,
273273
nil
274-
)
274+
),
275+
idle_wal_size_check_period:
276+
env!(
277+
"ELECTRIC_IDLE_WAL_SIZE_CHECK_PERIOD",
278+
&Electric.Config.parse_human_readable_time!/1,
279+
nil
280+
),
281+
idle_wal_size_threshold: env!("ELECTRIC_IDLE_WAL_SIZE_THRESHOLD", :integer, nil)
275282

276283
if Electric.telemetry_enabled?() do
277284
config :sentry,

packages/sync-service/lib/electric/application.ex

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,9 @@ defmodule Electric.Application do
139139
publication_refresh_period: get_env(opts, :publication_refresh_period),
140140
schema_reconciler_period: get_env(opts, :schema_reconciler_period),
141141
cleanup_interval_ms: get_env(opts, :cleanup_interval_ms),
142-
shape_hibernate_after: get_env(opts, :shape_hibernate_after)
142+
shape_hibernate_after: get_env(opts, :shape_hibernate_after),
143+
idle_wal_size_check_period: get_env(opts, :idle_wal_size_check_period),
144+
idle_wal_size_threshold: get_env(opts, :idle_wal_size_threshold)
143145
],
144146
manual_table_publishing?: get_env(opts, :manual_table_publishing?)
145147
)

packages/sync-service/lib/electric/config.ex

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,13 @@ defmodule Electric.Config do
5050
max_txn_size: 250 * 1024 * 1024,
5151
# Scaling down on idle is disabled by default
5252
replication_idle_timeout: 0,
53+
# If the database provider scales down after 5 min and provided that the
54+
# replication_idle_timeout is about a minute or less, checking WAL size once an hour
55+
# ends up using about 10% of the compute on an otherwise idle database.
56+
idle_wal_size_check_period: 3_600_000,
57+
# We want to wake up and process any transactions that have accumulated in the WAL, hence
58+
# the low threshold.
59+
idle_wal_size_threshold: 1_000,
5360
manual_table_publishing?: false,
5461
## HTTP API
5562
# set enable_http_api: false to turn off the HTTP server totally
@@ -425,7 +432,7 @@ defmodule Electric.Config do
425432
end
426433
end
427434

428-
@time_units ~w[ms msec s sec m min]
435+
@time_units ~w[ms msec s sec m min h hr]
429436

430437
@spec parse_human_readable_time(binary | nil) :: {:ok, pos_integer} | {:error, binary}
431438

@@ -444,6 +451,7 @@ defmodule Electric.Config do
444451
defp time_multiplier(millisecond) when millisecond in ["ms", "msec"], do: 1
445452
defp time_multiplier(second) when second in ["s", "sec"], do: 1000
446453
defp time_multiplier(minute) when minute in ["m", "min"], do: 1000 * 60
454+
defp time_multiplier(hour) when hour in ["h", "hr"], do: 1000 * 60 * 60
447455

448456
def parse_human_readable_time!(str) do
449457
case parse_human_readable_time(str) do

packages/sync-service/lib/electric/stack_supervisor.ex

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,14 @@ defmodule Electric.StackSupervisor do
117117
shape_hibernate_after: [
118118
type: :integer,
119119
default: Electric.Config.default(:shape_hibernate_after)
120+
],
121+
idle_wal_size_check_period: [
122+
type: :integer,
123+
default: Electric.Config.default(:idle_wal_size_check_period)
124+
],
125+
idle_wal_size_threshold: [
126+
type: :integer,
127+
default: Electric.Config.default(:idle_wal_size_threshold)
120128
]
121129
]
122130
],

0 commit comments

Comments
 (0)