From hdfs-commits-return-4661-apmail-hadoop-hdfs-commits-archive=hadoop.apache.org@hadoop.apache.org Tue Oct 16 02:00:33 2012 Return-Path: X-Original-To: apmail-hadoop-hdfs-commits-archive@minotaur.apache.org Delivered-To: apmail-hadoop-hdfs-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 23A63DBBE for ; Tue, 16 Oct 2012 02:00:33 +0000 (UTC) Received: (qmail 7563 invoked by uid 500); 16 Oct 2012 02:00:33 -0000 Delivered-To: apmail-hadoop-hdfs-commits-archive@hadoop.apache.org Received: (qmail 7496 invoked by uid 500); 16 Oct 2012 02:00:32 -0000 Mailing-List: contact hdfs-commits-help@hadoop.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: hdfs-dev@hadoop.apache.org Delivered-To: mailing list hdfs-commits@hadoop.apache.org Received: (qmail 7487 invoked by uid 99); 16 Oct 2012 02:00:32 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 16 Oct 2012 02:00:32 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 16 Oct 2012 02:00:30 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id BF3B723889D7; Tue, 16 Oct 2012 01:59:47 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1398609 - in /hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs: ./ src/main/java/org/apache/hadoop/hdfs/ src/main/java/org/apache/hadoop/hdfs/server/namenode/ src/main/resources/ src/test/java/org/apache/hadoop/hdfs/server/namenode/ Date: Tue, 16 Oct 2012 01:59:47 -0000 To: hdfs-commits@hadoop.apache.org From: atm@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20121016015947.BF3B723889D7@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: atm Date: Tue Oct 16 01:59:46 2012 New Revision: 1398609 URL: http://svn.apache.org/viewvc?rev=1398609&view=rev Log: HDFS-2946. HA: Put a cap on the number of completed edits files retained by the NN. Contributed by Aaron T. Myers. Modified: hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSConfigKeys.java hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLog.java hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FileJournalManager.java hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/JournalManager.java hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/LogsPurgeable.java hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NNStorageRetentionManager.java hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/SecondaryNameNode.java hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/resources/hdfs-default.xml hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNNStorageRetentionManager.java Modified: hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt?rev=1398609&r1=1398608&r2=1398609&view=diff ============================================================================== --- hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt (original) +++ hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt Tue Oct 16 01:59:46 2012 @@ -386,6 +386,9 @@ Release 2.0.3-alpha - Unreleased HDFS-4036. Remove "throw UnresolvedLinkException" from FSDirectory.unprotectedAddFile(..). (Jing Zhao via szetszwo) + HDFS-2946. HA: Put a cap on the number of completed edits files retained + by the NN. (atm) + OPTIMIZATIONS BUG FIXES Modified: hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSConfigKeys.java URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSConfigKeys.java?rev=1398609&r1=1398608&r2=1398609&view=diff ============================================================================== --- hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSConfigKeys.java (original) +++ hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSConfigKeys.java Tue Oct 16 01:59:46 2012 @@ -162,6 +162,8 @@ public class DFSConfigKeys extends Commo public static final int DFS_NAMENODE_NUM_CHECKPOINTS_RETAINED_DEFAULT = 2; public static final String DFS_NAMENODE_NUM_EXTRA_EDITS_RETAINED_KEY = "dfs.namenode.num.extra.edits.retained"; public static final int DFS_NAMENODE_NUM_EXTRA_EDITS_RETAINED_DEFAULT = 1000000; //1M + public static final String DFS_NAMENODE_MAX_EXTRA_EDITS_SEGMENTS_RETAINED_KEY = "dfs.namenode.max.extra.edits.segments.retained"; + public static final int DFS_NAMENODE_MAX_EXTRA_EDITS_SEGMENTS_RETAINED_DEFAULT = 10000; // 10k public static final String DFS_NAMENODE_MIN_SUPPORTED_DATANODE_VERSION_KEY = "dfs.namenode.min.supported.datanode.version"; public static final String DFS_NAMENODE_MIN_SUPPORTED_DATANODE_VERSION_DEFAULT = "3.0.0-SNAPSHOT"; Modified: hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLog.java URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLog.java?rev=1398609&r1=1398608&r2=1398609&view=diff ============================================================================== --- hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLog.java (original) +++ hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLog.java Tue Oct 16 01:59:46 2012 @@ -1174,6 +1174,11 @@ public class FSEditLog implements LogsPu // TODO: are we sure this is OK? } } + + public void selectInputStreams(Collection streams, + long fromTxId, boolean inProgressOk) { + journalSet.selectInputStreams(streams, fromTxId, inProgressOk); + } public Collection selectInputStreams( long fromTxId, long toAtLeastTxId) throws IOException { @@ -1191,7 +1196,7 @@ public class FSEditLog implements LogsPu long fromTxId, long toAtLeastTxId, MetaRecoveryContext recovery, boolean inProgressOk) throws IOException { List streams = new ArrayList(); - journalSet.selectInputStreams(streams, fromTxId, inProgressOk); + selectInputStreams(streams, fromTxId, inProgressOk); try { checkForGaps(streams, fromTxId, toAtLeastTxId, inProgressOk); Modified: hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FileJournalManager.java URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FileJournalManager.java?rev=1398609&r1=1398608&r2=1398609&view=diff ============================================================================== --- hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FileJournalManager.java (original) +++ hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FileJournalManager.java Tue Oct 16 01:59:46 2012 @@ -247,6 +247,11 @@ public class FileJournalManager implemen LOG.debug(this + ": selecting input streams starting at " + fromTxId + (inProgressOk ? " (inProgress ok) " : " (excluding inProgress) ") + "from among " + elfs.size() + " candidate file(s)"); + addStreamsToCollectionFromFiles(elfs, streams, fromTxId, inProgressOk); + } + + static void addStreamsToCollectionFromFiles(Collection elfs, + Collection streams, long fromTxId, boolean inProgressOk) { for (EditLogFile elf : elfs) { if (elf.isInProgress()) { if (!inProgressOk) { Modified: hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/JournalManager.java URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/JournalManager.java?rev=1398609&r1=1398608&r2=1398609&view=diff ============================================================================== --- hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/JournalManager.java (original) +++ hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/JournalManager.java Tue Oct 16 01:59:46 2012 @@ -19,7 +19,6 @@ package org.apache.hadoop.hdfs.server.na import java.io.Closeable; import java.io.IOException; -import java.util.Collection; import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; @@ -56,21 +55,6 @@ public interface JournalManager extends */ void finalizeLogSegment(long firstTxId, long lastTxId) throws IOException; - /** - * Get a list of edit log input streams. The list will start with the - * stream that contains fromTxnId, and continue until the end of the journal - * being managed. - * - * @param fromTxnId the first transaction id we want to read - * @param inProgressOk whether or not in-progress streams should be returned - * - * @return a list of streams - * @throws IOException if the underlying storage has an error or is otherwise - * inaccessible - */ - void selectInputStreams(Collection streams, - long fromTxnId, boolean inProgressOk) throws IOException; - /** * Set the amount of memory that this stream should use to buffer edits */ Modified: hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/LogsPurgeable.java URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/LogsPurgeable.java?rev=1398609&r1=1398608&r2=1398609&view=diff ============================================================================== --- hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/LogsPurgeable.java (original) +++ hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/LogsPurgeable.java Tue Oct 16 01:59:46 2012 @@ -18,6 +18,7 @@ package org.apache.hadoop.hdfs.server.namenode; import java.io.IOException; +import java.util.Collection; /** * Interface used to abstract over classes which manage edit logs that may need @@ -33,5 +34,20 @@ interface LogsPurgeable { * @throws IOException in the event of error */ public void purgeLogsOlderThan(long minTxIdToKeep) throws IOException; - + + /** + * Get a list of edit log input streams. The list will start with the + * stream that contains fromTxnId, and continue until the end of the journal + * being managed. + * + * @param fromTxId the first transaction id we want to read + * @param inProgressOk whether or not in-progress streams should be returned + * + * @return a list of streams + * @throws IOException if the underlying storage has an error or is otherwise + * inaccessible + */ + void selectInputStreams(Collection streams, + long fromTxId, boolean inProgressOk) throws IOException; + } Modified: hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NNStorageRetentionManager.java URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NNStorageRetentionManager.java?rev=1398609&r1=1398608&r2=1398609&view=diff ============================================================================== --- hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NNStorageRetentionManager.java (original) +++ hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NNStorageRetentionManager.java Tue Oct 16 01:59:46 2012 @@ -19,7 +19,9 @@ package org.apache.hadoop.hdfs.server.na import java.io.File; import java.io.IOException; +import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.TreeSet; @@ -32,6 +34,7 @@ import org.apache.hadoop.hdfs.server.nam import org.apache.hadoop.hdfs.util.MD5FileUtils; import com.google.common.base.Preconditions; +import com.google.common.collect.ComparisonChain; import com.google.common.collect.Lists; import com.google.common.collect.Sets; @@ -48,6 +51,7 @@ public class NNStorageRetentionManager { private final int numCheckpointsToRetain; private final long numExtraEditsToRetain; + private final int maxExtraEditsSegmentsToRetain; private static final Log LOG = LogFactory.getLog( NNStorageRetentionManager.class); private final NNStorage storage; @@ -65,6 +69,9 @@ public class NNStorageRetentionManager { this.numExtraEditsToRetain = conf.getLong( DFSConfigKeys.DFS_NAMENODE_NUM_EXTRA_EDITS_RETAINED_KEY, DFSConfigKeys.DFS_NAMENODE_NUM_EXTRA_EDITS_RETAINED_DEFAULT); + this.maxExtraEditsSegmentsToRetain = conf.getInt( + DFSConfigKeys.DFS_NAMENODE_MAX_EXTRA_EDITS_SEGMENTS_RETAINED_KEY, + DFSConfigKeys.DFS_NAMENODE_MAX_EXTRA_EDITS_SEGMENTS_RETAINED_DEFAULT); Preconditions.checkArgument(numCheckpointsToRetain > 0, "Must retain at least one checkpoint"); Preconditions.checkArgument(numExtraEditsToRetain >= 0, @@ -94,7 +101,39 @@ public class NNStorageRetentionManager { // provide a "cushion" of older txns that we keep, which is // handy for HA, where a remote node may not have as many // new images. - long purgeLogsFrom = Math.max(0, minImageTxId + 1 - numExtraEditsToRetain); + // + // First, determine the target number of extra transactions to retain based + // on the configured amount. + long minimumRequiredTxId = minImageTxId + 1; + long purgeLogsFrom = Math.max(0, minimumRequiredTxId - numExtraEditsToRetain); + + ArrayList editLogs = new ArrayList(); + purgeableLogs.selectInputStreams(editLogs, purgeLogsFrom, false); + Collections.sort(editLogs, new Comparator() { + @Override + public int compare(EditLogInputStream a, EditLogInputStream b) { + return ComparisonChain.start() + .compare(a.getFirstTxId(), b.getFirstTxId()) + .compare(a.getLastTxId(), b.getLastTxId()) + .result(); + } + }); + + // Next, adjust the number of transactions to retain if doing so would mean + // keeping too many segments around. + while (editLogs.size() > maxExtraEditsSegmentsToRetain) { + purgeLogsFrom = editLogs.get(0).getFirstTxId(); + editLogs.remove(0); + } + + // Finally, ensure that we're not trying to purge any transactions that we + // actually need. + if (purgeLogsFrom > minimumRequiredTxId) { + throw new AssertionError("Should not purge more edits than required to " + + "restore: " + purgeLogsFrom + " should be <= " + + minimumRequiredTxId); + } + purgeableLogs.purgeLogsOlderThan(purgeLogsFrom); } Modified: hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/SecondaryNameNode.java URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/SecondaryNameNode.java?rev=1398609&r1=1398608&r2=1398609&view=diff ============================================================================== --- hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/SecondaryNameNode.java (original) +++ hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/SecondaryNameNode.java Tue Oct 16 01:59:46 2012 @@ -751,6 +751,24 @@ public class SecondaryNameNode implement } } } + + @Override + public void selectInputStreams(Collection streams, + long fromTxId, boolean inProgressOk) { + Iterator iter = storage.dirIterator(); + while (iter.hasNext()) { + StorageDirectory dir = iter.next(); + List editFiles; + try { + editFiles = FileJournalManager.matchEditLogs( + dir.getCurrentDir()); + } catch (IOException ioe) { + throw new RuntimeException(ioe); + } + FileJournalManager.addStreamsToCollectionFromFiles(editFiles, streams, + fromTxId, inProgressOk); + } + } } Modified: hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/resources/hdfs-default.xml URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/resources/hdfs-default.xml?rev=1398609&r1=1398608&r2=1398609&view=diff ============================================================================== --- hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/resources/hdfs-default.xml (original) +++ hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/resources/hdfs-default.xml Tue Oct 16 01:59:46 2012 @@ -660,6 +660,20 @@ edits in order to start again. Typically each edit is on the order of a few hundred bytes, so the default of 1 million edits should be on the order of hundreds of MBs or low GBs. + + NOTE: Fewer extra edits may be retained than value specified for this setting + if doing so would mean that more segments would be retained than the number + configured by dfs.namenode.max.extra.edits.segments.retained. + + + + + dfs.namenode.max.extra.edits.segments.retained + 10000 + The maximum number of extra edit log segments which should be retained + beyond what is minimally necessary for a NN restart. When used in conjunction with + dfs.namenode.num.extra.edits.retained, this configuration property serves to cap + the number of extra edits files to a reasonable value. Modified: hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNNStorageRetentionManager.java URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNNStorageRetentionManager.java?rev=1398609&r1=1398608&r2=1398609&view=diff ============================================================================== --- hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNNStorageRetentionManager.java (original) +++ hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNNStorageRetentionManager.java Tue Oct 16 01:59:46 2012 @@ -22,6 +22,7 @@ import static org.apache.hadoop.hdfs.ser import static org.apache.hadoop.hdfs.server.namenode.NNStorage.getInProgressEditsFileName; import java.io.IOException; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; @@ -196,6 +197,35 @@ public class TestNNStorageRetentionManag runTest(tc); } + @Test + public void testRetainExtraLogsLimitedSegments() throws IOException { + conf.setLong(DFSConfigKeys.DFS_NAMENODE_NUM_EXTRA_EDITS_RETAINED_KEY, + 150); + conf.setLong(DFSConfigKeys.DFS_NAMENODE_MAX_EXTRA_EDITS_SEGMENTS_RETAINED_KEY, 2); + TestCaseDescription tc = new TestCaseDescription(); + tc.addRoot("/foo1", NameNodeDirType.IMAGE); + tc.addRoot("/foo2", NameNodeDirType.EDITS); + tc.addImage("/foo1/current/" + getImageFileName(100), true); + tc.addImage("/foo1/current/" + getImageFileName(200), true); + tc.addImage("/foo1/current/" + getImageFileName(300), false); + tc.addImage("/foo1/current/" + getImageFileName(400), false); + + tc.addLog("/foo2/current/" + getFinalizedEditsFileName(1, 100), true); + // Without lowering the max segments to retain, we'd retain all segments + // going back to txid 150 (300 - 150). + tc.addLog("/foo2/current/" + getFinalizedEditsFileName(101, 175), true); + tc.addLog("/foo2/current/" + getFinalizedEditsFileName(176, 200), true); + tc.addLog("/foo2/current/" + getFinalizedEditsFileName(201, 225), true); + tc.addLog("/foo2/current/" + getFinalizedEditsFileName(226, 240), true); + // Only retain 2 extra segments. The 301-400 segment is considered required, + // not extra. + tc.addLog("/foo2/current/" + getFinalizedEditsFileName(241, 275), false); + tc.addLog("/foo2/current/" + getFinalizedEditsFileName(276, 300), false); + tc.addLog("/foo2/current/" + getFinalizedEditsFileName(301, 400), false); + tc.addLog("/foo2/current/" + getInProgressEditsFileName(401), false); + runTest(tc); + } + private void runTest(TestCaseDescription tc) throws IOException { StoragePurger mockPurger = Mockito.mock(NNStorageRetentionManager.StoragePurger.class); @@ -287,8 +317,10 @@ public class TestNNStorageRetentionManag return mockStorageForDirs(sds.toArray(new StorageDirectory[0])); } + @SuppressWarnings("unchecked") public FSEditLog mockEditLog(StoragePurger purger) { final List jms = Lists.newArrayList(); + final JournalSet journalSet = new JournalSet(0); for (FakeRoot root : dirRoots.values()) { if (!root.type.isOfType(NameNodeDirType.EDITS)) continue; @@ -297,6 +329,7 @@ public class TestNNStorageRetentionManag root.mockStorageDir(), null); fjm.purger = purger; jms.add(fjm); + journalSet.add(fjm, false); } FSEditLog mockLog = Mockito.mock(FSEditLog.class); @@ -314,6 +347,18 @@ public class TestNNStorageRetentionManag return null; } }).when(mockLog).purgeLogsOlderThan(Mockito.anyLong()); + + Mockito.doAnswer(new Answer() { + + @Override + public Void answer(InvocationOnMock invocation) throws Throwable { + Object[] args = invocation.getArguments(); + journalSet.selectInputStreams((Collection)args[0], + (long)((Long)args[1]), (boolean)((Boolean)args[2])); + return null; + } + }).when(mockLog).selectInputStreams(Mockito.anyCollection(), + Mockito.anyLong(), Mockito.anyBoolean()); return mockLog; } }