in modules/core/src/main/java/org/apache/fluo/core/impl/TransactionImpl.java [973:1012]
public Iterator<Result> handleUnknown(CommitData cd, Iterator<Result> results)
throws Exception {
Result result = Iterators.getOnlyElement(results);
Status mutationStatus = result.getStatus();
// TODO convert this code to async
while (mutationStatus == Status.UNKNOWN) {
TxInfo txInfo = TxInfo.getTransactionInfo(env, cd.prow, cd.pcol, startTs);
switch (txInfo.getStatus()) {
case LOCKED:
return Collections
.singleton(
new Result(Status.ACCEPTED, result.getMutation(), result.getTabletServer()))
.iterator();
case ROLLED_BACK:
return Collections
.singleton(
new Result(Status.REJECTED, result.getMutation(), result.getTabletServer()))
.iterator();
case UNKNOWN:
// TODO async
Result newResult = cd.cw.write(result.getMutation());
mutationStatus = newResult.getStatus();
if (mutationStatus != Status.UNKNOWN) {
return Collections.singleton(newResult).iterator();
}
// TODO handle case were data other tx has lock
break;
case COMMITTED:
default:
throw new IllegalStateException(
"unexpected tx state " + txInfo.getStatus() + " " + cd.prow + " " + cd.pcol);
}
}
// TODO
throw new IllegalStateException();
}