Search in sources :

Example 1 with DeciderCache

use of com.uber.cadence.internal.replay.DeciderCache in project cadence-client by uber-java.

the class StickyWorkerTest method workflowsCanBeQueriedAfterEviction.

@Test
public void workflowsCanBeQueriedAfterEviction() throws Exception {
    // Arrange
    String taskListName = "queryEvictionStickyTest";
    TestEnvironmentWrapper wrapper = new TestEnvironmentWrapper(WorkerFactoryOptions.newBuilder().setDisableStickyExecution(false).build(), NoopScope.getInstance());
    WorkerFactory factory = wrapper.getWorkerFactory();
    Worker worker = factory.newWorker(taskListName);
    worker.registerWorkflowImplementationTypes(GreetingSignalWorkflowImpl.class);
    factory.start();
    WorkflowOptions workflowOptions = new WorkflowOptions.Builder().setTaskList(taskListName).setExecutionStartToCloseTimeout(Duration.ofDays(30)).setTaskStartToCloseTimeout(Duration.ofSeconds(30)).build();
    GreetingSignalWorkflow workflow = wrapper.getWorkflowClient().newWorkflowStub(GreetingSignalWorkflow.class, workflowOptions);
    // Act
    WorkflowClient.start(workflow::getGreeting);
    // Wait for workflow to start
    Thread.sleep(200);
    DeciderCache cache = factory.getCache();
    assertNotNull(cache);
    assertEquals(1, cache.size());
    cache.invalidateAll();
    assertEquals(0, cache.size());
    // Assert
    assertEquals(workflow.getProgress(), GreetingSignalWorkflow.Status.WAITING_FOR_NAME);
    workflow.waitForName("World");
    String greeting = workflow.getGreeting();
    assertEquals("Hello World!", greeting);
    assertEquals(workflow.getProgress(), GreetingSignalWorkflow.Status.GREETING_GENERATED);
    wrapper.close();
}
Also used : RootScopeBuilder(com.uber.m3.tally.RootScopeBuilder) WorkflowOptions(com.uber.cadence.client.WorkflowOptions) DeciderCache(com.uber.cadence.internal.replay.DeciderCache)

Example 2 with DeciderCache

use of com.uber.cadence.internal.replay.DeciderCache in project cadence-client by uber-java.

the class StickyWorkerTest method whenStickyIsEnabledThenTheWorkflowIsCachedSignals.

@Test
public void whenStickyIsEnabledThenTheWorkflowIsCachedSignals() throws Exception {
    // Arrange
    String taskListName = "cachedStickyTest_Signal";
    StatsReporter reporter = mock(StatsReporter.class);
    Scope scope = new RootScopeBuilder().reporter(reporter).reportEvery(com.uber.m3.util.Duration.ofMillis(300));
    WorkerFactoryOptions factoryOptions = WorkerFactoryOptions.newBuilder().setDisableStickyExecution(false).build();
    TestEnvironmentWrapper wrapper = new TestEnvironmentWrapper(factoryOptions, scope);
    WorkerFactory factory = wrapper.getWorkerFactory();
    Worker worker = factory.newWorker(taskListName);
    worker.registerWorkflowImplementationTypes(GreetingSignalWorkflowImpl.class);
    factory.start();
    WorkflowOptions workflowOptions = new WorkflowOptions.Builder().setTaskList(taskListName).setExecutionStartToCloseTimeout(Duration.ofDays(30)).setTaskStartToCloseTimeout(Duration.ofSeconds(30)).build();
    GreetingSignalWorkflow workflow = wrapper.getWorkflowClient().newWorkflowStub(GreetingSignalWorkflow.class, workflowOptions);
    // Act
    WorkflowClient.start(workflow::getGreeting);
    Thread.sleep(300);
    workflow.waitForName("World");
    String greeting = workflow.getGreeting();
    assertEquals("Hello World!", greeting);
    // Assert
    DeciderCache cache = factory.getCache();
    assertNotNull(cache);
    assertEquals(1, cache.size());
    // Verify the workflow succeeded without having to recover from a failure
    Map<String, String> tags = new ImmutableMap.Builder<String, String>(2).put(MetricsTag.DOMAIN, DOMAIN).put(MetricsTag.TASK_LIST, STICKY_TASK_LIST_METRIC_TAG).build();
    Thread.sleep(600);
    verify(reporter, atLeastOnce()).reportCounter(eq(MetricsType.STICKY_CACHE_HIT), eq(tags), anyInt());
    verify(reporter, never()).reportCounter(eq(MetricsType.STICKY_CACHE_MISS), eq(tags), anyInt());
    // Finish Workflow
    wrapper.close();
}
Also used : RootScopeBuilder(com.uber.m3.tally.RootScopeBuilder) RootScopeBuilder(com.uber.m3.tally.RootScopeBuilder) DeciderCache(com.uber.cadence.internal.replay.DeciderCache) StatsReporter(com.uber.m3.tally.StatsReporter) ImmutableMap(com.uber.m3.util.ImmutableMap) Scope(com.uber.m3.tally.Scope) NoopScope(com.uber.cadence.internal.metrics.NoopScope) WorkflowOptions(com.uber.cadence.client.WorkflowOptions)

