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(); } }
private long WriteSegmentUntilCrash(MiniJournalCluster cluster, QuorumJournalManager qjm, long txid, int numTxns, Holder <Exception> thrown) { long firstTxId = txid; long lastAcked = txid - 1; try { EditLogOutputStream stm = qjm.StartLogSegment(txid, NameNodeLayoutVersion.CurrentLayoutVersion ); for (int i = 0; i < numTxns; i++) { QJMTestUtil.WriteTxns(stm, txid++, 1); lastAcked++; } stm.Close(); qjm.FinalizeLogSegment(firstTxId, lastAcked); } catch (Exception t) { thrown.held = t; } return(lastAcked); }