defmodule Hobbes.Workloads.LockDatabase do @moduledoc """ A test workload that locks and then unlocks the database. """ alias Hobbes.Transaction alias Hobbes.Structs.Cluster alias Trinity.SimProcess @behaviour Hobbes.Workloads.Workload @type opts :: [ delay_ms: non_neg_integer, lock_duration_ms: non_neg_integer, ] def run(%{cluster: %Cluster{} = cluster}, opts) do delay_ms = Keyword.get(opts, :delay_ms, 10_000) lock_duration_ms = Keyword.get(opts, :lock_duration_ms, 10_000) SimProcess.sleep(delay_ms) {:ok, _txn} = do_write(cluster, "\xFF/lock", "true") {:error, {:database_locked, _txn}} = do_write(cluster, "foo", "bar") SimProcess.sleep(lock_duration_ms) {:ok, _txn} = do_write(cluster, "\xFF/lock", "false") {:ok, _txn} = do_write(cluster, "baz", "foo") {:ok, "Locked database"} end defp do_write(cluster, key, value) do Transaction.new!(cluster) |> Transaction.write(key, value) |> Transaction.commit() end end