Esempio n. 1
0
        /// <exception cref="System.IO.IOException"/>
        public static void WriteOp(EditLogOutputStream stm, long txid)
        {
            FSEditLogOp op = NameNodeAdapter.CreateMkdirOp("tx " + txid);

            op.SetTransactionId(txid);
            stm.Write(op);
        }
Esempio n. 2
0
        public virtual void TestSimpleRecovery()
        {
            NamespaceInfo            nsi  = NewNSInfo();
            BookKeeperJournalManager bkjm = new BookKeeperJournalManager(conf, BKJMUtil.CreateJournalURI
                                                                             ("/hdfsjournal-simplerecovery"), nsi);

            bkjm.Format(nsi);
            EditLogOutputStream @out = bkjm.StartLogSegment(1, NameNodeLayoutVersion.CurrentLayoutVersion
                                                            );

            for (long i = 1; i <= 100; i++)
            {
                FSEditLogOp op = FSEditLogTestUtil.GetNoOpInstance();
                op.SetTransactionId(i);
                @out.Write(op);
            }
            @out.SetReadyToFlush();
            @out.Flush();
            @out.Abort();
            @out.Close();
            NUnit.Framework.Assert.IsNull(zkc.Exists(bkjm.FinalizedLedgerZNode(1, 100), false
                                                     ));
            NUnit.Framework.Assert.IsNotNull(zkc.Exists(bkjm.InprogressZNode(1), false));
            bkjm.RecoverUnfinalizedSegments();
            NUnit.Framework.Assert.IsNotNull(zkc.Exists(bkjm.FinalizedLedgerZNode(1, 100), false
                                                        ));
            NUnit.Framework.Assert.IsNull(zkc.Exists(bkjm.InprogressZNode(1), false));
        }
Esempio n. 3
0
        public virtual void TestEmptyInprogressLedger()
        {
            URI                      uri  = BKJMUtil.CreateJournalURI("/hdfsjournal-emptyInprogressLedger");
            NamespaceInfo            nsi  = NewNSInfo();
            BookKeeperJournalManager bkjm = new BookKeeperJournalManager(conf, uri, nsi);

            bkjm.Format(nsi);
            EditLogOutputStream @out = bkjm.StartLogSegment(1, NameNodeLayoutVersion.CurrentLayoutVersion
                                                            );

            for (long i = 1; i <= 100; i++)
            {
                FSEditLogOp op = FSEditLogTestUtil.GetNoOpInstance();
                op.SetTransactionId(i);
                @out.Write(op);
            }
            @out.Close();
            bkjm.FinalizeLogSegment(1, 100);
            @out = bkjm.StartLogSegment(101, NameNodeLayoutVersion.CurrentLayoutVersion);
            @out.Close();
            bkjm.Close();
            bkjm = new BookKeeperJournalManager(conf, uri, nsi);
            bkjm.RecoverUnfinalizedSegments();
            @out = bkjm.StartLogSegment(101, NameNodeLayoutVersion.CurrentLayoutVersion);
            for (long i_1 = 1; i_1 <= 100; i_1++)
            {
                FSEditLogOp op = FSEditLogTestUtil.GetNoOpInstance();
                op.SetTransactionId(i_1);
                @out.Write(op);
            }
            @out.Close();
            bkjm.FinalizeLogSegment(101, 200);
            bkjm.Close();
        }
