Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ deploy() {
if [[ "$#" == "0" ]]; then
clean
format
test
jar
javadoc
native_test
Expand Down
48 changes: 12 additions & 36 deletions src/main/java/com/github/sttk/sabi/TxnFailureReport.java
Original file line number Diff line number Diff line change
Expand Up @@ -88,54 +88,42 @@ public TxnFailureRecovery recoveryForCommit() {
switch (this.cause.state) {
case NoneByUncommitted:
switch (this.rollback.state) {
case NoneByNotRolledBack:
return TxnFailureRecovery.InvestigateBecauseImpossible;
case NoneByRolledBack:
return TxnFailureRecovery.RerunLogicAndCommit;
case RollbackFailure:
return TxnFailureRecovery.ResolveCauseAndInconsistency;
default:
return TxnFailureRecovery.InvestigateBecauseImpossible;
}
break;
case NoneByCommitted:
switch (this.rollback.state) {
case NoneByNotRolledBack:
return TxnFailureRecovery.NoActionRequired;
default:
return TxnFailureRecovery.InvestigateBecauseImpossible;
}
break;
case LogicFailure:
switch (this.rollback.state) {
case NoneByNotRolledBack:
return TxnFailureRecovery.InvestigateBecauseImpossible;
case NoneByRolledBack:
return TxnFailureRecovery.ResolveCauseThenRerunLogicAndCommit;
case RollbackFailure:
return TxnFailureRecovery.ResolveCauseAndInconsistency;
default:
return TxnFailureRecovery.InvestigateBecauseImpossible;
}
break;
case CommitFailure:
switch (this.rollback.state) {
case NoneByNotRolledBack:
return TxnFailureRecovery.InvestigateBecauseImpossible;
case NoneByRolledBack:
return TxnFailureRecovery.ResolveCauseThenRerunLogicAndCommit;
case RollbackFailure:
return TxnFailureRecovery.ResolveCauseAndInconsistency;
default:
return TxnFailureRecovery.InvestigateBecauseImpossible;
}
break;
case PostCommitFailure:
switch (this.rollback.state) {
case NoneByNotRolledBack:
return TxnFailureRecovery.ResolveCauseThenRerunPostCommit;
default:
return TxnFailureRecovery.InvestigateBecauseImpossible;
}
default:
return TxnFailureRecovery.InvestigateBecauseImpossible;
break;
}
return TxnFailureRecovery.InvestigateBecauseImpossible;
}

/**
Expand All @@ -148,53 +136,41 @@ public TxnFailureRecovery recoveryForRollback() {
switch (this.cause.state) {
case NoneByUncommitted:
switch (this.rollback.state) {
case NoneByNotRolledBack:
return TxnFailureRecovery.InvestigateBecauseImpossible;
case NoneByRolledBack:
return TxnFailureRecovery.NoActionRequired;
case RollbackFailure:
return TxnFailureRecovery.ResolveCauseAndInconsistency;
default:
return TxnFailureRecovery.InvestigateBecauseImpossible;
}
break;
case NoneByCommitted:
switch (this.rollback.state) {
case NoneByNotRolledBack:
return TxnFailureRecovery.ManualRollbackRequired;
default:
return TxnFailureRecovery.InvestigateBecauseImpossible;
}
break;
case LogicFailure:
switch (this.rollback.state) {
case NoneByNotRolledBack:
return TxnFailureRecovery.InvestigateBecauseImpossible;
case NoneByRolledBack:
return TxnFailureRecovery.NoActionRequired;
case RollbackFailure:
return TxnFailureRecovery.ResolveCauseAndInconsistency;
default:
return TxnFailureRecovery.InvestigateBecauseImpossible;
}
break;
case CommitFailure:
switch (this.rollback.state) {
case NoneByNotRolledBack:
return TxnFailureRecovery.InvestigateBecauseImpossible;
case NoneByRolledBack:
return TxnFailureRecovery.NoActionRequired;
case RollbackFailure:
return TxnFailureRecovery.ResolveCauseAndInconsistency;
default:
return TxnFailureRecovery.InvestigateBecauseImpossible;
}
break;
case PostCommitFailure:
switch (this.rollback.state) {
case NoneByNotRolledBack:
return TxnFailureRecovery.ManualRollbackRequired;
default:
return TxnFailureRecovery.InvestigateBecauseImpossible;
}
default:
return TxnFailureRecovery.InvestigateBecauseImpossible;
break;
}
return TxnFailureRecovery.InvestigateBecauseImpossible;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ List<ErrEntry> setup() {
int ii = 0, nDone = 0;
for (int i = 0, n = this.listUnready.size(); i < n; i++) {
var cont = this.listUnready.get(i);
if (cont == null || cont.ds == null) {
if (cont.ds == null) {
continue;
}
ag._name = cont.name;
Expand Down Expand Up @@ -121,7 +121,7 @@ List<ErrEntry> setupWithOrder(List<String> names) {

for (int listIndex = 0, n = this.listUnready.size(); listIndex < n; listIndex++) {
var cont = this.listUnready.get(listIndex);
if (cont != null && cont.ds != null) {
if (cont.ds != null) {
Integer orderIndex = indexedMap.get(cont.name);
if (orderIndex != null) {
orderedIndexes.set(orderIndex, listIndex);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import static org.assertj.core.api.Assertions.fail;

import com.github.sttk.errs.Err;
import com.github.sttk.sabi.AsyncGroup;
import com.github.sttk.sabi.Runner;
import org.junit.jupiter.api.Test;

Expand Down Expand Up @@ -133,16 +134,85 @@ record Reason2() {}
assertThat(errors.get(0).name).isEqualTo("foo2");
assertThat(errors.get(0).err.toString())
.isEqualTo(
"com.github.sttk.errs.Err { reason = com.github.sttk.sabi.internal.AsyncGroupImplTest$1Reason2 Reason2[], file = AsyncGroupImplTest.java, line = 114 }");
"com.github.sttk.errs.Err { reason = com.github.sttk.sabi.internal.AsyncGroupImplTest$1Reason2 Reason2[], file = AsyncGroupImplTest.java, line = 115 }");
assertThat(errors.get(1).index).isEqualTo(123);
assertThat(errors.get(1).name).isEqualTo("foo0");
assertThat(errors.get(1).err.toString())
.isEqualTo(
"com.github.sttk.errs.Err { reason = com.github.sttk.sabi.internal.AsyncGroupImplTest$1Reason0 Reason0[], file = AsyncGroupImplTest.java, line = 96 }");
"com.github.sttk.errs.Err { reason = com.github.sttk.sabi.internal.AsyncGroupImplTest$1Reason0 Reason0[], file = AsyncGroupImplTest.java, line = 97 }");
assertThat(errors.get(2).index).isEqualTo(456);
assertThat(errors.get(2).name).isEqualTo("foo1");
assertThat(errors.get(2).err.toString())
.isEqualTo(
"com.github.sttk.errs.Err { reason = com.github.sttk.sabi.internal.AsyncGroupImplTest$1Reason1 Reason1[], file = AsyncGroupImplTest.java, line = 105 }");
"com.github.sttk.errs.Err { reason = com.github.sttk.sabi.internal.AsyncGroupImplTest$1Reason1 Reason1[], file = AsyncGroupImplTest.java, line = 106 }");
}

@Test
void runButRuntimeExceptionIsThrown() {
var ag = new AsyncGroupImpl();

boolean[] executed = {false};
Runner fn =
() -> {
try {
Thread.sleep(50);
} catch (Exception e) {
fail(e);
}
executed[0] = true;
throw new RuntimeException("error");
};

ag._index = 123;
ag._name = "foo";
ag.add(fn);
assertThat(executed[0]).isFalse();

var errors = ag.join();
assertThat(executed[0]).isTrue();
assertThat(errors).hasSize(1);

assertThat(errors.get(0).index).isEqualTo(123);
assertThat(errors.get(0).name).isEqualTo("foo");
switch (errors.get(0).err.getReason()) {
case AsyncGroup.RuntimeExceptionOccured r -> {}
default -> fail();
}
assertThat(errors.get(0).err.getCause().getMessage()).isEqualTo("error");
assertThat(errors.get(0).err.getCause()).isInstanceOf(RuntimeException.class);
}

@Test
void runButInterruptedExceptionIsThrown() {
var ag = new AsyncGroupImpl();

final var mainThread = Thread.currentThread();
boolean[] executed = {false};
Runner fn =
() -> {
try {
Thread.sleep(500);
} catch (Exception e) {
}
executed[0] = true;
mainThread.interrupt();
};

ag._index = 123;
ag._name = "foo";
ag.add(fn);
assertThat(executed[0]).isFalse();

var errors = ag.join();
assertThat(executed[0]).isTrue();
assertThat(errors).hasSize(1);

assertThat(errors.get(0).index).isEqualTo(123);
assertThat(errors.get(0).name).isEqualTo("foo");
switch (errors.get(0).err.getReason()) {
case AsyncGroup.RunnerInterrupted r -> {}
default -> fail();
}
assertThat(errors.get(0).err.getCause()).isInstanceOf(InterruptedException.class);
}
}
Loading