From f26f8d2b4779cf12cf5eef939aced1d62191e93a Mon Sep 17 00:00:00 2001 From: Hal Spang Date: Wed, 24 Mar 2021 16:47:52 -0700 Subject: [PATCH] Add pause between stopping/starting runtime ActorReminderRecoveryIT and ActorTimerRecoveryIT both rely on reminders/timers being persisted when dapr restarts. On some restarts, it appears that the placement service shares its placement table during on ongoing update. This causes the dapr runtime to use the wrong address for the actor. https://github.com/dapr/java-sdk/issues/425 --- .../java/io/dapr/it/actors/ActorReminderRecoveryIT.java | 9 +++++++-- .../java/io/dapr/it/actors/ActorTimerRecoveryIT.java | 7 ++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/sdk-tests/src/test/java/io/dapr/it/actors/ActorReminderRecoveryIT.java b/sdk-tests/src/test/java/io/dapr/it/actors/ActorReminderRecoveryIT.java index c79d11bc82..d248cacbce 100644 --- a/sdk-tests/src/test/java/io/dapr/it/actors/ActorReminderRecoveryIT.java +++ b/sdk-tests/src/test/java/io/dapr/it/actors/ActorReminderRecoveryIT.java @@ -12,7 +12,6 @@ import io.dapr.it.BaseIT; import io.dapr.it.DaprRun; import io.dapr.it.actors.app.MyActorService; -import io.dapr.it.state.GRPCStateClientIT; import org.apache.commons.lang3.tuple.ImmutablePair; import org.junit.After; import org.junit.Before; @@ -20,7 +19,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; +import java.time.Duration; import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -98,12 +97,18 @@ public void reminderRecoveryTest() throws Exception { // Restarts runtime only. logger.info("Stopping Dapr sidecar"); runs.right.stop(); + + // Pause a bit to let placements settle. + logger.info("Pausing 10 seconds to let placements settle."); + Thread.sleep(Duration.ofSeconds(10).toMillis()); + logger.info("Starting Dapr sidecar"); runs.right.start(); logger.info("Dapr sidecar started"); logger.info("Pausing 7 seconds to allow sidecar to be healthy"); Thread.sleep(7000); + callWithRetry(() -> { logger.info("Fetching logs for " + METHOD_NAME); List newLogs = fetchMethodCallLogs(proxy); diff --git a/sdk-tests/src/test/java/io/dapr/it/actors/ActorTimerRecoveryIT.java b/sdk-tests/src/test/java/io/dapr/it/actors/ActorTimerRecoveryIT.java index 5ee5550a7c..e82a31af73 100644 --- a/sdk-tests/src/test/java/io/dapr/it/actors/ActorTimerRecoveryIT.java +++ b/sdk-tests/src/test/java/io/dapr/it/actors/ActorTimerRecoveryIT.java @@ -17,6 +17,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.time.Duration; import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -24,7 +25,6 @@ import static io.dapr.it.Retry.callWithRetry; import static io.dapr.it.actors.MyActorTestUtils.fetchMethodCallLogs; import static io.dapr.it.actors.MyActorTestUtils.validateMethodCalls; -import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; public class ActorTimerRecoveryIT extends BaseIT { @@ -72,6 +72,11 @@ public void timerRecoveryTest() throws Exception { // Restarts app only. runs.left.stop(); + + // Pause a bit to let placements settle. + logger.info("Pausing 10 seconds to let placements settle."); + Thread.sleep(Duration.ofSeconds(10).toMillis()); + runs.left.start(); logger.debug("Pausing 10 seconds to allow timer to fire");