Skip to content

Commit 877d4dc

Browse files
committed
Fix default retry behavior for local activities
Signed-off-by: Greg Haskins <[email protected]>
1 parent 6747cfb commit 877d4dc

File tree

2 files changed

+55
-3
lines changed

2 files changed

+55
-3
lines changed

src/temporal/internal/activity.clj

+8-3
Original file line numberDiff line numberDiff line change
@@ -40,16 +40,21 @@
4040
^ActivityOptions [params]
4141
(u/build (ActivityOptions/newBuilder) invoke-option-spec (import-invoke-options params)))
4242

43+
(defn- local-retry-options-> [{:keys [maximum-attempts] :or {maximum-attempts 0} :as options}]
44+
(-> options
45+
(cond-> (zero? maximum-attempts) (assoc :maximum-attempts Integer/MAX_VALUE)) ;; workaround for https://github.com/temporalio/sdk-java/issues/1727
46+
(common/retry-options->)))
47+
4348
(def local-invoke-option-spec
4449
{:start-to-close-timeout #(.setStartToCloseTimeout ^LocalActivityOptions$Builder %1 %2)
4550
:schedule-to-close-timeout #(.setScheduleToCloseTimeout ^LocalActivityOptions$Builder %1 %2)
46-
:retry-options #(.setRetryOptions ^LocalActivityOptions$Builder %1 (common/retry-options-> %2))
51+
:retry-options #(.setRetryOptions ^LocalActivityOptions$Builder %1 (local-retry-options-> %2))
4752
:do-not-include-args #(.setDoNotIncludeArgumentsIntoMarker ^LocalActivityOptions$Builder %1 %2)
4853
:local-retry-threshold #(.setLocalRetryThreshold ^LocalActivityOptions$Builder %1 %2)})
4954

5055
(defn local-invoke-options->
51-
^LocalActivityOptions [params]
52-
(u/build (LocalActivityOptions/newBuilder (LocalActivityOptions/getDefaultInstance)) local-invoke-option-spec (import-invoke-options params)))
56+
^LocalActivityOptions [{:keys [retry-options] :or {retry-options {}} :as params}]
57+
(u/build (LocalActivityOptions/newBuilder (LocalActivityOptions/getDefaultInstance)) local-invoke-option-spec (import-invoke-options (assoc params :retry-options retry-options))))
5358

5459
(extend-protocol p/Datafiable
5560
ActivityInfo

test/temporal/test/local_retry.clj

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
;; Copyright © Manetu, Inc. All rights reserved
2+
3+
(ns temporal.test.local-retry
4+
(:require [clojure.test :refer :all]
5+
[promesa.core :as p]
6+
[taoensso.timbre :as log]
7+
[temporal.client.core :as c]
8+
[temporal.workflow :refer [defworkflow]]
9+
[temporal.activity :refer [defactivity] :as a]
10+
[temporal.test.utils :as t])
11+
(:import (io.temporal.client WorkflowFailedException)
12+
[io.temporal.failure TimeoutFailure ActivityFailure]
13+
[java.time Duration]))
14+
15+
(use-fixtures :once t/wrap-service)
16+
17+
(defactivity local-retry-activity
18+
[ctx args]
19+
(log/info "local-retry-activity")
20+
(Thread/sleep 100000000))
21+
22+
(defworkflow local-retry-workflow
23+
[args]
24+
(log/info "local-retry-workflow:" args)
25+
@(-> (a/local-invoke local-retry-activity {} (merge args {:do-not-include-args true
26+
:start-to-close-timeout (Duration/ofMillis 500)}))
27+
(p/catch ActivityFailure
28+
:fail)))
29+
30+
(defn exec [args]
31+
(let [workflow (t/create-workflow local-retry-workflow)]
32+
(c/start workflow args)
33+
@(-> (c/get-result workflow)
34+
(p/then (constantly :fail))
35+
(p/catch WorkflowFailedException
36+
(fn [ex]
37+
(if (instance? TimeoutFailure (ex-cause ex))
38+
:pass
39+
:fail))))))
40+
41+
(deftest the-test
42+
(testing "RetryPolicy defaults"
43+
(is (= :pass (exec {}))))
44+
(testing "Explicit unlimited"
45+
(is (= :pass (exec {:retry-options {:maximum-attempts 0}}))))
46+
(testing "Verify that setting maximum-attempts to a finite value is respected"
47+
(is (= :fail (exec {:retry-options {:maximum-attempts 1}})))))

0 commit comments

Comments
 (0)