Esempio n. 4
0
        public virtual void TestSimpleRead()
        {
            NamespaceInfo            nsi  = NewNSInfo();
            BookKeeperJournalManager bkjm = new BookKeeperJournalManager(conf, BKJMUtil.CreateJournalURI
                                                                             ("/hdfsjournal-simpleread"), nsi);

            bkjm.Format(nsi);
            long numTransactions     = 10000;
            EditLogOutputStream @out = bkjm.StartLogSegment(1, NameNodeLayoutVersion.CurrentLayoutVersion
                                                            );

            for (long i = 1; i <= numTransactions; i++)
            {
                FSEditLogOp op = FSEditLogTestUtil.GetNoOpInstance();
                op.SetTransactionId(i);
                @out.Write(op);
            }
            @out.Close();
            bkjm.FinalizeLogSegment(1, numTransactions);
            IList <EditLogInputStream> @in = new AList <EditLogInputStream>();

            bkjm.SelectInputStreams(@in, 1, true);
            try
            {
                NUnit.Framework.Assert.AreEqual(numTransactions, FSEditLogTestUtil.CountTransactionsInStream
                                                    (@in[0]));
            }
            finally
            {
                @in[0].Close();
            }
        }
        /// <summary>Test speculative read feature supported by bookkeeper.</summary>
        /// <remarks>
        /// Test speculative read feature supported by bookkeeper. Keep one bookie
        /// alive and sleep all the other bookies. Non spec client will hang for long
        /// time to read the entries from the bookkeeper.
        /// </remarks>
        /// <exception cref="System.Exception"/>
        public virtual void TestSpeculativeRead()
        {
            // starting 9 more servers
            for (int i = 1; i < 10; i++)
            {
                bks.AddItem(bkutil.NewBookie());
            }
            NamespaceInfo nsi          = NewNSInfo();
            Configuration conf         = new Configuration();
            int           ensembleSize = numLocalBookies + 9;

            conf.SetInt(BookKeeperJournalManager.BkjmBookkeeperEnsembleSize, ensembleSize);
            conf.SetInt(BookKeeperJournalManager.BkjmBookkeeperQuorumSize, ensembleSize);
            conf.SetInt(BookKeeperJournalManager.BkjmBookkeeperSpeculativeReadTimeoutMs, 100);
            // sets 60 minute
            conf.SetInt(BookKeeperJournalManager.BkjmBookkeeperReadEntryTimeoutSec, 3600);
            BookKeeperJournalManager bkjm = new BookKeeperJournalManager(conf, BKJMUtil.CreateJournalURI
                                                                             ("/hdfsjournal-specread"), nsi);

            bkjm.Format(nsi);
            long numTransactions     = 1000;
            EditLogOutputStream @out = bkjm.StartLogSegment(1, NameNodeLayoutVersion.CurrentLayoutVersion
                                                            );

            for (long i_1 = 1; i_1 <= numTransactions; i_1++)
            {
                FSEditLogOp op = FSEditLogTestUtil.GetNoOpInstance();
                op.SetTransactionId(i_1);
                @out.Write(op);
            }
            @out.Close();
            bkjm.FinalizeLogSegment(1, numTransactions);
            IList <EditLogInputStream> @in = new AList <EditLogInputStream>();

            bkjm.SelectInputStreams(@in, 1, true);
            // sleep 9 bk servers. Now only one server is running and responding to the
            // clients
            CountDownLatch sleepLatch = new CountDownLatch(1);

            foreach (BookieServer bookie in bks)
            {
                SleepBookie(sleepLatch, bookie);
            }
            try
            {
                NUnit.Framework.Assert.AreEqual(numTransactions, FSEditLogTestUtil.CountTransactionsInStream
                                                    (@in[0]));
            }
            finally
            {
                @in[0].Close();
                sleepLatch.CountDown();
                bkjm.Close();
            }
        }
Esempio n. 6
0
        /// <exception cref="System.Exception"/>
        public virtual void TestDefaultAckQuorum()
        {
            newBookie = bkutil.NewBookie();
            int ensembleSize = numBookies + 1;
            int quorumSize   = numBookies + 1;
            // ensure that the journal manager has to use all bookies,
            // so that a failure will fail the journal manager
            Configuration conf = new Configuration();

            conf.SetInt(BookKeeperJournalManager.BkjmBookkeeperEnsembleSize, ensembleSize);
            conf.SetInt(BookKeeperJournalManager.BkjmBookkeeperQuorumSize, quorumSize);
            // sets 2 secs
            conf.SetInt(BookKeeperJournalManager.BkjmBookkeeperAddEntryTimeoutSec, 2);
            NamespaceInfo            nsi  = NewNSInfo();
            BookKeeperJournalManager bkjm = new BookKeeperJournalManager(conf, BKJMUtil.CreateJournalURI
                                                                             ("/hdfsjournal-onebookiefailure"), nsi);

            bkjm.Format(nsi);
            CountDownLatch sleepLatch = new CountDownLatch(1);

            SleepBookie(sleepLatch, newBookie);
            EditLogOutputStream @out = bkjm.StartLogSegment(1, NameNodeLayoutVersion.CurrentLayoutVersion
                                                            );
            int numTransactions = 100;

            for (long i = 1; i <= numTransactions; i++)
            {
                FSEditLogOp op = FSEditLogTestUtil.GetNoOpInstance();
                op.SetTransactionId(i);
                @out.Write(op);
            }
            try
            {
                @out.Close();
                bkjm.FinalizeLogSegment(1, numTransactions);
                IList <EditLogInputStream> @in = new AList <EditLogInputStream>();
                bkjm.SelectInputStreams(@in, 1, true);
                try
                {
                    NUnit.Framework.Assert.AreEqual(numTransactions, FSEditLogTestUtil.CountTransactionsInStream
                                                        (@in[0]));
                }
                finally
                {
                    @in[0].Close();
                }
                NUnit.Framework.Assert.Fail("Should throw exception as not enough non-faulty bookies available!"
                                            );
            }
            catch (IOException)
            {
            }
        }
