diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/DeletedBlockLogImpl.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/DeletedBlockLogImpl.java index 987f293dd14c..45d6a0249388 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/DeletedBlockLogImpl.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/DeletedBlockLogImpl.java @@ -137,6 +137,7 @@ public List getFailedTransactions(int count, } } } else { + iter.seek(startTxId); while (iter.hasNext() && failedTXs.size() < count) { DeletedBlocksTransaction delTX = iter.next().getValue(); if (delTX.getCount() == -1 && delTX.getTxID() >= startTxId) { diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/DeletedBlockLogStateManagerImpl.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/DeletedBlockLogStateManagerImpl.java index ceeb27861353..6e6440c324b6 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/DeletedBlockLogStateManagerImpl.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/DeletedBlockLogStateManagerImpl.java @@ -144,7 +144,9 @@ public void seekToLast() { @Override public TypedTable.KeyValue seek( Long key) throws IOException { - throw new UnsupportedOperationException("seek"); + iter.seek(key); + findNext(); + return nextTx; } @Override diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/shell/TestDeletedBlocksTxnShell.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/shell/TestDeletedBlocksTxnShell.java index 6f6c5439d8c1..730a2479a518 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/shell/TestDeletedBlocksTxnShell.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/shell/TestDeletedBlocksTxnShell.java @@ -259,5 +259,27 @@ public void testDeletedBlocksTxnSubcommand() throws Exception { currentValidTxnNum = deletedBlockLog.getNumOfValidTransactions(); LOG.info("Valid num of txns: {}", currentValidTxnNum); assertEquals(30, currentValidTxnNum); + + // Fail first 20 txns be failed + // increment retry count than threshold, count will be set to -1 + for (int i = 0; i < maxRetry + 1; i++) { + deletedBlockLog.incrementCount(txIds); + } + flush(); + + GetFailedDeletedBlocksTxnSubcommand getFailedBlockCommand = + new GetFailedDeletedBlocksTxnSubcommand(); + outContent.reset(); + cmd = new CommandLine(getFailedBlockCommand); + // set start transaction as 15 + cmd.parseArgs("-c", "5", "-s", "15"); + getFailedBlockCommand.execute(scmClient); + matchCount = 0; + p = Pattern.compile("\"txID\" : \\d+", Pattern.MULTILINE); + m = p.matcher(outContent.toString(DEFAULT_ENCODING)); + while (m.find()) { + matchCount += 1; + } + assertEquals(5, matchCount); } }