Example 3 with DeciderCache

use of com.uber.cadence.internal.replay.DeciderCache in project cadence-client by uber-java.

the class StickyWorkerTest method whenStickyIsNotEnabledThenTheWorkflowIsNotCached.

@Test
public void whenStickyIsNotEnabledThenTheWorkflowIsNotCached() {
    // Arrange
    String taskListName = "notCachedStickyTest";
    TestEnvironmentWrapper wrapper = new TestEnvironmentWrapper(WorkerFactoryOptions.newBuilder().setDisableStickyExecution(true).build(), NoopScope.getInstance());
    WorkerFactory factory = wrapper.getWorkerFactory();
    Worker worker = factory.newWorker(taskListName);
    worker.registerWorkflowImplementationTypes(GreetingSignalWorkflowImpl.class);
    factory.start();
    WorkflowOptions workflowOptions = new WorkflowOptions.Builder().setTaskList(taskListName).setExecutionStartToCloseTimeout(Duration.ofDays(30)).setTaskStartToCloseTimeout(Duration.ofSeconds(30)).build();
    GreetingSignalWorkflow workflow = wrapper.getWorkflowClient().newWorkflowStub(GreetingSignalWorkflow.class, workflowOptions);
    // Act
    WorkflowClient.start(workflow::getGreeting);
    workflow.waitForName("World");
    String greeting = workflow.getGreeting();
    assertEquals("Hello World!", greeting);
    // Assert
    DeciderCache cache = factory.getCache();
    assertNull(cache);
    wrapper.close();
}
Also used : RootScopeBuilder(com.uber.m3.tally.RootScopeBuilder) WorkflowOptions(com.uber.cadence.client.WorkflowOptions) DeciderCache(com.uber.cadence.internal.replay.DeciderCache)

Example 4 with DeciderCache

use of com.uber.cadence.internal.replay.DeciderCache in project cadence-client by uber-java.

the class DeterministicRunnerTest method workflowThreadsWillEvictCacheWhenMaxThreadCountIsHit.

