Module: Smith::Workflow::SplitStepPersistence::Preparation

Included in:
Smith::Workflow::SplitStepPersistence
Defined in:
lib/smith/workflow/split_step_persistence/preparation.rb

Instance Method Summary collapse

Instance Method Details

#confirm_prepared_step!Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/smith/workflow/split_step_persistence/preparation.rb', line 29

def confirm_prepared_step!
  confirmation_claimed = false
  claim_split_step_confirmation!
  confirmation_claimed = true
  confirmed = false
  payload = @split_step_adapter.fetch(@split_step_persistence_key)
  raise WorkflowError, "the persisted split-step preparation is not committed" unless
    persisted_split_step_payload?(payload, @split_step_preparation_payload)

  @split_step_mutex.synchronize do
    @split_step_phase = :prepared
    @split_step_transaction_thread = nil
    @split_step_transaction_identity = nil
  end
  confirmed = true
  self
ensure
  restore_unconfirmed_preparation! if confirmation_claimed && !confirmed
end

#prepare_persisted_step!(key = nil, adapter: Smith.persistence_adapter) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/smith/workflow/split_step_persistence/preparation.rb', line 15

def prepare_persisted_step!(key = nil, adapter: Smith.persistence_adapter)
  ensure_strict_split_step_persistence!
  intent_claimed = claim_split_step_preparation_intent!
  return unless intent_claimed

  preparation_finalized = false
  prepare_claimed_persisted_step!(key, adapter)
  preparation_finalized = true
  persist_claimed_split_step_preparation!(@split_step_persistence_key, @split_step_adapter)
  @split_step_transition_name
ensure
  release_split_step_preparation_intent! if intent_claimed && !preparation_finalized
end

#prepared_persisted_stepObject



49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/smith/workflow/split_step_persistence/preparation.rb', line 49

def prepared_persisted_step
  phase, descriptor, adapter, transaction_identity = @split_step_mutex.synchronize do
    [
      @split_step_phase,
      @split_step_prepared_descriptor,
      @split_step_adapter,
      @split_step_transaction_identity
    ]
  end
  return unless DESCRIPTOR_PHASES.include?(phase) && descriptor
  return descriptor unless phase == :prepared_uncommitted

  descriptor if TransactionIdentity.matches?(adapter, transaction_identity)
end