Search in sources :

Example 1 with Decider

use of com.uber.cadence.internal.replay.Decider 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 2 with Decider

use of com.uber.cadence.internal.replay.Decider 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

PollForDecisionTaskResponse (com.uber.cadence.PollForDecisionTaskResponse)2 Decider (com.uber.cadence.internal.replay.Decider)2 DeciderCache (com.uber.cadence.internal.replay.DeciderCache)2 WorkflowTest (com.uber.cadence.workflow.WorkflowTest)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 NoopScope (com.uber.cadence.internal.metrics.NoopScope)1 DecisionContext (com.uber.cadence.internal.replay.DecisionContext)1 HistoryUtils (com.uber.cadence.testUtils.HistoryUtils)1 Async (com.uber.cadence.workflow.Async)1 CancellationScope (com.uber.cadence.workflow.CancellationScope)1 CompletablePromise (com.uber.cadence.workflow.CompletablePromise)1 Functions (com.uber.cadence.workflow.Functions)1