@Test
public void workflowThreadsWillEvictCacheWhenMaxThreadCountIsHit() throws Throwable {
    // Arrange
    // Arrange
    Map<String, String> tags = new ImmutableMap.Builder<String, String>(2).put(MetricsTag.DOMAIN, "domain").put(MetricsTag.TASK_LIST, "stickyTaskList").build();
    StatsReporter reporter = mock(StatsReporter.class);
    Scope scope = new RootScopeBuilder().reporter(reporter).reportEvery(com.uber.m3.util.Duration.ofMillis(300)).tagged(tags);
    ThreadPoolExecutor threadPool = new ThreadPoolExecutor(1, 3, 1, TimeUnit.SECONDS, new SynchronousQueue<>());
    AtomicReference<String> status = new AtomicReference<>();
    DeciderCache cache = new DeciderCache(3, scope);
    DecisionContext decisionContext = mock(DecisionContext.class);
    when(decisionContext.getMetricsScope()).thenReturn(scope);
    when(decisionContext.getDomain()).thenReturn("domain");
    when(decisionContext.getWorkflowType()).thenReturn(new WorkflowType());
    DeterministicRunnerImpl d = new DeterministicRunnerImpl(threadPool, new SyncDecisionContext(decisionContext, JsonDataConverter.getInstance(), null, next -> next, null), // clock override
    () -> 0L, () -> {
        Promise<Void> thread = Async.procedure(() -> {
            status.set("started");
            WorkflowThread.await("doing something", () -> false);
            status.set("done");
        });
        thread.get();
    }, cache);
    Decider decider = new DetermisiticRunnerContainerDecider(d);
    PollForDecisionTaskResponse response = HistoryUtils.generateDecisionTaskWithInitialHistory();
    cache.getOrCreate(response, () -> decider);
    cache.addToCache(response, decider);
    d.runUntilAllBlocked();
    assertEquals(2, threadPool.getActiveCount());
    DeterministicRunnerImpl d2 = new DeterministicRunnerImpl(threadPool, new SyncDecisionContext(decisionContext, JsonDataConverter.getInstance(), null, next -> next, null), // clock override
    () -> 0L, () -> {
        Promise<Void> thread = Async.procedure(() -> {
            status.set("started");
            WorkflowThread.await("doing something else", () -> false);
            status.set("done");
        });
        thread.get();
    }, cache);
    // Root thread added for d2 therefore we expect a total of 3 threads used
    assertEquals(3, threadPool.getActiveCount());
    assertEquals(1, cache.size());
    // Act: This should kick out threads consumed by 'd'
    d2.runUntilAllBlocked();
    // Assert: Cache is evicted and only threads consumed by d2 remain.
    assertEquals(2, threadPool.getActiveCount());
    // cache was evicted
    assertEquals(0, cache.size());
    // Wait for reporter
    Thread.sleep(600);
    verify(reporter, atLeastOnce()).reportCounter(eq(MetricsType.STICKY_CACHE_THREAD_FORCED_EVICTION), eq(tags), anyInt());
}
Also used : MetricsType(com.uber.cadence.internal.metrics.MetricsType) ThreadPoolExecutor(java.util.concurrent.ThreadPoolExecutor) JsonDataConverter(com.uber.cadence.converter.JsonDataConverter) Promise(com.uber.cadence.workflow.Promise) DecisionContext(com.uber.cadence.internal.replay.DecisionContext) TimeoutException(java.util.concurrent.TimeoutException) AtomicReference(java.util.concurrent.atomic.AtomicReference) ArrayList(java.util.ArrayList) Functions(com.uber.cadence.workflow.Functions) TestCase.assertNotNull(junit.framework.TestCase.assertNotNull) StatsReporter(com.uber.m3.tally.StatsReporter) WorkflowTest(com.uber.cadence.workflow.WorkflowTest) Duration(java.time.Duration) Map(java.util.Map) After(org.junit.After) WorkflowType(com.uber.cadence.WorkflowType) ExecutorService(java.util.concurrent.ExecutorService) Before(org.junit.Before) Workflow(com.uber.cadence.workflow.Workflow) MetricsTag(com.uber.cadence.internal.metrics.MetricsTag) CancellationScope(com.uber.cadence.workflow.CancellationScope) Scope(com.uber.m3.tally.Scope) CancellationException(java.util.concurrent.CancellationException) SynchronousQueue(java.util.concurrent.SynchronousQueue) TestCase.fail(junit.framework.TestCase.fail) Decider(com.uber.cadence.internal.replay.Decider) Test(org.junit.Test) NoopScope(com.uber.cadence.internal.metrics.NoopScope) Objects(java.util.Objects) TimeUnit(java.util.concurrent.TimeUnit) Mockito(org.mockito.Mockito) RetryOptions(com.uber.cadence.common.RetryOptions) PollForDecisionTaskResponse(com.uber.cadence.PollForDecisionTaskResponse) Async(com.uber.cadence.workflow.Async) List(java.util.List) Rule(org.junit.Rule) TestCase.assertTrue(junit.framework.TestCase.assertTrue) CompletablePromise(com.uber.cadence.workflow.CompletablePromise) Assert.assertFalse(org.junit.Assert.assertFalse) RootScopeBuilder(com.uber.m3.tally.RootScopeBuilder) WorkflowQuery(com.uber.cadence.WorkflowQuery) HistoryUtils(com.uber.cadence.testUtils.HistoryUtils) DeciderCache(com.uber.cadence.internal.replay.DeciderCache) TestCase.assertEquals(junit.framework.TestCase.assertEquals) ImmutableMap(com.uber.m3.util.ImmutableMap) RootScopeBuilder(com.uber.m3.tally.RootScopeBuilder) AtomicReference(java.util.concurrent.atomic.AtomicReference) PollForDecisionTaskResponse(com.uber.cadence.PollForDecisionTaskResponse) DeciderCache(com.uber.cadence.internal.replay.DeciderCache) StatsReporter(com.uber.m3.tally.StatsReporter) ImmutableMap(com.uber.m3.util.ImmutableMap) Decider(com.uber.cadence.internal.replay.Decider) CancellationScope(com.uber.cadence.workflow.CancellationScope) Scope(com.uber.m3.tally.Scope) NoopScope(com.uber.cadence.internal.metrics.NoopScope) WorkflowType(com.uber.cadence.WorkflowType) DecisionContext(com.uber.cadence.internal.replay.DecisionContext) ThreadPoolExecutor(java.util.concurrent.ThreadPoolExecutor) WorkflowTest(com.uber.cadence.workflow.WorkflowTest) Test(org.junit.Test)

