public TxStats getStats() { return tx.getStats(); }
@Override public Collection<Mutation> createMutations(CommitData cd) { long commitTs = getStats().getCommitTs(); ArrayList<Mutation> mutations = new ArrayList<>(updates.size() + 1); for (Entry<Bytes, Map<Column, Bytes>> rowUpdates : updates.entrySet()) { Flutation m = new Flutation(env, rowUpdates.getKey()); boolean isTriggerRow = isTriggerRow(rowUpdates.getKey()); for (Entry<Column, Bytes> colUpdates : rowUpdates.getValue().entrySet()) { ColumnUtil.commitColumn(env, isTriggerRow && colUpdates.getKey().equals(notification.getColumn()), false, colUpdates.getKey(), isWrite(colUpdates.getValue()), isDelete(colUpdates.getValue()), isReadLock(colUpdates.getValue()), startTs, commitTs, observedColumns, m); } mutations.add(m); } return mutations; }
@Override public Collection<Mutation> createMutations(CommitData cd) { long commitTs = getStats().getCommitTs(); ArrayList<Mutation> mutations = new ArrayList<>(updates.size() + 1); for (Entry<Bytes, Map<Column, Bytes>> rowUpdates : updates.entrySet()) { Flutation m = new Flutation(env, rowUpdates.getKey()); boolean isTriggerRow = isTriggerRow(rowUpdates.getKey()); for (Entry<Column, Bytes> colUpdates : rowUpdates.getValue().entrySet()) { ColumnUtil.commitColumn(env, isTriggerRow && colUpdates.getKey().equals(notification.getColumn()), false, colUpdates.getKey(), isWrite(colUpdates.getValue()), isDelete(colUpdates.getValue()), isReadLock(colUpdates.getValue()), startTs, commitTs, observedColumns, m); } mutations.add(m); } return mutations; }
@Override public Collection<Mutation> createMutations(CommitData cd) { long commitTs = getStats().getCommitTs(); ArrayList<Mutation> afterFlushMutations = new ArrayList<>(2); Flutation m = new Flutation(env, cd.prow); // mark transaction as complete for garbage collection purposes m.put(cd.pcol, ColumnConstants.TX_DONE_PREFIX | commitTs, EMPTY); afterFlushMutations.add(m); if (weakNotification != null) { afterFlushMutations.add(weakNotification.newDelete(env, startTs)); } if (notification != null) { afterFlushMutations.add(notification.newDelete(env, startTs)); } return afterFlushMutations; }
@Override CompletableFuture<Void> getFailureOp(CommitData cd) { return CompletableFuture.supplyAsync(() -> { getStats().setRejected(cd.getRejected()); try { // Does this need to be async? checkForOrphanedLocks(cd); } catch (Exception e) { throw new CompletionException(e); } return null; }, env.getSharedResources().getSyncCommitExecutor()).thenCompose(v -> rollbackLocks(cd)); } }
@Override public Collection<Mutation> createMutations(CommitData cd) { long commitTs = getStats().getCommitTs(); HashMap<Bytes, Mutation> mutations = new HashMap<>();
@Override CompletableFuture<Void> getFailureOp(CommitData cd) { return CompletableFuture.supplyAsync(() -> { getStats().setRejected(cd.getRejected()); try { // Does this need to be async? checkForOrphanedLocks(cd); } catch (Exception e) { throw new CompletionException(e); } return null; }, env.getSharedResources().getSyncCommitExecutor()).thenCompose(v -> rollbackLocks(cd)); } }
@Override public Collection<Mutation> createMutations(CommitData cd) { long commitTs = getStats().getCommitTs(); HashMap<Bytes, Mutation> mutations = new HashMap<>();
@Override CompletableFuture<Boolean> getMainOp(CommitData cd) { return getStampOp().thenApply(commitStamp -> { if (startTs < commitStamp.getGcTimestamp()) { return false; } else { getStats().setCommitTs(commitStamp.getTxTimestamp()); return true; } }); }
@Override CompletableFuture<Boolean> getMainOp(CommitData cd) { return getStampOp().thenApply(commitStamp -> { if (startTs < commitStamp.getGcTimestamp()) { return false; } else { getStats().setCommitTs(commitStamp.getTxTimestamp()); return true; } }); }
@VisibleForTesting public boolean finishCommit(CommitData cd, Stamp commitStamp) { cd.commitObserver = new SyncCommitObserver(); getStats().setCommitTs(commitStamp.getTxTimestamp()); CommitStep firstStep = new DeleteLocksStep(); firstStep.andThen(new FinishCommitStep()); firstStep.compose(cd).exceptionally(throwable -> { System.err.println("Unexpected exception in finish commit test method : "); throwable.printStackTrace(); return null; }); return true; }
@VisibleForTesting public boolean finishCommit(CommitData cd, Stamp commitStamp) { cd.commitObserver = new SyncCommitObserver(); getStats().setCommitTs(commitStamp.getTxTimestamp()); CommitStep firstStep = new DeleteLocksStep(); firstStep.andThen(new FinishCommitStep()); firstStep.compose(cd).exceptionally(throwable -> { System.err.println("Unexpected exception in finish commit test method : "); throwable.printStackTrace(); return null; }); return true; }
@Override public Collection<Mutation> createMutations(CommitData cd) { long commitTs = getStats().getCommitTs(); ArrayList<Mutation> afterFlushMutations = new ArrayList<>(2); Flutation m = new Flutation(env, cd.prow); // mark transaction as complete for garbage collection purposes m.put(cd.pcol, ColumnType.TX_DONE.encode(commitTs), EMPTY); afterFlushMutations.add(m); if (weakNotification != null) { afterFlushMutations.add(weakNotification.newDelete(env, startTs)); } if (notification != null) { afterFlushMutations.add(notification.newDelete(env, startTs)); } return afterFlushMutations; }
@Override CompletableFuture<Void> getFailureOp(CommitData cd) { // TODO can this be simplified by pushing some code to the superclass? return CompletableFuture.supplyAsync(() -> { final ConditionalMutation pcm = Iterables.getOnlyElement(createMutations(cd)); cd.addPrimaryToRejected(); getStats().setRejected(cd.getRejected()); // TODO do async try { checkForOrphanedLocks(cd); } catch (Exception e) { throw new CompletionException(e); } if (checkForAckCollision(pcm)) { cd.commitObserver.alreadyAcknowledged(); } else { cd.commitObserver.commitFailed(cd.getShortCollisionMessage()); } return null; }, env.getSharedResources().getSyncCommitExecutor()); }
@Override CompletableFuture<Void> getFailureOp(CommitData cd) { // TODO can this be simplified by pushing some code to the superclass? return CompletableFuture.supplyAsync(() -> { final ConditionalMutation pcm = Iterables.getOnlyElement(createMutations(cd)); cd.addPrimaryToRejected(); getStats().setRejected(cd.getRejected()); // TODO do async try { checkForOrphanedLocks(cd); } catch (Exception e) { throw new CompletionException(e); } if (checkForAckCollision(pcm)) { cd.commitObserver.alreadyAcknowledged(); } else { cd.commitObserver.commitFailed(cd.getShortCollisionMessage()); } return null; }, env.getSharedResources().getSyncCommitExecutor()); }
long commitTs = getStats().getCommitTs(); Result result = Iterators.getOnlyElement(results); Status ms = result.getStatus();
long commitTs = getStats().getCommitTs(); Result result = Iterators.getOnlyElement(results); Status ms = result.getStatus();
@Override public Collection<ConditionalMutation> createMutations(CommitData cd) { long commitTs = getStats().getCommitTs(); IteratorSetting iterConf = new IteratorSetting(10, PrewriteIterator.class); PrewriteIterator.setSnaptime(iterConf, startTs); boolean isTrigger = isTriggerRow(cd.prow) && cd.pcol.equals(notification.getColumn()); Condition lockCheck = new FluoCondition(env, cd.pcol).setIterators(iterConf).setValue(LockValue.encode(cd.prow, cd.pcol, isWrite(cd.pval), isDelete(cd.pval), isTrigger, getTransactorID())); final ConditionalMutation delLockMutation = new ConditionalFlutation(env, cd.prow, lockCheck); ColumnUtil.commitColumn(env, isTrigger, true, cd.pcol, isWrite(cd.pval), isDelete(cd.pval), isReadLock(cd.pval), startTs, commitTs, observedColumns, delLockMutation); return Collections.singletonList(delLockMutation); }
@Override public Collection<ConditionalMutation> createMutations(CommitData cd) { long commitTs = getStats().getCommitTs(); IteratorSetting iterConf = new IteratorSetting(10, PrewriteIterator.class); PrewriteIterator.setSnaptime(iterConf, startTs); boolean isTrigger = isTriggerRow(cd.prow) && cd.pcol.equals(notification.getColumn()); Condition lockCheck = new FluoCondition(env, cd.pcol).setIterators(iterConf).setValue(LockValue.encode(cd.prow, cd.pcol, isWrite(cd.pval), isDelete(cd.pval), isTrigger, getTransactorID())); final ConditionalMutation delLockMutation = new ConditionalFlutation(env, cd.prow, lockCheck); ColumnUtil.commitColumn(env, isTrigger, true, cd.pcol, isWrite(cd.pval), isDelete(cd.pval), isReadLock(cd.pval), startTs, commitTs, observedColumns, delLockMutation); return Collections.singletonList(delLockMutation); }
Assert.assertEquals(0, tx3.getStats().getDeadLocks()); Assert.assertEquals(0, tx3.getStats().getTimedOutLocks()); Assert.assertEquals(1, tx3.getStats().getDeadLocks()); Assert.assertEquals(0, tx3.getStats().getTimedOutLocks()); } else { Assert.assertEquals(0, tx3.getStats().getDeadLocks()); Assert.assertEquals(1, tx3.getStats().getTimedOutLocks());