Esempio n. 7
0
        // expected
        /// <summary>Test ack quorum feature supported by bookkeeper.</summary>
        /// <remarks>
        /// Test ack quorum feature supported by bookkeeper. Keep ack quorum bookie
        /// alive and sleep all the other bookies. Now the client would wait for the
        /// acknowledgement from the ack size bookies and after receiving the success
        /// response will continue writing. Non ack client will hang long time to add
        /// entries.
        /// </remarks>
        /// <exception cref="System.Exception"/>
        public virtual void TestAckQuorum()
        {
            // slow bookie
            newBookie = bkutil.NewBookie();
            // make quorum size and ensemble size same to avoid the interleave writing
            // of the ledger entries
            int ensembleSize = numBookies + 1;
            int quorumSize   = numBookies + 1;
            int ackSize      = numBookies;
            // ensure that the journal manager has to use all bookies,
            // so that a failure will fail the journal manager
            Configuration conf = new Configuration();

            conf.SetInt(BookKeeperJournalManager.BkjmBookkeeperEnsembleSize, ensembleSize);
            conf.SetInt(BookKeeperJournalManager.BkjmBookkeeperQuorumSize, quorumSize);
            conf.SetInt(BookKeeperJournalManager.BkjmBookkeeperAckQuorumSize, ackSize);
            // sets 60 minutes
            conf.SetInt(BookKeeperJournalManager.BkjmBookkeeperAddEntryTimeoutSec, 3600);
            NamespaceInfo            nsi  = NewNSInfo();
            BookKeeperJournalManager bkjm = new BookKeeperJournalManager(conf, BKJMUtil.CreateJournalURI
                                                                             ("/hdfsjournal-onebookiefailure"), nsi);

            bkjm.Format(nsi);
            CountDownLatch sleepLatch = new CountDownLatch(1);

            SleepBookie(sleepLatch, newBookie);
            EditLogOutputStream @out = bkjm.StartLogSegment(1, NameNodeLayoutVersion.CurrentLayoutVersion
                                                            );
            int numTransactions = 100;

            for (long i = 1; i <= numTransactions; i++)
            {
                FSEditLogOp op = FSEditLogTestUtil.GetNoOpInstance();
                op.SetTransactionId(i);
                @out.Write(op);
            }
            @out.Close();
            bkjm.FinalizeLogSegment(1, numTransactions);
            IList <EditLogInputStream> @in = new AList <EditLogInputStream>();

            bkjm.SelectInputStreams(@in, 1, true);
            try
            {
                NUnit.Framework.Assert.AreEqual(numTransactions, FSEditLogTestUtil.CountTransactionsInStream
                                                    (@in[0]));
            }
            finally
            {
                sleepLatch.CountDown();
                @in[0].Close();
                bkjm.Close();
            }
        }
