Search in sources :

Example 1 with RecoverableException

use of io.camunda.zeebe.util.exception.RecoverableException in project zeebe by camunda.

the class StreamProcessorTest method shouldRetryProcessingRecordOnRecoverableException.

@Test
public void shouldRetryProcessingRecordOnRecoverableException() {
    // given
    final TypedRecordProcessor<?> typedRecordProcessor = mock(TypedRecordProcessor.class);
    final AtomicInteger count = new AtomicInteger(0);
    doAnswer((invocationOnMock -> {
        if (count.getAndIncrement() == 0) {
            throw new RecoverableException("recoverable");
        }
        return null;
    })).when(typedRecordProcessor).processRecord(anyLong(), any(), any(), any(), any());
    streamProcessorRule.startTypedStreamProcessor((processors, state) -> processors.onCommand(ValueType.PROCESS_INSTANCE, ProcessInstanceIntent.ACTIVATE_ELEMENT, typedRecordProcessor));
    // when
    final long position = streamProcessorRule.writeCommand(ProcessInstanceIntent.ACTIVATE_ELEMENT, PROCESS_INSTANCE_RECORD);
    // then
    final InOrder inOrder = inOrder(typedRecordProcessor);
    inOrder.verify(typedRecordProcessor, TIMEOUT.times(1)).onRecovered(any());
    inOrder.verify(typedRecordProcessor, TIMEOUT.times(2)).processRecord(eq(position), any(), any(), any(), any());
    inOrder.verifyNoMoreInteractions();
}
Also used : ArgumentMatchers.any(org.mockito.ArgumentMatchers.any) ArgumentMatchers.anyLong(org.mockito.ArgumentMatchers.anyLong) RecordType(io.camunda.zeebe.protocol.record.RecordType) ProcessInstanceIntent(io.camunda.zeebe.protocol.record.intent.ProcessInstanceIntent) ArgumentMatchers.eq(org.mockito.ArgumentMatchers.eq) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) ValueType(io.camunda.zeebe.protocol.record.ValueType) CommandResponseWriter(io.camunda.zeebe.engine.processing.streamprocessor.writers.CommandResponseWriter) JobRecord(io.camunda.zeebe.protocol.impl.record.value.job.JobRecord) TypedResponseWriter(io.camunda.zeebe.engine.processing.streamprocessor.writers.TypedResponseWriter) RecoverableException(io.camunda.zeebe.util.exception.RecoverableException) Mockito.timeout(org.mockito.Mockito.timeout) Record(io.camunda.zeebe.protocol.record.Record) ArgumentCaptor(org.mockito.ArgumentCaptor) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Mockito.doAnswer(org.mockito.Mockito.doAnswer) TestUtil(io.camunda.zeebe.test.util.TestUtil) Assertions(org.assertj.core.api.Assertions) Records(io.camunda.zeebe.engine.util.Records) UnifiedRecordValue(io.camunda.zeebe.protocol.impl.record.UnifiedRecordValue) TypedStreamWriter(io.camunda.zeebe.engine.processing.streamprocessor.writers.TypedStreamWriter) ArgumentMatchers.anyInt(org.mockito.ArgumentMatchers.anyInt) InOrder(org.mockito.InOrder) VerificationWithTimeout(org.mockito.verification.VerificationWithTimeout) SideEffectProducer(io.camunda.zeebe.engine.processing.streamprocessor.sideeffect.SideEffectProducer) MutableZeebeState(io.camunda.zeebe.engine.state.mutable.MutableZeebeState) Mockito.times(org.mockito.Mockito.times) Test(org.junit.Test) Mockito.verify(org.mockito.Mockito.verify) ExecutionException(java.util.concurrent.ExecutionException) TimeUnit(java.util.concurrent.TimeUnit) Consumer(java.util.function.Consumer) CountDownLatch(java.util.concurrent.CountDownLatch) Mockito.never(org.mockito.Mockito.never) Rule(org.junit.Rule) ProcessInstanceRecord(io.camunda.zeebe.protocol.impl.record.value.processinstance.ProcessInstanceRecord) ActorControl(io.camunda.zeebe.util.sched.ActorControl) RejectionType(io.camunda.zeebe.protocol.record.RejectionType) Mockito.inOrder(org.mockito.Mockito.inOrder) StreamProcessorRule(io.camunda.zeebe.engine.util.StreamProcessorRule) Optional(java.util.Optional) Awaitility(org.awaitility.Awaitility) Mockito.mock(org.mockito.Mockito.mock) InOrder(org.mockito.InOrder) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) RecoverableException(io.camunda.zeebe.util.exception.RecoverableException) Test(org.junit.Test)

