Ejemplo n.º 1
0
        public virtual void TestTrySendErrorReportWhenNNThrowsIOException()
        {
            BPOfferService bpos = SetupBPOSForNNs(mockNN1, mockNN2);

            bpos.Start();
            try
            {
                WaitForInitialization(bpos);
                // Should start with neither NN as active.
                NUnit.Framework.Assert.IsNull(bpos.GetActiveNN());
                // Have NN1 claim active at txid 1
                mockHaStatuses[0] = new NNHAStatusHeartbeat(HAServiceProtocol.HAServiceState.Active
                                                            , 1);
                bpos.TriggerHeartbeatForTests();
                // Now mockNN1 is acting like active namenode and mockNN2 as Standby
                NUnit.Framework.Assert.AreSame(mockNN1, bpos.GetActiveNN());
                Org.Mockito.Mockito.DoAnswer(new _Answer_602(this)).When(mockNN1).ErrorReport(Org.Mockito.Mockito
                                                                                              .Any <DatanodeRegistration>(), Org.Mockito.Mockito.AnyInt(), Org.Mockito.Mockito.
                                                                                              AnyString());
                // Throw an IOException when this function is first called which will
                // in turn add that errorReport back to the bpThreadQueue and let it
                // process the next time.
                string errorString = "Can't send invalid block " + FakeBlock;
                bpos.TrySendErrorReport(DatanodeProtocol.InvalidBlock, errorString);
                Sharpen.Thread.Sleep(10000);
                NUnit.Framework.Assert.IsTrue("Active namenode didn't add the report back to the queue "
                                              + "when errorReport threw IOException", secondCallTime != 0);
            }
            finally
            {
                bpos.Stop();
            }
        }
Ejemplo n.º 2
0
        public virtual void TestReportBadBlocksWhenNNThrowsStandbyException()
        {
            BPOfferService bpos = SetupBPOSForNNs(mockNN1, mockNN2);

            bpos.Start();
            try
            {
                WaitForInitialization(bpos);
                // Should start with neither NN as active.
                NUnit.Framework.Assert.IsNull(bpos.GetActiveNN());
                // Have NN1 claim active at txid 1
                mockHaStatuses[0] = new NNHAStatusHeartbeat(HAServiceProtocol.HAServiceState.Active
                                                            , 1);
                bpos.TriggerHeartbeatForTests();
                // Now mockNN1 is acting like active namenode and mockNN2 as Standby
                NUnit.Framework.Assert.AreSame(mockNN1, bpos.GetActiveNN());
                // Return nothing when active Active Namenode calls reportBadBlocks
                Org.Mockito.Mockito.DoNothing().When(mockNN1).ReportBadBlocks(Org.Mockito.Mockito
                                                                              .Any <LocatedBlock[]>());
                RemoteException re = new RemoteException(typeof(StandbyException).FullName, "Operation category WRITE is not supported in state "
                                                         + "standby", RpcHeaderProtos.RpcResponseHeaderProto.RpcErrorCodeProto.ErrorApplication
                                                         );
                // Return StandbyException wrapped in RemoteException when Standby NN
                // calls reportBadBlocks
                Org.Mockito.Mockito.DoThrow(re).When(mockNN2).ReportBadBlocks(Org.Mockito.Mockito
                                                                              .Any <LocatedBlock[]>());
                bpos.ReportBadBlocks(FakeBlock, mockFSDataset.GetVolume(FakeBlock).GetStorageID()
                                     , mockFSDataset.GetVolume(FakeBlock).GetStorageType());
                // Send heartbeat so that the BpServiceActor can report bad block to
                // namenode
                bpos.TriggerHeartbeatForTests();
                Org.Mockito.Mockito.Verify(mockNN2, Org.Mockito.Mockito.Times(1)).ReportBadBlocks
                    (Org.Mockito.Mockito.Any <LocatedBlock[]>());
                // Trigger another heartbeat, this will send reportBadBlock again if it
                // is present in the queue.
                bpos.TriggerHeartbeatForTests();
                Org.Mockito.Mockito.Verify(mockNN2, Org.Mockito.Mockito.Times(1)).ReportBadBlocks
                    (Org.Mockito.Mockito.Any <LocatedBlock[]>());
            }
            finally
            {
                bpos.Stop();
            }
        }
Ejemplo n.º 3
0
        public virtual void TestReportBadBlockWhenStandbyNNTimesOut()
        {
            BPOfferService bpos = SetupBPOSForNNs(mockNN1, mockNN2);

            bpos.Start();
            try
            {
                WaitForInitialization(bpos);
                // Should start with neither NN as active.
                NUnit.Framework.Assert.IsNull(bpos.GetActiveNN());
                // Have NN1 claim active at txid 1
                mockHaStatuses[0] = new NNHAStatusHeartbeat(HAServiceProtocol.HAServiceState.Active
                                                            , 1);
                bpos.TriggerHeartbeatForTests();
                // Now mockNN1 is acting like active namenode and mockNN2 as Standby
                NUnit.Framework.Assert.AreSame(mockNN1, bpos.GetActiveNN());
                Org.Mockito.Mockito.DoAnswer(new TestBPOfferService.BPOfferServiceSynchronousCallAnswer
                                                 (this, 0)).When(mockNN1).ReportBadBlocks(Org.Mockito.Mockito.Any <LocatedBlock[]>
                                                                                              ());
                Org.Mockito.Mockito.DoAnswer(new TestBPOfferService.BPOfferServiceSynchronousCallAnswer
                                                 (this, 1)).When(mockNN2).ReportBadBlocks(Org.Mockito.Mockito.Any <LocatedBlock[]>
                                                                                              ());
                bpos.ReportBadBlocks(FakeBlock, mockFSDataset.GetVolume(FakeBlock).GetStorageID()
                                     , mockFSDataset.GetVolume(FakeBlock).GetStorageType());
                bpos.ReportBadBlocks(FakeBlock, mockFSDataset.GetVolume(FakeBlock).GetStorageID()
                                     , mockFSDataset.GetVolume(FakeBlock).GetStorageType());
                Sharpen.Thread.Sleep(10000);
                long difference = secondCallTime - firstCallTime;
                NUnit.Framework.Assert.IsTrue("Active namenode reportBadBlock processing should be "
                                              + "independent of standby namenode reportBadBlock processing ", difference < 5000
                                              );
            }
            finally
            {
                bpos.Stop();
            }
        }