Esempio n. 8
0
        /// <exception cref="System.Exception"/>
        public static byte[] CreateTxnData(int startTxn, int numTxns)
        {
            DataOutputBuffer buf = new DataOutputBuffer();

            FSEditLogOp.Writer writer = new FSEditLogOp.Writer(buf);
            for (long txid = startTxn; txid < startTxn + numTxns; txid++)
            {
                FSEditLogOp op = NameNodeAdapter.CreateMkdirOp("tx " + txid);
                op.SetTransactionId(txid);
                writer.WriteOp(op);
            }
            return(Arrays.CopyOf(buf.GetData(), buf.GetLength()));
        }
Esempio n. 9
0
        public virtual void TestCorruptInprogressNode()
        {
            URI                      uri  = BKJMUtil.CreateJournalURI("/hdfsjournal-corruptInprogress");
            NamespaceInfo            nsi  = NewNSInfo();
            BookKeeperJournalManager bkjm = new BookKeeperJournalManager(conf, uri, nsi);

            bkjm.Format(nsi);
            EditLogOutputStream @out = bkjm.StartLogSegment(1, NameNodeLayoutVersion.CurrentLayoutVersion
                                                            );

            for (long i = 1; i <= 100; i++)
            {
                FSEditLogOp op = FSEditLogTestUtil.GetNoOpInstance();
                op.SetTransactionId(i);
                @out.Write(op);
            }
            @out.Close();
            bkjm.FinalizeLogSegment(1, 100);
            @out = bkjm.StartLogSegment(101, NameNodeLayoutVersion.CurrentLayoutVersion);
            @out.Close();
            bkjm.Close();
            string inprogressZNode = bkjm.InprogressZNode(101);

            zkc.SetData(inprogressZNode, Sharpen.Runtime.GetBytesForString("WholeLottaJunk"),
                        -1);
            bkjm = new BookKeeperJournalManager(conf, uri, nsi);
            try
            {
                bkjm.RecoverUnfinalizedSegments();
                NUnit.Framework.Assert.Fail("Should have failed. There should be no way of creating"
                                            + " an empty inprogess znode");
            }
            catch (IOException e)
            {
                // correct behaviour
                NUnit.Framework.Assert.IsTrue("Exception different than expected", e.Message.Contains
                                                  ("has no field named"));
            }
            finally
            {
                bkjm.Close();
            }
        }
Esempio n. 10
0
        public virtual void TestNumberOfTransactionsWithInprogressAtEnd()
        {
            NamespaceInfo            nsi  = NewNSInfo();
            BookKeeperJournalManager bkjm = new BookKeeperJournalManager(conf, BKJMUtil.CreateJournalURI
                                                                             ("/hdfsjournal-inprogressAtEnd"), nsi);

            bkjm.Format(nsi);
            long txid = 1;

            for (long i = 0; i < 3; i++)
            {
                long start = txid;
                EditLogOutputStream @out = bkjm.StartLogSegment(start, NameNodeLayoutVersion.CurrentLayoutVersion
                                                                );
                for (long j = 1; j <= DefaultSegmentSize; j++)
                {
                    FSEditLogOp op = FSEditLogTestUtil.GetNoOpInstance();
                    op.SetTransactionId(txid++);
                    @out.Write(op);
                }
                @out.Close();
                bkjm.FinalizeLogSegment(start, (txid - 1));
                NUnit.Framework.Assert.IsNotNull(zkc.Exists(bkjm.FinalizedLedgerZNode(start, (txid
                                                                                              - 1)), false));
            }
            long start_1 = txid;
            EditLogOutputStream out_1 = bkjm.StartLogSegment(start_1, NameNodeLayoutVersion.CurrentLayoutVersion
                                                             );

            for (long j_1 = 1; j_1 <= DefaultSegmentSize / 2; j_1++)
            {
                FSEditLogOp op = FSEditLogTestUtil.GetNoOpInstance();
                op.SetTransactionId(txid++);
                out_1.Write(op);
            }
            out_1.SetReadyToFlush();
            out_1.Flush();
            out_1.Abort();
            out_1.Close();
            long numTrans = bkjm.GetNumberOfTransactions(1, true);

            NUnit.Framework.Assert.AreEqual((txid - 1), numTrans);
        }
