Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitd2a2ee1

Browse files
jimsynzskanderm
andauthored
fix: correct current_try increment during step retries (#257)
* Add failing current_try increment test* fix: correct current_try increment during step retriesFix bug where current_try was not properly incremented during step retriesdue to incorrect default value in increment_retries function.The issue was in Map.update/4 usage:- Map.update(retries, step_ref, 0, &(&1 + 1)) set retry count to 0 for first retry- Should be Map.update(retries, step_ref, 1, &(&1 + 1)) to set retry count to 1Also updated retry limit check from >= to > for correct max_retries semantics:- max_retries 1 should allow 1 retry (2 total attempts)- Previous check retry_count >= max_retries prevented thisChanges:- lib/reactor/executor/async.ex: Fix increment_retries default and limit check- lib/reactor/executor/sync.ex: Fix increment_retries default and limit check- test/reactor/executor/async_test.exs: Update test expectation- test/reactor/executor/compensation_test.exs: Add test case from@skandermFixes current_try progression: 0 → 1 → 2 instead of 0 → 0 → 1---------Co-authored-by: Skander Mzali <skanderm@gmail.com>
1 parent000d5d1 commitd2a2ee1

File tree

4 files changed

+82
-5
lines changed

4 files changed

+82
-5
lines changed

‎lib/reactor/executor/async.ex‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ defmodule Reactor.Executor.Async do
148148
reactor
149149
|>drop_from_plan(task)
150150

151-
ifMap.get(state.retries,step.ref)>=step.max_retriesdo
151+
ifMap.get(state.retries,step.ref)>step.max_retriesdo
152152
error=
153153
error||
154154
RetriesExceededError.exception(
@@ -223,7 +223,7 @@ defmodule Reactor.Executor.Async do
223223
end
224224

225225
defpincrement_retries(state,step)do
226-
%{state|retries:Map.update(state.retries,step.ref,0,&(&1+1))}
226+
%{state|retries:Map.update(state.retries,step.ref,1,&(&1+1))}
227227
end
228228

229229
defpdrop_from_plan(reactor,step)do

‎lib/reactor/executor/sync.ex‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ defmodule Reactor.Executor.Sync do
3232
defphandle_completed_step(reactor,state,step,{:retry,error})do
3333
state=increment_retries(state,step)
3434

35-
ifMap.get(state.retries,step.ref)>=step.max_retriesdo
35+
ifMap.get(state.retries,step.ref)>step.max_retriesdo
3636
reactor=drop_from_plan(reactor,step)
3737

3838
error=
@@ -89,7 +89,7 @@ defmodule Reactor.Executor.Sync do
8989
end
9090

9191
defpincrement_retries(state,step)do
92-
%{state|retries:Map.update(state.retries,step.ref,0,&(&1+1))}
92+
%{state|retries:Map.update(state.retries,step.ref,1,&(&1+1))}
9393
end
9494

9595
defpdrop_from_plan(reactor,step)do

‎test/reactor/executor/async_test.exs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ defmodule Reactor.Executor.AsyncTest do
211211
refuteis_map_key(state.retries,doable.ref)
212212

213213
assert{_,_reactor,state}=handle_completed_steps(reactor,state)
214-
assertstate.retries[doable.ref]==0
214+
assertstate.retries[doable.ref]==1
215215
end
216216

217217
test"when one of the steps asks to retry (again), it increments the retry count for the step",
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
defmoduleReactor.Executor.CompensationTestdo
2+
useExUnit.Case,async:true
3+
4+
aliasReactor.Error.Invalid.RunStepError
5+
6+
defmoduleEventMiddlewaredo
7+
useReactor.Middleware
8+
9+
@moduledocfalse
10+
defevent(event,_step,context)do
11+
Agent.update(context.event_agent,fnevents->
12+
[append_elem(event,context.current_try)|events]
13+
end)
14+
15+
:ok
16+
end
17+
18+
defpappend_elem(event,elem)whenis_tuple(event)do
19+
event
20+
|>Tuple.to_list()
21+
|>Kernel.++([elem])
22+
|>List.to_tuple()
23+
end
24+
25+
defpappend_elem(event,_),do:event
26+
end
27+
28+
defrun(reactor,args,opts\\[])do
29+
{:ok,pid}=Agent.start_link(fn->[]end)
30+
31+
reactor.reactor()
32+
|>Reactor.Builder.ensure_middleware!(EventMiddleware)
33+
|>Reactor.run(args,%{event_agent:pid},opts)
34+
35+
Agent.get(pid,fnevents->Enum.reverse(events)end)
36+
end
37+
38+
defmoduleCompensateReactordo
39+
@moduledocfalse
40+
useReactor
41+
42+
input:compensation_result
43+
44+
step:faildo
45+
argument:compensation_result,input(:compensation_result)
46+
max_retries3
47+
48+
runfn_,%{current_try:current_try}->
49+
ifcurrent_try>1do
50+
{:ok,:done}
51+
else
52+
{:error,:fail}
53+
end
54+
end
55+
56+
compensatefn_,arguments,_->
57+
arguments.compensation_result
58+
end
59+
end
60+
end
61+
62+
test"increments current_try"do
63+
assert[
64+
{:run_start,_,0},
65+
{:run_error,%RunStepError{error::fail},0},
66+
{:compensate_start,%RunStepError{error::fail},0},
67+
:compensate_retry,
68+
{:run_start,_,1},
69+
{:run_error,%RunStepError{error::fail},1},
70+
{:compensate_start,%RunStepError{error::fail},1},
71+
:compensate_retry,
72+
{:run_start,_,2},
73+
{:run_complete,:done,2}
74+
]=
75+
run(CompensateReactor,%{compensation_result::retry},async?:false)
76+
end
77+
end

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp