Bedrock.DataPlane.Log.Shale.Recovery (bedrock v0.5.2)

View Source

Recovery logic for Shale log servers.

Supports multi-source recovery for the consistent hashing model. When multiple source logs are provided, transactions are pulled from available sources to establish the version range. Since all logs receive the same version sequence (with personalized content), pulling from any survivor establishes the correct version boundaries.

For future optimization, true multi-source coalescing could merge transaction streams and filter by shard index, but for now we use the simpler approach of pulling from available sources.

Summary

Functions

abort_all_waiting_pullers(t)

close_writer(t)

discard_all_segments(t)

discard_segments(segment_recycler, list)

@spec discard_segments(term(), [Bedrock.DataPlane.Log.Shale.Segment.t()]) :: []
@spec discard_segments(term(), [Bedrock.DataPlane.Log.Shale.Segment.t()]) :: []

ensure_active_segment(t)

ensure_active_segment(t, version)

open_writer(t)

pull_transactions(t, log_ref, first_version, last_version)

@spec pull_transactions(
  t :: Bedrock.DataPlane.Log.Shale.State.t(),
  log_ref :: Bedrock.DataPlane.Log.ref(),
  first_version :: Bedrock.version(),
  last_version :: Bedrock.version()
) ::
  {:ok, Bedrock.DataPlane.Log.Shale.State.t()}
  | Bedrock.DataPlane.Log.pull_errors()
  | {:error, {:source_log_unavailable, log_ref :: Bedrock.DataPlane.Log.ref()}}

pull_transactions_from_sources(t, source_logs, first_version, last_version)

@spec pull_transactions_from_sources(
  t :: Bedrock.DataPlane.Log.Shale.State.t(),
  source_logs :: [Bedrock.DataPlane.Log.ref()],
  first_version :: Bedrock.version(),
  last_version :: Bedrock.version()
) ::
  {:ok, Bedrock.DataPlane.Log.Shale.State.t()}
  | Bedrock.DataPlane.Log.pull_errors()
  | {:error, {:source_log_unavailable, log_ref :: Bedrock.DataPlane.Log.ref()}}
  | {:error, :no_source_logs_available}

push_sentinel(t, version)

recover_from(t, source_logs, first_version, last_version)

@spec recover_from(
  Bedrock.DataPlane.Log.Shale.State.t(),
  source_logs :: [Bedrock.DataPlane.Log.ref()],
  first_version :: Bedrock.version(),
  last_version :: Bedrock.version()
) ::
  {:ok, Bedrock.DataPlane.Log.Shale.State.t()}
  | {:error, :lock_required}
  | {:error, {:source_log_unavailable, log_ref :: Bedrock.DataPlane.Log.ref()}}
  | {:error, :no_source_logs_available}