Esempio n. 11
0
        public virtual void TestNumberOfTransactionsWithGaps()
        {
            NamespaceInfo            nsi  = NewNSInfo();
            BookKeeperJournalManager bkjm = new BookKeeperJournalManager(conf, BKJMUtil.CreateJournalURI
                                                                             ("/hdfsjournal-gaps"), nsi);

            bkjm.Format(nsi);
            long txid = 1;

            for (long i = 0; i < 3; i++)
            {
                long start = txid;
                EditLogOutputStream @out = bkjm.StartLogSegment(start, NameNodeLayoutVersion.CurrentLayoutVersion
                                                                );
                for (long j = 1; j <= DefaultSegmentSize; j++)
                {
                    FSEditLogOp op = FSEditLogTestUtil.GetNoOpInstance();
                    op.SetTransactionId(txid++);
                    @out.Write(op);
                }
                @out.Close();
                bkjm.FinalizeLogSegment(start, txid - 1);
                NUnit.Framework.Assert.IsNotNull(zkc.Exists(bkjm.FinalizedLedgerZNode(start, txid
                                                                                      - 1), false));
            }
            zkc.Delete(bkjm.FinalizedLedgerZNode(DefaultSegmentSize + 1, DefaultSegmentSize *
                                                 2), -1);
            long numTrans = bkjm.GetNumberOfTransactions(1, true);

            NUnit.Framework.Assert.AreEqual(DefaultSegmentSize, numTrans);
            try
            {
                numTrans = bkjm.GetNumberOfTransactions(DefaultSegmentSize + 1, true);
                NUnit.Framework.Assert.Fail("Should have thrown corruption exception by this point"
                                            );
            }
            catch (JournalManager.CorruptionException)
            {
            }
            // if we get here, everything is going good
            numTrans = bkjm.GetNumberOfTransactions((DefaultSegmentSize * 2) + 1, true);
            NUnit.Framework.Assert.AreEqual(DefaultSegmentSize, numTrans);
        }
Esempio n. 12
0
        public virtual void TestRefinalizeAlreadyFinalizedInprogress()
        {
            URI                      uri  = BKJMUtil.CreateJournalURI("/hdfsjournal-refinalizeInprogressLedger");
            NamespaceInfo            nsi  = NewNSInfo();
            BookKeeperJournalManager bkjm = new BookKeeperJournalManager(conf, uri, nsi);

            bkjm.Format(nsi);
            EditLogOutputStream @out = bkjm.StartLogSegment(1, NameNodeLayoutVersion.CurrentLayoutVersion
                                                            );

            for (long i = 1; i <= 100; i++)
            {
                FSEditLogOp op = FSEditLogTestUtil.GetNoOpInstance();
                op.SetTransactionId(i);
                @out.Write(op);
            }
            @out.Close();
            bkjm.Close();
            string inprogressZNode = bkjm.InprogressZNode(1);
            string finalizedZNode  = bkjm.FinalizedLedgerZNode(1, 100);

            NUnit.Framework.Assert.IsNotNull("inprogress znode doesn't exist", zkc.Exists(inprogressZNode
                                                                                          , null));
            NUnit.Framework.Assert.IsNull("finalized znode exists", zkc.Exists(finalizedZNode
                                                                               , null));
            byte[] inprogressData = zkc.GetData(inprogressZNode, false, null);
            // finalize
            bkjm = new BookKeeperJournalManager(conf, uri, nsi);
            bkjm.RecoverUnfinalizedSegments();
            bkjm.Close();
            NUnit.Framework.Assert.IsNull("inprogress znode exists", zkc.Exists(inprogressZNode
                                                                                , null));
            NUnit.Framework.Assert.IsNotNull("finalized znode doesn't exist", zkc.Exists(finalizedZNode
                                                                                         , null));
            zkc.Create(inprogressZNode, inprogressData, ZooDefs.Ids.OpenAclUnsafe, CreateMode
                       .Persistent);
            // should work fine
            bkjm = new BookKeeperJournalManager(conf, uri, nsi);
            bkjm.RecoverUnfinalizedSegments();
            bkjm.Close();
        }
