public virtual void TestOneJNMissingSegments()
        {
            QJMTestUtil.WriteSegment(cluster, qjm, 1, 3, true);
            WaitForAllPendingCalls(qjm.GetLoggerSetForTests());
            cluster.GetJournalNode(0).StopAndJoin(0);
            QJMTestUtil.WriteSegment(cluster, qjm, 4, 3, true);
            WaitForAllPendingCalls(qjm.GetLoggerSetForTests());
            cluster.RestartJournalNode(0);
            QJMTestUtil.WriteSegment(cluster, qjm, 7, 3, true);
            WaitForAllPendingCalls(qjm.GetLoggerSetForTests());
            cluster.GetJournalNode(1).StopAndJoin(0);
            QuorumJournalManager       readerQjm = CreateSpyingQJM();
            IList <EditLogInputStream> streams   = Lists.NewArrayList();

            try
            {
                readerQjm.SelectInputStreams(streams, 1, false);
                QJMTestUtil.VerifyEdits(streams, 1, 9);
            }
            finally
            {
                IOUtils.Cleanup(Log, Sharpen.Collections.ToArray(streams, new IDisposable[0]));
                readerQjm.Close();
            }
        }
        public virtual void TestReaderWhileAnotherWrites()
        {
            QuorumJournalManager       readerQjm = CloseLater(CreateSpyingQJM());
            IList <EditLogInputStream> streams   = Lists.NewArrayList();

            readerQjm.SelectInputStreams(streams, 0, false);
            NUnit.Framework.Assert.AreEqual(0, streams.Count);
            QJMTestUtil.WriteSegment(cluster, qjm, 1, 3, true);
            readerQjm.SelectInputStreams(streams, 0, false);
            try
            {
                NUnit.Framework.Assert.AreEqual(1, streams.Count);
                // Validate the actual stream contents.
                EditLogInputStream stream = streams[0];
                NUnit.Framework.Assert.AreEqual(1, stream.GetFirstTxId());
                NUnit.Framework.Assert.AreEqual(3, stream.GetLastTxId());
                QJMTestUtil.VerifyEdits(streams, 1, 3);
                NUnit.Framework.Assert.IsNull(stream.ReadOp());
            }
            finally
            {
                IOUtils.Cleanup(Log, Sharpen.Collections.ToArray(streams, new IDisposable[0]));
                streams.Clear();
            }
            // Ensure correct results when there is a stream in-progress, but we don't
            // ask for in-progress.
            QJMTestUtil.WriteSegment(cluster, qjm, 4, 3, false);
            readerQjm.SelectInputStreams(streams, 0, false);
            try
            {
                NUnit.Framework.Assert.AreEqual(1, streams.Count);
                EditLogInputStream stream = streams[0];
                NUnit.Framework.Assert.AreEqual(1, stream.GetFirstTxId());
                NUnit.Framework.Assert.AreEqual(3, stream.GetLastTxId());
                QJMTestUtil.VerifyEdits(streams, 1, 3);
            }
            finally
            {
                IOUtils.Cleanup(Log, Sharpen.Collections.ToArray(streams, new IDisposable[0]));
                streams.Clear();
            }
            // TODO: check results for selectInputStreams with inProgressOK = true.
            // This doesn't currently work, due to a bug where RedundantEditInputStream
            // throws an exception if there are any unvalidated in-progress edits in the list!
            // But, it shouldn't be necessary for current use cases.
            qjm.FinalizeLogSegment(4, 6);
            readerQjm.SelectInputStreams(streams, 0, false);
            try
            {
                NUnit.Framework.Assert.AreEqual(2, streams.Count);
                NUnit.Framework.Assert.AreEqual(4, streams[1].GetFirstTxId());
                NUnit.Framework.Assert.AreEqual(6, streams[1].GetLastTxId());
                QJMTestUtil.VerifyEdits(streams, 1, 6);
            }
            finally
            {
                IOUtils.Cleanup(Log, Sharpen.Collections.ToArray(streams, new IDisposable[0]));
                streams.Clear();
            }
        }
        public virtual void TestSelectInputStreamsNotOnBoundary()
        {
            int txIdsPerSegment = 10;

            for (int txid = 1; txid <= 5 * txIdsPerSegment; txid += txIdsPerSegment)
            {
                QJMTestUtil.WriteSegment(cluster, qjm, txid, txIdsPerSegment, true);
            }
            FilePath curDir = cluster.GetCurrentDir(0, QJMTestUtil.Jid);

            GenericTestUtils.AssertGlobEquals(curDir, "edits_.*", NNStorage.GetFinalizedEditsFileName
                                                  (1, 10), NNStorage.GetFinalizedEditsFileName(11, 20), NNStorage.GetFinalizedEditsFileName
                                                  (21, 30), NNStorage.GetFinalizedEditsFileName(31, 40), NNStorage.GetFinalizedEditsFileName
                                                  (41, 50));
            AList <EditLogInputStream> streams = new AList <EditLogInputStream>();

            qjm.SelectInputStreams(streams, 25, false);
            QJMTestUtil.VerifyEdits(streams, 25, 50);
        }