anchor.diff:      %% ct:pal("Barriers set~n"),
   
       %% TM only performs the tx_tm_rtm_commit that lead to the BP
  -    %% bp_step blocks. Do it asynchronously. (We don't know which TM
  -    %% got the request.
  +    %% bp_step blocks. Do it asynchronously (we don't know which TM
  +    %% got the request).
       %% Pids = [ spawn(fun () -> gen_component:bp_step(X) end) || X <- Proposers ],
       %% report the one tp as failed
       _ = [ comm:send_local(fd, {report_graceful_leave, comm:make_global(Proposer)})
  
positive.code: 
      %%[ erlang:exit(Pid, kill) || Pid <- Pids ],
  
      gen_component:bp_del(Proposer, tp_crash),
      gen_component:bp_cont(Proposer).
  
  all_tp_crash(_) ->
      ct:pal("Starting all_tp_crash, simulated by holding the dht_node_proposers~n"),
  
negative.code: suite() -> [{timetrap, {seconds, 120}}].
  
  init_per_suite(Config) ->
      unittest_helper:init_per_suite(Config).
  
  end_per_suite(Config) ->
      unittest_helper:stop_ring(),
      unittest_helper:end_per_suite(Config).
  
  init_per_testcase(TestCase, Config) ->
      %% stop ring from previous test case (may have run into a timeout)
      unittest_helper:stop_ring(),
      case lists:member(TestCase, [tm_crash, tp_crash, all_tp_crash]) of
          true ->
              {priv_dir, PrivDir} = lists:keyfind(priv_dir, 1, Config),
              unittest_helper:make_ring(4, [{config, [{log_path, PrivDir}]}]),
              unittest_helper:wait_for_stable_ring(),
              unittest_helper:wait_for_stable_ring_deep();
          false ->
              {priv_dir, PrivDir} = lists:keyfind(priv_dir, 1, Config),
              unittest_helper:make_ring_with_ids(fun() -> ?RT:get_replica_keys(?RT:hash_key("0")) end, [{config, [{log_path, PrivDir}]}]),
              ok
      end,
      Config.
  
  end_per_testcase(_TestCase, Config) ->
      unittest_helper:stop_ring(),
      Config.
  
  causes() -> [readlock, writelock, versiondec, versioninc, none].
  