Esempio n. 13
0
        /// <exception cref="System.IO.IOException"/>
        /// <exception cref="Org.Apache.Zookeeper.KeeperException"/>
        /// <exception cref="System.Exception"/>
        private string StartAndFinalizeLogSegment(BookKeeperJournalManager bkjm, int startTxid
                                                  , int endTxid)
        {
            EditLogOutputStream @out = bkjm.StartLogSegment(startTxid, NameNodeLayoutVersion.
                                                            CurrentLayoutVersion);

            for (long i = startTxid; i <= endTxid; i++)
            {
                FSEditLogOp op = FSEditLogTestUtil.GetNoOpInstance();
                op.SetTransactionId(i);
                @out.Write(op);
            }
            @out.Close();
            // finalize the inprogress_1 log segment.
            bkjm.FinalizeLogSegment(startTxid, endTxid);
            string zkpath1 = bkjm.FinalizedLedgerZNode(startTxid, endTxid);

            NUnit.Framework.Assert.IsNotNull(zkc.Exists(zkpath1, false));
            NUnit.Framework.Assert.IsNull(zkc.Exists(bkjm.InprogressZNode(startTxid), false));
            return(zkpath1);
        }
Esempio n. 14
0
        public virtual void TestNumberOfTransactions()
        {
            NamespaceInfo            nsi  = NewNSInfo();
            BookKeeperJournalManager bkjm = new BookKeeperJournalManager(conf, BKJMUtil.CreateJournalURI
                                                                             ("/hdfsjournal-txncount"), nsi);

            bkjm.Format(nsi);
            EditLogOutputStream @out = bkjm.StartLogSegment(1, NameNodeLayoutVersion.CurrentLayoutVersion
                                                            );

            for (long i = 1; i <= 100; i++)
            {
                FSEditLogOp op = FSEditLogTestUtil.GetNoOpInstance();
                op.SetTransactionId(i);
                @out.Write(op);
            }
            @out.Close();
            bkjm.FinalizeLogSegment(1, 100);
            long numTrans = bkjm.GetNumberOfTransactions(1, true);

            NUnit.Framework.Assert.AreEqual(100, numTrans);
        }
