Skip to content

Commit f6ee468

Browse files
committed
Implement ELECTRIC_IDLE_WAL_SIZE_CHECK_PERIOD and ELECTRIC_IDLE_WAL_SIZE_THRESHOLD
1 parent ffe9fc6 commit f6ee468

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
@@ -272,7 +272,14 @@ config :electric,
272272
"ELECTRIC_REPLICATION_IDLE_TIMEOUT",
273273
&Electric.Config.parse_human_readable_time!/1,
274274
nil
275-
)
275+
),
276+
idle_wal_size_check_period:
277+
env!(
278+
"ELECTRIC_IDLE_WAL_SIZE_CHECK_PERIOD",
279+
&Electric.Config.parse_human_readable_time!/1,
280+
nil
281+
),
282+
idle_wal_size_threshold: env!("ELECTRIC_IDLE_WAL_SIZE_THRESHOLD", :integer, nil)
276283

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

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,9 @@ defmodule Electric.Application do
144144
publication_refresh_period: get_env(opts, :publication_refresh_period),
145145
schema_reconciler_period: get_env(opts, :schema_reconciler_period),
146146
cleanup_interval_ms: get_env(opts, :cleanup_interval_ms),
147-
shape_hibernate_after: get_env(opts, :shape_hibernate_after)
147+
shape_hibernate_after: get_env(opts, :shape_hibernate_after),
148+
idle_wal_size_check_period: get_env(opts, :idle_wal_size_check_period),
149+
idle_wal_size_threshold: get_env(opts, :idle_wal_size_threshold)
148150
],
149151
manual_table_publishing?: get_env(opts, :manual_table_publishing?)
150152
)

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
@@ -418,7 +425,7 @@ defmodule Electric.Config do
418425
end
419426
end
420427

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

423430
@spec parse_human_readable_time(binary | nil) :: {:ok, pos_integer} | {:error, binary}
424431

@@ -437,6 +444,7 @@ defmodule Electric.Config do
437444
defp time_multiplier(millisecond) when millisecond in ["ms", "msec"], do: 1
438445
defp time_multiplier(second) when second in ["s", "sec"], do: 1000
439446
defp time_multiplier(minute) when minute in ["m", "min"], do: 1000 * 60
447+
defp time_multiplier(hour) when hour in ["h", "hr"], do: 1000 * 60 * 60
440448

441449
def parse_human_readable_time!(str) do
442450
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
@@ -118,6 +118,14 @@ defmodule Electric.StackSupervisor do
118118
shape_hibernate_after: [
119119
type: :integer,
120120
default: Electric.Config.default(:shape_hibernate_after)
121+
],
122+
idle_wal_size_check_period: [
123+
type: :integer,
124+
default: Electric.Config.default(:idle_wal_size_check_period)
125+
],
126+
idle_wal_size_threshold: [
127+
type: :integer,
128+
default: Electric.Config.default(:idle_wal_size_threshold)
121129
]
122130
]
123131
],

0 commit comments

Comments
 (0)