Packages
electric
1.4.1
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.1
1.5.0
1.4.16
1.4.16-beta-1
1.4.15
1.4.14
1.4.13
1.4.12
1.4.11
1.4.10
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.4
1.3.3
1.3.2
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.14
1.1.13
1.1.12
1.1.11
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
retired
1.1.5
retired
1.1.4
retired
1.1.3
retired
1.1.2
1.1.1
1.1.0
1.0.24
1.0.23
1.0.22
1.0.21
1.0.20
1.0.19
1.0.18
1.0.17
1.0.15
1.0.13
1.0.12
1.0.11
1.0.10
1.0.9
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
1.0.0-beta.23
1.0.0-beta.22
1.0.0-beta.20
1.0.0-beta.19
1.0.0-beta.18
1.0.0-beta.17
1.0.0-beta.16
1.0.0-beta.15
1.0.0-beta.14
1.0.0-beta.13
1.0.0-beta.12
1.0.0-beta.11
1.0.0-beta.10
1.0.0-beta.9
1.0.0-beta.8
1.0.0-beta.7
1.0.0-beta.6
1.0.0-beta.5
1.0.0-beta.4
1.0.0-beta.3
1.0.0-beta.2
1.0.0-beta.1
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.1
0.8.0
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.5.2
0.4.4
Postgres sync engine. Sync little subsets of your Postgres data into local apps and services.
Current section
Files
Jump to
Current section
Files
lib/electric/shape_cache/crashing_file_storage.ex
defmodule Electric.ShapeCache.CrashingFileStorage do
@moduledoc """
A thing wrapper module around PureFileStorage that can be configured to raise an error after a
certain number of writes.
"""
alias Electric.ShapeCache.PureFileStorage
@behaviour Electric.ShapeCache.Storage
defdelegate for_shape(shape_handle, opts), to: PureFileStorage
defdelegate start_link(opts), to: PureFileStorage
defdelegate get_all_stored_shape_handles(opts), to: PureFileStorage
defdelegate get_stored_shapes(opts, shape_handles), to: PureFileStorage
defdelegate metadata_backup_dir(opts), to: PureFileStorage
defdelegate get_total_disk_usage(opts), to: PureFileStorage
defdelegate fetch_latest_offset(opts), to: PureFileStorage
defdelegate fetch_pg_snapshot(opts), to: PureFileStorage
defdelegate set_pg_snapshot(pg_snapshot, opts), to: PureFileStorage
defdelegate snapshot_started?(opts), to: PureFileStorage
defdelegate make_new_snapshot!(data_stream, opts), to: PureFileStorage
defdelegate mark_snapshot_as_started(opts), to: PureFileStorage
defdelegate get_log_stream(offset, max_offset, opts), to: PureFileStorage
defdelegate get_chunk_end_log_offset(offset, opts), to: PureFileStorage
defdelegate cleanup!(opts), to: PureFileStorage
defdelegate cleanup!(opts, shape_handle), to: PureFileStorage
defdelegate cleanup_all!(opts), to: PureFileStorage
defdelegate terminate(opts), to: PureFileStorage
defdelegate hibernate(opts), to: PureFileStorage
defdelegate compact(opts, keep_complete_chunks), to: PureFileStorage
defdelegate append_move_in_snapshot_to_log!(name, writer_state), to: PureFileStorage
defdelegate append_move_in_snapshot_to_log_filtered!(
name,
writer_state,
touch_tracker,
snapshot,
tags_to_skip
),
to: PureFileStorage
defdelegate append_control_message!(control_message, writer_state), to: PureFileStorage
defdelegate write_move_in_snapshot!(stream, name, opts), to: PureFileStorage
defp stack_agent_name(opts) do
Electric.ProcessRegistry.name(opts, __MODULE__, :agent)
end
def stack_start_link(opts) do
{:ok, _agent} = Agent.start_link(fn -> 0 end, name: stack_agent_name(opts))
PureFileStorage.stack_start_link(opts)
end
def shared_opts(opts) do
opts
|> PureFileStorage.shared_opts()
|> Map.put(:extra_opts, %{num_calls_until_crash: Keyword.fetch!(opts, :num_calls_until_crash)})
end
def init_writer!(opts, shape_definition) do
Agent.update(stack_agent_name(opts), fn _ -> opts.extra_opts.num_calls_until_crash end)
PureFileStorage.init_writer!(opts, shape_definition)
end
def append_to_log!(log_items, opts) do
num_calls_until_crash = Agent.get(stack_agent_name(opts), & &1)
if num_calls_until_crash == 0 do
Agent.update(stack_agent_name(opts), fn _ -> opts.extra_opts.num_calls_until_crash end)
raise "Simulated storage failure"
end
Agent.update(stack_agent_name(opts), fn n -> n - 1 end)
PureFileStorage.append_to_log!(log_items, opts)
end
end