Esempio n. 15
0
        public override void EndElement(string uri, string name, string qName)
        {
            string str = XMLUtils.UnmangleXmlString(cbuf.ToString(), false).Trim();

            cbuf = new StringBuilder();
            switch (state)
            {
            case OfflineEditsXmlLoader.ParseState.ExpectEditsTag:
            {
                throw new XMLUtils.InvalidXmlException("expected <EDITS/>");
            }

            case OfflineEditsXmlLoader.ParseState.ExpectVersion:
            {
                if (!name.Equals("EDITS_VERSION"))
                {
                    throw new XMLUtils.InvalidXmlException("expected </EDITS_VERSION>");
                }
                try
                {
                    int version = System.Convert.ToInt32(str);
                    visitor.Start(version);
                }
                catch (IOException e)
                {
                    // Can't throw IOException from a SAX method, sigh.
                    throw new RuntimeException(e);
                }
                state = OfflineEditsXmlLoader.ParseState.ExpectRecord;
                break;
            }

            case OfflineEditsXmlLoader.ParseState.ExpectRecord:
            {
                if (name.Equals("EDITS"))
                {
                    state = OfflineEditsXmlLoader.ParseState.ExpectEnd;
                }
                else
                {
                    if (!name.Equals("RECORD"))
                    {
                        throw new XMLUtils.InvalidXmlException("expected </EDITS> or </RECORD>");
                    }
                }
                break;
            }

            case OfflineEditsXmlLoader.ParseState.ExpectOpcode:
            {
                if (!name.Equals("OPCODE"))
                {
                    throw new XMLUtils.InvalidXmlException("expected </OPCODE>");
                }
                opCode = FSEditLogOpCodes.ValueOf(str);
                state  = OfflineEditsXmlLoader.ParseState.ExpectData;
                break;
            }

            case OfflineEditsXmlLoader.ParseState.ExpectData:
            {
                throw new XMLUtils.InvalidXmlException("expected <DATA/>");
            }

            case OfflineEditsXmlLoader.ParseState.HandleData:
            {
                stanza.SetValue(str);
                if (stanzaStack.Empty())
                {
                    if (!name.Equals("DATA"))
                    {
                        throw new XMLUtils.InvalidXmlException("expected </DATA>");
                    }
                    state = OfflineEditsXmlLoader.ParseState.ExpectRecord;
                    FSEditLogOp op = opCache.Get(opCode);
                    opCode = null;
                    try
                    {
                        op.DecodeXml(stanza);
                        stanza = null;
                    }
                    finally
                    {
                        if (stanza != null)
                        {
                            System.Console.Error.WriteLine("fromXml error decoding opcode " + opCode + "\n" +
                                                           stanza.ToString());
                            stanza = null;
                        }
                    }
                    if (fixTxIds)
                    {
                        if (nextTxId <= 0)
                        {
                            nextTxId = op.GetTransactionId();
                            if (nextTxId <= 0)
                            {
                                nextTxId = 1;
                            }
                        }
                        op.SetTransactionId(nextTxId);
                        nextTxId++;
                    }
                    try
                    {
                        visitor.VisitOp(op);
                    }
                    catch (IOException e)
                    {
                        // Can't throw IOException from a SAX method, sigh.
                        throw new RuntimeException(e);
                    }
                    state = OfflineEditsXmlLoader.ParseState.ExpectRecord;
                }
                else
                {
                    stanza = stanzaStack.Pop();
                }
                break;
            }

            case OfflineEditsXmlLoader.ParseState.ExpectEnd:
            {
                throw new XMLUtils.InvalidXmlException("not expecting anything after </EDITS>");
            }
            }
        }
 /// <summary>Loads edits file, uses visitor to process all elements</summary>
 /// <exception cref="System.IO.IOException"/>
 public override void LoadEdits()
 {
     try
     {
         visitor.Start(inputStream.GetVersion(true));
         while (true)
         {
             try
             {
                 FSEditLogOp op = inputStream.ReadOp();
                 if (op == null)
                 {
                     break;
                 }
                 if (fixTxIds)
                 {
                     if (nextTxId <= 0)
                     {
                         nextTxId = op.GetTransactionId();
                         if (nextTxId <= 0)
                         {
                             nextTxId = 1;
                         }
                     }
                     op.SetTransactionId(nextTxId);
                     nextTxId++;
                 }
                 visitor.VisitOp(op);
             }
             catch (IOException e)
             {
                 if (!recoveryMode)
                 {
                     // Tell the visitor to clean up, then re-throw the exception
                     Log.Error("Got IOException at position " + inputStream.GetPosition());
                     visitor.Close(e);
                     throw;
                 }
                 Log.Error("Got IOException while reading stream!  Resyncing.", e);
                 inputStream.Resync();
             }
             catch (RuntimeException e)
             {
                 if (!recoveryMode)
                 {
                     // Tell the visitor to clean up, then re-throw the exception
                     Log.Error("Got RuntimeException at position " + inputStream.GetPosition());
                     visitor.Close(e);
                     throw;
                 }
                 Log.Error("Got RuntimeException while reading stream!  Resyncing.", e);
                 inputStream.Resync();
             }
         }
         visitor.Close(null);
     }
     finally
     {
         IOUtils.Cleanup(Log, inputStream);
     }
 }