Example 2 with RecoverableException

use of io.camunda.zeebe.util.exception.RecoverableException in project zeebe by camunda.

the class ZeebeRocksDbTransactionTest method shouldReThrowRecoverableExceptionInTransactionRun.

@Test(expected = RecoverableException.class)
public void shouldReThrowRecoverableExceptionInTransactionRun() throws Exception {
    // given
    final Status status = new Status(Code.IOError, SubCode.None, "");
    // when
    final ZeebeDbTransaction currentTransaction = transactionContext.getCurrentTransaction();
    currentTransaction.run(() -> {
        throw new RecoverableException(new RocksDBException("expected", status));
    });
}
Also used : Status(org.rocksdb.Status) ZeebeDbTransaction(io.camunda.zeebe.db.ZeebeDbTransaction) RocksDBException(org.rocksdb.RocksDBException) RecoverableException(io.camunda.zeebe.util.exception.RecoverableException) Test(org.junit.Test)

Example 3 with RecoverableException

use of io.camunda.zeebe.util.exception.RecoverableException in project zeebe by camunda.

the class RecoverableRetryStrategyTest method shouldRetryOnException.

@Test
public void shouldRetryOnException() throws Exception {
    // given
    final AtomicInteger count = new AtomicInteger(0);
    final AtomicBoolean toggle = new AtomicBoolean(false);
    // when
    actorControl.run(() -> {
        resultFuture = recoverableRetryStrategy.runWithRetry(() -> {
            toggle.set(!toggle.get());
            if (toggle.get()) {
                throw new RecoverableException("expected");
            }
            return count.incrementAndGet() == 10;
        });
    });
    schedulerRule.workUntilDone();
    // then
    assertThat(count.get()).isEqualTo(10);
    assertThat(resultFuture.isDone()).isTrue();
    assertThat(resultFuture.get()).isTrue();
}
Also used : AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) RecoverableException(io.camunda.zeebe.util.exception.RecoverableException) Test(org.junit.Test)

Example 4 with RecoverableException

use of io.camunda.zeebe.util.exception.RecoverableException in project zeebe by zeebe-io.

the class ZeebeRocksDbTransactionTest method shouldReThrowRecoverableException.

@Test(expected = RecoverableException.class)
public void shouldReThrowRecoverableException() {
    // given
    final Status status = new Status(Code.IOError, SubCode.None, "");
    // when
    transactionContext.runInTransaction(() -> {
        throw new RecoverableException(new RocksDBException("expected", status));
    });
}
Also used : Status(org.rocksdb.Status) RocksDBException(org.rocksdb.RocksDBException) RecoverableException(io.camunda.zeebe.util.exception.RecoverableException) Test(org.junit.Test)

Example 5 with RecoverableException

use of io.camunda.zeebe.util.exception.RecoverableException in project zeebe by zeebe-io.

the class StreamProcessorTest method shouldRetryProcessingRecordOnRecoverableException.