Example 5 with DeciderCache

use of com.uber.cadence.internal.replay.DeciderCache in project cadence-client by uber-java.

the class DeterministicRunnerTest method workflowThreadsWillNotEvictCacheWhenMaxThreadCountIsHit.

@Test
public void workflowThreadsWillNotEvictCacheWhenMaxThreadCountIsHit() throws Throwable {
    // Arrange
    ThreadPoolExecutor threadPool = new ThreadPoolExecutor(1, 5, 1, TimeUnit.SECONDS, new SynchronousQueue<>());
    AtomicReference<String> status = new AtomicReference<>();
    DeciderCache cache = new DeciderCache(3, NoopScope.getInstance());
    DeterministicRunnerImpl d = new DeterministicRunnerImpl(threadPool, null, // clock override
    () -> 0L, () -> {
        Promise<Void> thread = Async.procedure(() -> {
            status.set("started");
            WorkflowThread.await("doing something", () -> false);
            status.set("done");
        });
        thread.get();
    }, cache);
    Decider decider = new DetermisiticRunnerContainerDecider(d);
    PollForDecisionTaskResponse response = HistoryUtils.generateDecisionTaskWithInitialHistory();
    cache.getOrCreate(response, () -> decider);
    cache.addToCache(response, decider);
    d.runUntilAllBlocked();
    assertEquals(2, threadPool.getActiveCount());
    DeterministicRunnerImpl d2 = new DeterministicRunnerImpl(threadPool, null, // clock override
    () -> 0L, () -> {
        Promise<Void> thread = Async.procedure(() -> {
            status.set("started");
            WorkflowThread.await("doing something else", () -> false);
            status.set("done");
        });
        thread.get();
    }, cache);
    // Root thread added for d2 therefore we expect a total of 3 threads used
    assertEquals(3, threadPool.getActiveCount());
    assertEquals(1, cache.size());
    // Act: This should not kick out threads consumed by 'd' since there's enough capacity
    d2.runUntilAllBlocked();
    // Assert: Cache is not evicted and all threads remain.
    assertEquals(4, threadPool.getActiveCount());
    assertEquals(1, cache.size());
}
Also used : AtomicReference(java.util.concurrent.atomic.AtomicReference) PollForDecisionTaskResponse(com.uber.cadence.PollForDecisionTaskResponse) ThreadPoolExecutor(java.util.concurrent.ThreadPoolExecutor) DeciderCache(com.uber.cadence.internal.replay.DeciderCache) Decider(com.uber.cadence.internal.replay.Decider) WorkflowTest(com.uber.cadence.workflow.WorkflowTest) Test(org.junit.Test)

Aggregations

DeciderCache (com.uber.cadence.internal.replay.DeciderCache)7 RootScopeBuilder (com.uber.m3.tally.RootScopeBuilder)6 WorkflowOptions (com.uber.cadence.client.WorkflowOptions)5 PollForDecisionTaskResponse (com.uber.cadence.PollForDecisionTaskResponse)2 NoopScope (com.uber.cadence.internal.metrics.NoopScope)2 Decider (com.uber.cadence.internal.replay.Decider)2 WorkflowTest (com.uber.cadence.workflow.WorkflowTest)2 Scope (com.uber.m3.tally.Scope)2 StatsReporter (com.uber.m3.tally.StatsReporter)2 ImmutableMap (com.uber.m3.util.ImmutableMap)2 ThreadPoolExecutor (java.util.concurrent.ThreadPoolExecutor)2 AtomicReference (java.util.concurrent.atomic.AtomicReference)2 Test (org.junit.Test)2 WorkflowQuery (com.uber.cadence.WorkflowQuery)1 WorkflowType (com.uber.cadence.WorkflowType)1 RetryOptions (com.uber.cadence.common.RetryOptions)1 JsonDataConverter (com.uber.cadence.converter.JsonDataConverter)1 MetricsTag (com.uber.cadence.internal.metrics.MetricsTag)1 MetricsType (com.uber.cadence.internal.metrics.MetricsType)1 DecisionContext (com.uber.cadence.internal.replay.DecisionContext)1