Esempio n. 17
0
        public virtual void TestWriteRestartFrom1()
        {
            NamespaceInfo            nsi  = NewNSInfo();
            BookKeeperJournalManager bkjm = new BookKeeperJournalManager(conf, BKJMUtil.CreateJournalURI
                                                                             ("/hdfsjournal-restartFrom1"), nsi);

            bkjm.Format(nsi);
            long txid  = 1;
            long start = txid;
            EditLogOutputStream @out = bkjm.StartLogSegment(txid, NameNodeLayoutVersion.CurrentLayoutVersion
                                                            );

            for (long j = 1; j <= DefaultSegmentSize; j++)
            {
                FSEditLogOp op = FSEditLogTestUtil.GetNoOpInstance();
                op.SetTransactionId(txid++);
                @out.Write(op);
            }
            @out.Close();
            bkjm.FinalizeLogSegment(start, (txid - 1));
            txid = 1;
            try
            {
                @out = bkjm.StartLogSegment(txid, NameNodeLayoutVersion.CurrentLayoutVersion);
                NUnit.Framework.Assert.Fail("Shouldn't be able to start another journal from " +
                                            txid + " when one already exists");
            }
            catch (Exception ioe)
            {
                Log.Info("Caught exception as expected", ioe);
            }
            // test border case
            txid = DefaultSegmentSize;
            try
            {
                @out = bkjm.StartLogSegment(txid, NameNodeLayoutVersion.CurrentLayoutVersion);
                NUnit.Framework.Assert.Fail("Shouldn't be able to start another journal from " +
                                            txid + " when one already exists");
            }
            catch (IOException ioe)
            {
                Log.Info("Caught exception as expected", ioe);
            }
            // open journal continuing from before
            txid  = DefaultSegmentSize + 1;
            start = txid;
            @out  = bkjm.StartLogSegment(start, NameNodeLayoutVersion.CurrentLayoutVersion);
            NUnit.Framework.Assert.IsNotNull(@out);
            for (long j_1 = 1; j_1 <= DefaultSegmentSize; j_1++)
            {
                FSEditLogOp op = FSEditLogTestUtil.GetNoOpInstance();
                op.SetTransactionId(txid++);
                @out.Write(op);
            }
            @out.Close();
            bkjm.FinalizeLogSegment(start, (txid - 1));
            // open journal arbitarily far in the future
            txid = DefaultSegmentSize * 4;
            @out = bkjm.StartLogSegment(txid, NameNodeLayoutVersion.CurrentLayoutVersion);
            NUnit.Framework.Assert.IsNotNull(@out);
        }
Esempio n. 18
0
        public virtual void TestOneBookieFailure()
        {
            newBookie = bkutil.NewBookie();
            BookieServer replacementBookie = null;

            try
            {
                int ensembleSize = numBookies + 1;
                NUnit.Framework.Assert.AreEqual("New bookie didn't start", ensembleSize, bkutil.CheckBookiesUp
                                                    (ensembleSize, 10));
                // ensure that the journal manager has to use all bookies,
                // so that a failure will fail the journal manager
                Configuration conf = new Configuration();
                conf.SetInt(BookKeeperJournalManager.BkjmBookkeeperEnsembleSize, ensembleSize);
                conf.SetInt(BookKeeperJournalManager.BkjmBookkeeperQuorumSize, ensembleSize);
                long                     txid = 1;
                NamespaceInfo            nsi  = NewNSInfo();
                BookKeeperJournalManager bkjm = new BookKeeperJournalManager(conf, BKJMUtil.CreateJournalURI
                                                                                 ("/hdfsjournal-onebookiefailure"), nsi);
                bkjm.Format(nsi);
                EditLogOutputStream @out = bkjm.StartLogSegment(txid, NameNodeLayoutVersion.CurrentLayoutVersion
                                                                );
                for (long i = 1; i <= 3; i++)
                {
                    FSEditLogOp op = FSEditLogTestUtil.GetNoOpInstance();
                    op.SetTransactionId(txid++);
                    @out.Write(op);
                }
                @out.SetReadyToFlush();
                @out.Flush();
                replacementBookie = bkutil.NewBookie();
                NUnit.Framework.Assert.AreEqual("replacement bookie didn't start", ensembleSize +
                                                1, bkutil.CheckBookiesUp(ensembleSize + 1, 10));
                newBookie.Shutdown();
                NUnit.Framework.Assert.AreEqual("New bookie didn't die", ensembleSize, bkutil.CheckBookiesUp
                                                    (ensembleSize, 10));
                for (long i_1 = 1; i_1 <= 3; i_1++)
                {
                    FSEditLogOp op = FSEditLogTestUtil.GetNoOpInstance();
                    op.SetTransactionId(txid++);
                    @out.Write(op);
                }
                @out.SetReadyToFlush();
                @out.Flush();
            }
            catch (Exception e)
            {
                Log.Error("Exception in test", e);
                throw;
            }
            finally
            {
                if (replacementBookie != null)
                {
                    replacementBookie.Shutdown();
                }
                newBookie.Shutdown();
                if (bkutil.CheckBookiesUp(numBookies, 30) != numBookies)
                {
                    Log.Warn("Not all bookies from this test shut down, expect errors");
                }
            }
        }