@Test
public void shouldRetryProcessingRecordOnRecoverableException() {
    // given
    final TypedRecordProcessor<?> typedRecordProcessor = mock(TypedRecordProcessor.class);
    final AtomicInteger count = new AtomicInteger(0);
    doAnswer((invocationOnMock -> {
        if (count.getAndIncrement() == 0) {
            throw new RecoverableException("recoverable");
        }
        return null;
    })).when(typedRecordProcessor).processRecord(anyLong(), any(), any(), any(), any());
    streamProcessorRule.startTypedStreamProcessor((processors, state) -> processors.onCommand(ValueType.PROCESS_INSTANCE, ProcessInstanceIntent.ACTIVATE_ELEMENT, typedRecordProcessor));
    // when
    final long position = streamProcessorRule.writeCommand(ProcessInstanceIntent.ACTIVATE_ELEMENT, PROCESS_INSTANCE_RECORD);
    // then
    final InOrder inOrder = inOrder(typedRecordProcessor);
    inOrder.verify(typedRecordProcessor, TIMEOUT.times(1)).onRecovered(any());
    inOrder.verify(typedRecordProcessor, TIMEOUT.times(2)).processRecord(eq(position), any(), any(), any(), any());
    inOrder.verifyNoMoreInteractions();
}
Also used : ArgumentMatchers.any(org.mockito.ArgumentMatchers.any) ArgumentMatchers.anyLong(org.mockito.ArgumentMatchers.anyLong) RecordType(io.camunda.zeebe.protocol.record.RecordType) ProcessInstanceIntent(io.camunda.zeebe.protocol.record.intent.ProcessInstanceIntent) ArgumentMatchers.eq(org.mockito.ArgumentMatchers.eq) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) ValueType(io.camunda.zeebe.protocol.record.ValueType) CommandResponseWriter(io.camunda.zeebe.engine.processing.streamprocessor.writers.CommandResponseWriter) JobRecord(io.camunda.zeebe.protocol.impl.record.value.job.JobRecord) TypedResponseWriter(io.camunda.zeebe.engine.processing.streamprocessor.writers.TypedResponseWriter) RecoverableException(io.camunda.zeebe.util.exception.RecoverableException) Mockito.timeout(org.mockito.Mockito.timeout) Record(io.camunda.zeebe.protocol.record.Record) ArgumentCaptor(org.mockito.ArgumentCaptor) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Mockito.doAnswer(org.mockito.Mockito.doAnswer) TestUtil(io.camunda.zeebe.test.util.TestUtil) Assertions(org.assertj.core.api.Assertions) Records(io.camunda.zeebe.engine.util.Records) UnifiedRecordValue(io.camunda.zeebe.protocol.impl.record.UnifiedRecordValue) TypedStreamWriter(io.camunda.zeebe.engine.processing.streamprocessor.writers.TypedStreamWriter) ArgumentMatchers.anyInt(org.mockito.ArgumentMatchers.anyInt) InOrder(org.mockito.InOrder) VerificationWithTimeout(org.mockito.verification.VerificationWithTimeout) SideEffectProducer(io.camunda.zeebe.engine.processing.streamprocessor.sideeffect.SideEffectProducer) MutableZeebeState(io.camunda.zeebe.engine.state.mutable.MutableZeebeState) Mockito.times(org.mockito.Mockito.times) Test(org.junit.Test) Mockito.verify(org.mockito.Mockito.verify) ExecutionException(java.util.concurrent.ExecutionException) TimeUnit(java.util.concurrent.TimeUnit) Consumer(java.util.function.Consumer) CountDownLatch(java.util.concurrent.CountDownLatch) Mockito.never(org.mockito.Mockito.never) Rule(org.junit.Rule) ProcessInstanceRecord(io.camunda.zeebe.protocol.impl.record.value.processinstance.ProcessInstanceRecord) ActorControl(io.camunda.zeebe.util.sched.ActorControl) RejectionType(io.camunda.zeebe.protocol.record.RejectionType) Mockito.inOrder(org.mockito.Mockito.inOrder) StreamProcessorRule(io.camunda.zeebe.engine.util.StreamProcessorRule) Optional(java.util.Optional) Awaitility(org.awaitility.Awaitility) Mockito.mock(org.mockito.Mockito.mock) InOrder(org.mockito.InOrder) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) RecoverableException(io.camunda.zeebe.util.exception.RecoverableException) Test(org.junit.Test)

Aggregations

RecoverableException (io.camunda.zeebe.util.exception.RecoverableException)12 Test (org.junit.Test)12 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)6 RocksDBException (org.rocksdb.RocksDBException)6 Status (org.rocksdb.Status)6 ZeebeDbTransaction (io.camunda.zeebe.db.ZeebeDbTransaction)3 SideEffectProducer (io.camunda.zeebe.engine.processing.streamprocessor.sideeffect.SideEffectProducer)3 CommandResponseWriter (io.camunda.zeebe.engine.processing.streamprocessor.writers.CommandResponseWriter)3 TypedResponseWriter (io.camunda.zeebe.engine.processing.streamprocessor.writers.TypedResponseWriter)3 TypedStreamWriter (io.camunda.zeebe.engine.processing.streamprocessor.writers.TypedStreamWriter)3 MutableZeebeState (io.camunda.zeebe.engine.state.mutable.MutableZeebeState)3 Records (io.camunda.zeebe.engine.util.Records)3 StreamProcessorRule (io.camunda.zeebe.engine.util.StreamProcessorRule)3 UnifiedRecordValue (io.camunda.zeebe.protocol.impl.record.UnifiedRecordValue)3 JobRecord (io.camunda.zeebe.protocol.impl.record.value.job.JobRecord)3 ProcessInstanceRecord (io.camunda.zeebe.protocol.impl.record.value.processinstance.ProcessInstanceRecord)3 Record (io.camunda.zeebe.protocol.record.Record)3 RecordType (io.camunda.zeebe.protocol.record.RecordType)3 RejectionType (io.camunda.zeebe.protocol.record.RejectionType)3 ValueType (io.camunda.zeebe.protocol.record.ValueType)3