public static TransactionConflictException create( TableReference tableRef, long timestamp, Collection<CellConflict> spanningWrites, Collection<CellConflict> dominatingWrites, long elapsedMillis) { StringBuilder sb = new StringBuilder(); sb.append("Transaction Conflict after ") .append(elapsedMillis) .append(" ms for table: ") .append(tableRef.getQualifiedName()) .append(" with start timestamp: ") .append(timestamp) .append('\n'); if (!spanningWrites.isEmpty()) { sb.append("Another transaction wrote values before our start timestamp and committed after. Cells:\n"); formatConflicts(spanningWrites, sb); sb.append('\n'); } if (!dominatingWrites.isEmpty()) { sb.append("Another transaction wrote and committed between our start and end ts.") .append(" It is possible we are a long running transaction. Cells:\n"); formatConflicts(dominatingWrites, sb); sb.append('\n'); } return new TransactionConflictException(sb.toString(), spanningWrites, dominatingWrites); }
protected void throwIfWriteAlreadyCommitted(TableReference tableRef, Map<Cell, byte[]> writes, ConflictHandler conflictHandler, LockToken commitLocksToken, TransactionService transactionService) throws TransactionConflictException { if (writes.isEmpty() || !conflictHandler.checkWriteWriteConflicts()) { return; } Set<CellConflict> spanningWrites = Sets.newHashSet(); Set<CellConflict> dominatingWrites = Sets.newHashSet(); Map<Cell, Long> keysToLoad = Maps.asMap(writes.keySet(), Functions.constant(Long.MAX_VALUE)); while (!keysToLoad.isEmpty()) { keysToLoad = detectWriteAlreadyCommittedInternal( tableRef, keysToLoad, spanningWrites, dominatingWrites, transactionService); } if (conflictHandler == ConflictHandler.RETRY_ON_VALUE_CHANGED) { throwIfValueChangedConflict(tableRef, writes, spanningWrites, dominatingWrites, commitLocksToken); } else { if (!spanningWrites.isEmpty() || !dominatingWrites.isEmpty()) { transactionOutcomeMetrics.markWriteWriteConflict(tableRef); throw TransactionConflictException.create(tableRef, getStartTimestamp(), spanningWrites, dominatingWrites, System.currentTimeMillis() - timeCreated); } } }
public static TransactionConflictException create( TableReference tableRef, long timestamp, Collection<CellConflict> spanningWrites, Collection<CellConflict> dominatingWrites, long elapsedMillis) { StringBuilder sb = new StringBuilder(); sb.append("Transaction Conflict after ") .append(elapsedMillis) .append(" ms for table: ") .append(tableRef.getQualifiedName()) .append(" with start timestamp: ") .append(timestamp) .append('\n'); if (!spanningWrites.isEmpty()) { sb.append("Another transaction wrote values before our start timestamp and committed after. Cells:\n"); formatConflicts(spanningWrites, sb); sb.append('\n'); } if (!dominatingWrites.isEmpty()) { sb.append("Another transaction wrote and committed between our start and end ts.") .append(" It is possible we are a long running transaction. Cells:\n"); formatConflicts(dominatingWrites, sb); sb.append('\n'); } return new TransactionConflictException(sb.toString(), spanningWrites, dominatingWrites); }
CellConflict.getCellFunction()); transactionOutcomeMetrics.markWriteWriteConflict(table); throw TransactionConflictException.create(table, getStartTimestamp(), Sets.filter(spanningWrites, conflicting),
protected void throwIfWriteAlreadyCommitted(TableReference tableRef, Map<Cell, byte[]> writes, ConflictHandler conflictHandler, LockToken commitLocksToken, TransactionService transactionService) throws TransactionConflictException { if (writes.isEmpty() || !conflictHandler.checkWriteWriteConflicts()) { return; } Set<CellConflict> spanningWrites = Sets.newHashSet(); Set<CellConflict> dominatingWrites = Sets.newHashSet(); Map<Cell, Long> keysToLoad = Maps.asMap(writes.keySet(), Functions.constant(Long.MAX_VALUE)); while (!keysToLoad.isEmpty()) { keysToLoad = detectWriteAlreadyCommittedInternal( tableRef, keysToLoad, spanningWrites, dominatingWrites, transactionService); } if (conflictHandler == ConflictHandler.RETRY_ON_VALUE_CHANGED) { throwIfValueChangedConflict(tableRef, writes, spanningWrites, dominatingWrites, commitLocksToken); } else { if (!spanningWrites.isEmpty() || !dominatingWrites.isEmpty()) { transactionOutcomeMetrics.markWriteWriteConflict(tableRef); throw TransactionConflictException.create(tableRef, getStartTimestamp(), spanningWrites, dominatingWrites, System.currentTimeMillis() - timeCreated); } } }
CellConflict.getCellFunction()); transactionOutcomeMetrics.markWriteWriteConflict(table); throw TransactionConflictException.create(table, getStartTimestamp(), Sets.filter(spanningWrites, conflicting),