Ejemplo n.º 4
0
        public virtual void TestTrySendErrorReportWhenStandbyNNTimesOut()
        {
            BPOfferService bpos = SetupBPOSForNNs(mockNN1, mockNN2);

            bpos.Start();
            try
            {
                WaitForInitialization(bpos);
                // Should start with neither NN as active.
                NUnit.Framework.Assert.IsNull(bpos.GetActiveNN());
                // Have NN1 claim active at txid 1
                mockHaStatuses[0] = new NNHAStatusHeartbeat(HAServiceProtocol.HAServiceState.Active
                                                            , 1);
                bpos.TriggerHeartbeatForTests();
                // Now mockNN1 is acting like active namenode and mockNN2 as Standby
                NUnit.Framework.Assert.AreSame(mockNN1, bpos.GetActiveNN());
                Org.Mockito.Mockito.DoAnswer(new TestBPOfferService.BPOfferServiceSynchronousCallAnswer
                                                 (this, 0)).When(mockNN1).ErrorReport(Org.Mockito.Mockito.Any <DatanodeRegistration
                                                                                                               >(), Org.Mockito.Mockito.AnyInt(), Org.Mockito.Mockito.AnyString());
                Org.Mockito.Mockito.DoAnswer(new TestBPOfferService.BPOfferServiceSynchronousCallAnswer
                                                 (this, 1)).When(mockNN2).ErrorReport(Org.Mockito.Mockito.Any <DatanodeRegistration
                                                                                                               >(), Org.Mockito.Mockito.AnyInt(), Org.Mockito.Mockito.AnyString());
                string errorString = "Can't send invalid block " + FakeBlock;
                bpos.TrySendErrorReport(DatanodeProtocol.InvalidBlock, errorString);
                bpos.TrySendErrorReport(DatanodeProtocol.InvalidBlock, errorString);
                Sharpen.Thread.Sleep(10000);
                long difference = secondCallTime - firstCallTime;
                NUnit.Framework.Assert.IsTrue("Active namenode trySendErrorReport processing " +
                                              "should be independent of standby namenode trySendErrorReport" + " processing ",
                                              difference < 5000);
            }
            finally
            {
                bpos.Stop();
            }
        }
Ejemplo n.º 5
0
        public virtual void TestPickActiveNameNode()
        {
            BPOfferService bpos = SetupBPOSForNNs(mockNN1, mockNN2);

            bpos.Start();
            try
            {
                WaitForInitialization(bpos);
                // Should start with neither NN as active.
                NUnit.Framework.Assert.IsNull(bpos.GetActiveNN());
                // Have NN1 claim active at txid 1
                mockHaStatuses[0] = new NNHAStatusHeartbeat(HAServiceProtocol.HAServiceState.Active
                                                            , 1);
                bpos.TriggerHeartbeatForTests();
                NUnit.Framework.Assert.AreSame(mockNN1, bpos.GetActiveNN());
                // NN2 claims active at a higher txid
                mockHaStatuses[1] = new NNHAStatusHeartbeat(HAServiceProtocol.HAServiceState.Active
                                                            , 2);
                bpos.TriggerHeartbeatForTests();
                NUnit.Framework.Assert.AreSame(mockNN2, bpos.GetActiveNN());
                // Even after another heartbeat from the first NN, it should
                // think NN2 is active, since it claimed a higher txid
                bpos.TriggerHeartbeatForTests();
                NUnit.Framework.Assert.AreSame(mockNN2, bpos.GetActiveNN());
                // Even if NN2 goes to standby, DN shouldn't reset to talking to NN1,
                // because NN1's txid is lower than the last active txid. Instead,
                // it should consider neither active.
                mockHaStatuses[1] = new NNHAStatusHeartbeat(HAServiceProtocol.HAServiceState.Standby
                                                            , 2);
                bpos.TriggerHeartbeatForTests();
                NUnit.Framework.Assert.IsNull(bpos.GetActiveNN());
                // Now if NN1 goes back to a higher txid, it should be considered active
                mockHaStatuses[0] = new NNHAStatusHeartbeat(HAServiceProtocol.HAServiceState.Active
                                                            , 3);
                bpos.TriggerHeartbeatForTests();
                NUnit.Framework.Assert.AreSame(mockNN1, bpos.GetActiveNN());
            }
            finally
            {
                bpos.Stop();
            }
        }