public void print(ReadOnlyTStore<T> zs, IZooReader zk, String lockPath, Formatter fmt, Set<Long> filterTxid, EnumSet<TStatus> filterStatus) throws KeeperException, InterruptedException { FateStatus fateStatus = getStatus(zs, zk, lockPath, filterTxid, filterStatus); for (TransactionStatus txStatus : fateStatus.getTransactions()) { fmt.format("txid: %s status: %-18s op: %-15s locked: %-15s locking: %-15s top: %s%n", txStatus.getTxid(), txStatus.getStatus(), txStatus.getDebug(), txStatus.getHeldLocks(), txStatus.getWaitingLocks(), txStatus.getTop()); } fmt.format(" %s transactions", fateStatus.getTransactions().size()); if (fateStatus.getDanglingHeldLocks().size() != 0 || fateStatus.getDanglingWaitingLocks().size() != 0) { fmt.format("%nThe following locks did not have an associated FATE operation%n"); for (Entry<String,List<String>> entry : fateStatus.getDanglingHeldLocks().entrySet()) fmt.format("txid: %s locked: %s%n", entry.getKey(), entry.getValue()); for (Entry<String,List<String>> entry : fateStatus.getDanglingWaitingLocks().entrySet()) fmt.format("txid: %s locking: %s%n", entry.getKey(), entry.getValue()); } }
return new FateStatus(statuses, heldLocks, waitingLocks);
private FateStatus(List<TransactionStatus> transactions, Map<Long,List<String>> danglingHeldLocks, Map<Long,List<String>> danglingWaitingLocks) { this.transactions = Collections.unmodifiableList(transactions); this.danglingHeldLocks = convert(danglingHeldLocks); this.danglingWaitingLocks = convert(danglingWaitingLocks); }
return new FateStatus(statuses, heldLocks, waitingLocks);
/** * Checks fates in zookeeper looking for transaction associated with a compaction as a double * check that the test will be valid because the running compaction does have a fate transaction * lock. * * @return true if corresponding fate transaction found, false otherwise */ private boolean findFate(final String tableName) { Instance instance = connector.getInstance(); AdminUtil<String> admin = new AdminUtil<>(false); try { String tableId = Tables.getTableId(instance, tableName); log.trace("tid: {}", tableId); String secret = cluster.getSiteConfiguration().get(Property.INSTANCE_SECRET); IZooReaderWriter zk = new ZooReaderWriterFactory().getZooReaderWriter( instance.getZooKeepers(), instance.getZooKeepersSessionTimeOut(), secret); ZooStore<String> zs = new ZooStore<>(ZooUtil.getRoot(instance) + Constants.ZFATE, zk); AdminUtil.FateStatus fateStatus = admin.getStatus(zs, zk, ZooUtil.getRoot(instance) + Constants.ZTABLE_LOCKS + "/" + tableId, null, null); for (AdminUtil.TransactionStatus tx : fateStatus.getTransactions()) { if (tx.getTop().contains("CompactionDriver") && tx.getDebug().contains("CompactRange")) { return true; } } } catch (KeeperException | TableNotFoundException | InterruptedException ex) { throw new IllegalStateException(ex); } // did not find appropriate fate transaction for compaction. return Boolean.FALSE; }
public void print(ReadOnlyTStore<T> zs, IZooReader zk, String lockPath, Formatter fmt, Set<Long> filterTxid, EnumSet<TStatus> filterStatus) throws KeeperException, InterruptedException { FateStatus fateStatus = getStatus(zs, zk, lockPath, filterTxid, filterStatus); for (TransactionStatus txStatus : fateStatus.getTransactions()) { fmt.format("txid: %s status: %-18s op: %-15s locked: %-15s locking: %-15s top: %s%n", txStatus.getTxid(), txStatus.getStatus(), txStatus.getDebug(), txStatus.getHeldLocks(), txStatus.getWaitingLocks(), txStatus.getTop()); } fmt.format(" %s transactions", fateStatus.getTransactions().size()); if (fateStatus.getDanglingHeldLocks().size() != 0 || fateStatus.getDanglingWaitingLocks().size() != 0) { fmt.format("%nThe following locks did not have an associated FATE operation%n"); for (Entry<String,List<String>> entry : fateStatus.getDanglingHeldLocks().entrySet()) fmt.format("txid: %s locked: %s%n", entry.getKey(), entry.getValue()); for (Entry<String,List<String>> entry : fateStatus.getDanglingWaitingLocks().entrySet()) fmt.format("txid: %s locking: %s%n", entry.getKey(), entry.getValue()); } }
private FateStatus(List<TransactionStatus> transactions, Map<Long,List<String>> danglingHeldLocks, Map<Long,List<String>> danglingWaitingLocks) { this.transactions = Collections.unmodifiableList(transactions); this.danglingHeldLocks = convert(danglingHeldLocks); this.danglingWaitingLocks = convert(danglingWaitingLocks); }
public static void assertNoDanglingFateLocks(Instance instance, AccumuloCluster cluster) { FateStatus fateStatus = getFateStatus(instance, cluster); Assert.assertEquals("Dangling FATE locks : " + fateStatus.getDanglingHeldLocks(), 0, fateStatus.getDanglingHeldLocks().size()); Assert.assertEquals("Dangling FATE locks : " + fateStatus.getDanglingWaitingLocks(), 0, fateStatus.getDanglingWaitingLocks().size()); }