Esempio n. 1
0
        public virtual void TestFinalizedRwrReplicas()
        {
            if (Log.IsDebugEnabled())
            {
                Log.Debug("Running " + GenericTestUtils.GetMethodName());
            }
            // rbw and finalized replicas have the same length
            ReplicaRecoveryInfo replica1 = new ReplicaRecoveryInfo(BlockId, ReplicaLen1, GenStamp
                                                                   - 1, HdfsServerConstants.ReplicaState.Finalized);
            ReplicaRecoveryInfo replica2 = new ReplicaRecoveryInfo(BlockId, ReplicaLen1, GenStamp
                                                                   - 2, HdfsServerConstants.ReplicaState.Rwr);
            InterDatanodeProtocol dn1 = Org.Mockito.Mockito.Mock <InterDatanodeProtocol>();
            InterDatanodeProtocol dn2 = Org.Mockito.Mockito.Mock <InterDatanodeProtocol>();

            TestSyncReplicas(replica1, replica2, dn1, dn2, ReplicaLen1);
            Org.Mockito.Mockito.Verify(dn1).UpdateReplicaUnderRecovery(block, RecoveryId, BlockId
                                                                       , ReplicaLen1);
            Org.Mockito.Mockito.Verify(dn2, Org.Mockito.Mockito.Never()).UpdateReplicaUnderRecovery
                (block, RecoveryId, BlockId, ReplicaLen1);
            // rbw replica has a different length from the finalized one
            replica1 = new ReplicaRecoveryInfo(BlockId, ReplicaLen1, GenStamp - 1, HdfsServerConstants.ReplicaState
                                               .Finalized);
            replica2 = new ReplicaRecoveryInfo(BlockId, ReplicaLen2, GenStamp - 2, HdfsServerConstants.ReplicaState
                                               .Rbw);
            dn1 = Org.Mockito.Mockito.Mock <InterDatanodeProtocol>();
            dn2 = Org.Mockito.Mockito.Mock <InterDatanodeProtocol>();
            TestSyncReplicas(replica1, replica2, dn1, dn2, ReplicaLen1);
            Org.Mockito.Mockito.Verify(dn1).UpdateReplicaUnderRecovery(block, RecoveryId, BlockId
                                                                       , ReplicaLen1);
            Org.Mockito.Mockito.Verify(dn2, Org.Mockito.Mockito.Never()).UpdateReplicaUnderRecovery
                (block, RecoveryId, BlockId, ReplicaLen1);
        }
Esempio n. 2
0
        public virtual void TestFinalizedReplicas()
        {
            if (Log.IsDebugEnabled())
            {
                Log.Debug("Running " + GenericTestUtils.GetMethodName());
            }
            ReplicaRecoveryInfo replica1 = new ReplicaRecoveryInfo(BlockId, ReplicaLen1, GenStamp
                                                                   - 1, HdfsServerConstants.ReplicaState.Finalized);
            ReplicaRecoveryInfo replica2 = new ReplicaRecoveryInfo(BlockId, ReplicaLen1, GenStamp
                                                                   - 2, HdfsServerConstants.ReplicaState.Finalized);
            InterDatanodeProtocol dn1 = Org.Mockito.Mockito.Mock <InterDatanodeProtocol>();
            InterDatanodeProtocol dn2 = Org.Mockito.Mockito.Mock <InterDatanodeProtocol>();

            TestSyncReplicas(replica1, replica2, dn1, dn2, ReplicaLen1);
            Org.Mockito.Mockito.Verify(dn1).UpdateReplicaUnderRecovery(block, RecoveryId, BlockId
                                                                       , ReplicaLen1);
            Org.Mockito.Mockito.Verify(dn2).UpdateReplicaUnderRecovery(block, RecoveryId, BlockId
                                                                       , ReplicaLen1);
            // two finalized replicas have different length
            replica1 = new ReplicaRecoveryInfo(BlockId, ReplicaLen1, GenStamp - 1, HdfsServerConstants.ReplicaState
                                               .Finalized);
            replica2 = new ReplicaRecoveryInfo(BlockId, ReplicaLen2, GenStamp - 2, HdfsServerConstants.ReplicaState
                                               .Finalized);
            try
            {
                TestSyncReplicas(replica1, replica2, dn1, dn2, ReplicaLen1);
                NUnit.Framework.Assert.Fail("Two finalized replicas should not have different lengthes!"
                                            );
            }
            catch (IOException e)
            {
                NUnit.Framework.Assert.IsTrue(e.Message.StartsWith("Inconsistent size of finalized replicas. "
                                                                   ));
            }
        }
 private static void AssertEquals(ReplicaInfo originalInfo, ReplicaRecoveryInfo recoveryInfo
                                  )
 {
     NUnit.Framework.Assert.AreEqual(originalInfo.GetBlockId(), recoveryInfo.GetBlockId
                                         ());
     NUnit.Framework.Assert.AreEqual(originalInfo.GetGenerationStamp(), recoveryInfo.GetGenerationStamp
                                         ());
     NUnit.Framework.Assert.AreEqual(originalInfo.GetBytesOnDisk(), recoveryInfo.GetNumBytes
                                         ());
     NUnit.Framework.Assert.AreEqual(originalInfo.GetState(), recoveryInfo.GetOriginalReplicaState
                                         ());
 }
Esempio n. 4
0
        public virtual void TestRBW_RWRReplicas()
        {
            if (Log.IsDebugEnabled())
            {
                Log.Debug("Running " + GenericTestUtils.GetMethodName());
            }
            ReplicaRecoveryInfo replica1 = new ReplicaRecoveryInfo(BlockId, ReplicaLen1, GenStamp
                                                                   - 1, HdfsServerConstants.ReplicaState.Rbw);
            ReplicaRecoveryInfo replica2 = new ReplicaRecoveryInfo(BlockId, ReplicaLen1, GenStamp
                                                                   - 2, HdfsServerConstants.ReplicaState.Rwr);
            InterDatanodeProtocol dn1 = Org.Mockito.Mockito.Mock <InterDatanodeProtocol>();
            InterDatanodeProtocol dn2 = Org.Mockito.Mockito.Mock <InterDatanodeProtocol>();

            TestSyncReplicas(replica1, replica2, dn1, dn2, ReplicaLen1);
            Org.Mockito.Mockito.Verify(dn1).UpdateReplicaUnderRecovery(block, RecoveryId, BlockId
                                                                       , ReplicaLen1);
            Org.Mockito.Mockito.Verify(dn2, Org.Mockito.Mockito.Never()).UpdateReplicaUnderRecovery
                (block, RecoveryId, BlockId, ReplicaLen1);
        }
Esempio n. 5
0
        /// <summary>Sync two replicas</summary>
        /// <exception cref="System.IO.IOException"/>
        private void TestSyncReplicas(ReplicaRecoveryInfo replica1, ReplicaRecoveryInfo replica2
                                      , InterDatanodeProtocol dn1, InterDatanodeProtocol dn2, long expectLen)
        {
            DatanodeInfo[] locs = new DatanodeInfo[] { Org.Mockito.Mockito.Mock <DatanodeInfo>
                                                           (), Org.Mockito.Mockito.Mock <DatanodeInfo>() };
            BlockRecoveryCommand.RecoveringBlock rBlock = new BlockRecoveryCommand.RecoveringBlock
                                                              (block, locs, RecoveryId);
            AList <DataNode.BlockRecord> syncList = new AList <DataNode.BlockRecord>(2);

            DataNode.BlockRecord record1 = new DataNode.BlockRecord(DFSTestUtil.GetDatanodeInfo
                                                                        ("1.2.3.4", "bogus", 1234), dn1, replica1);
            DataNode.BlockRecord record2 = new DataNode.BlockRecord(DFSTestUtil.GetDatanodeInfo
                                                                        ("1.2.3.4", "bogus", 1234), dn2, replica2);
            syncList.AddItem(record1);
            syncList.AddItem(record2);
            Org.Mockito.Mockito.When(dn1.UpdateReplicaUnderRecovery((ExtendedBlock)Matchers.AnyObject
                                                                        (), Matchers.AnyLong(), Matchers.AnyLong(), Matchers.AnyLong())).ThenReturn("storage1"
                                                                                                                                                    );
            Org.Mockito.Mockito.When(dn2.UpdateReplicaUnderRecovery((ExtendedBlock)Matchers.AnyObject
                                                                        (), Matchers.AnyLong(), Matchers.AnyLong(), Matchers.AnyLong())).ThenReturn("storage2"
                                                                                                                                                    );
            dn.SyncBlock(rBlock, syncList);
        }
        public virtual void TestUpdateReplicaUnderRecovery()
        {
            MiniDFSCluster cluster = null;

            try
            {
                cluster = new MiniDFSCluster.Builder(conf).NumDataNodes(3).Build();
                cluster.WaitActive();
                string bpid = cluster.GetNamesystem().GetBlockPoolId();
                //create a file
                DistributedFileSystem dfs = cluster.GetFileSystem();
                string filestr            = "/foo";
                Path   filepath           = new Path(filestr);
                DFSTestUtil.CreateFile(dfs, filepath, 1024L, (short)3, 0L);
                //get block info
                LocatedBlock locatedblock = GetLastLocatedBlock(DFSClientAdapter.GetDFSClient(dfs
                                                                                              ).GetNamenode(), filestr);
                DatanodeInfo[] datanodeinfo = locatedblock.GetLocations();
                NUnit.Framework.Assert.IsTrue(datanodeinfo.Length > 0);
                //get DataNode and FSDataset objects
                DataNode datanode = cluster.GetDataNode(datanodeinfo[0].GetIpcPort());
                NUnit.Framework.Assert.IsTrue(datanode != null);
                //initReplicaRecovery
                ExtendedBlock         b          = locatedblock.GetBlock();
                long                  recoveryid = b.GetGenerationStamp() + 1;
                long                  newlength  = b.GetNumBytes() - 1;
                FsDatasetSpi <object> fsdataset  = DataNodeTestUtils.GetFSDataset(datanode);
                ReplicaRecoveryInfo   rri        = fsdataset.InitReplicaRecovery(new BlockRecoveryCommand.RecoveringBlock
                                                                                     (b, null, recoveryid));
                //check replica
                ReplicaInfo replica = FsDatasetTestUtil.FetchReplicaInfo(fsdataset, bpid, b.GetBlockId
                                                                             ());
                NUnit.Framework.Assert.AreEqual(HdfsServerConstants.ReplicaState.Rur, replica.GetState
                                                    ());
                //check meta data before update
                FsDatasetImpl.CheckReplicaFiles(replica);
                {
                    //case "THIS IS NOT SUPPOSED TO HAPPEN"
                    //with (block length) != (stored replica's on disk length).
                    //create a block with same id and gs but different length.
                    ExtendedBlock tmp = new ExtendedBlock(b.GetBlockPoolId(), rri.GetBlockId(), rri.GetNumBytes
                                                              () - 1, rri.GetGenerationStamp());
                    try
                    {
                        //update should fail
                        fsdataset.UpdateReplicaUnderRecovery(tmp, recoveryid, tmp.GetBlockId(), newlength
                                                             );
                        NUnit.Framework.Assert.Fail();
                    }
                    catch (IOException ioe)
                    {
                        System.Console.Out.WriteLine("GOOD: getting " + ioe);
                    }
                }
                //update
                string storageID = fsdataset.UpdateReplicaUnderRecovery(new ExtendedBlock(b.GetBlockPoolId
                                                                                              (), rri), recoveryid, rri.GetBlockId(), newlength);
                NUnit.Framework.Assert.IsTrue(storageID != null);
            }
            finally
            {
                if (cluster != null)
                {
                    cluster.Shutdown();
                }
            }
        }
        public virtual void TestInitReplicaRecovery()
        {
            long       firstblockid = 10000L;
            long       gs           = 7777L;
            long       length       = 22L;
            ReplicaMap map          = new ReplicaMap(this);
            string     bpid         = "BP-TEST";

            Block[] blocks = new Block[5];
            for (int i = 0; i < blocks.Length; i++)
            {
                blocks[i] = new Block(firstblockid + i, length, gs);
                map.Add(bpid, CreateReplicaInfo(blocks[i]));
            }
            {
                //normal case
                Block               b            = blocks[0];
                ReplicaInfo         originalInfo = map.Get(bpid, b);
                long                recoveryid   = gs + 1;
                ReplicaRecoveryInfo recoveryInfo = FsDatasetImpl.InitReplicaRecovery(bpid, map, blocks
                                                                                     [0], recoveryid, DFSConfigKeys.DfsDatanodeXceiverStopTimeoutMillisDefault);
                AssertEquals(originalInfo, recoveryInfo);
                ReplicaUnderRecovery updatedInfo = (ReplicaUnderRecovery)map.Get(bpid, b);
                NUnit.Framework.Assert.AreEqual(originalInfo.GetBlockId(), updatedInfo.GetBlockId
                                                    ());
                NUnit.Framework.Assert.AreEqual(recoveryid, updatedInfo.GetRecoveryID());
                //recover one more time
                long recoveryid2 = gs + 2;
                ReplicaRecoveryInfo recoveryInfo2 = FsDatasetImpl.InitReplicaRecovery(bpid, map,
                                                                                      blocks[0], recoveryid2, DFSConfigKeys.DfsDatanodeXceiverStopTimeoutMillisDefault
                                                                                      );
                AssertEquals(originalInfo, recoveryInfo2);
                ReplicaUnderRecovery updatedInfo2 = (ReplicaUnderRecovery)map.Get(bpid, b);
                NUnit.Framework.Assert.AreEqual(originalInfo.GetBlockId(), updatedInfo2.GetBlockId
                                                    ());
                NUnit.Framework.Assert.AreEqual(recoveryid2, updatedInfo2.GetRecoveryID());
                //case RecoveryInProgressException
                try
                {
                    FsDatasetImpl.InitReplicaRecovery(bpid, map, b, recoveryid, DFSConfigKeys.DfsDatanodeXceiverStopTimeoutMillisDefault
                                                      );
                    NUnit.Framework.Assert.Fail();
                }
                catch (RecoveryInProgressException ripe)
                {
                    System.Console.Out.WriteLine("GOOD: getting " + ripe);
                }
            }
            {
                // BlockRecoveryFI_01: replica not found
                long  recoveryid      = gs + 1;
                Block b               = new Block(firstblockid - 1, length, gs);
                ReplicaRecoveryInfo r = FsDatasetImpl.InitReplicaRecovery(bpid, map, b, recoveryid
                                                                          , DFSConfigKeys.DfsDatanodeXceiverStopTimeoutMillisDefault);
                NUnit.Framework.Assert.IsNull("Data-node should not have this replica.", r);
            }
            {
                // BlockRecoveryFI_02: "THIS IS NOT SUPPOSED TO HAPPEN" with recovery id < gs
                long  recoveryid = gs - 1;
                Block b          = new Block(firstblockid + 1, length, gs);
                try
                {
                    FsDatasetImpl.InitReplicaRecovery(bpid, map, b, recoveryid, DFSConfigKeys.DfsDatanodeXceiverStopTimeoutMillisDefault
                                                      );
                    NUnit.Framework.Assert.Fail();
                }
                catch (IOException ioe)
                {
                    System.Console.Out.WriteLine("GOOD: getting " + ioe);
                }
            }
            {
                // BlockRecoveryFI_03: Replica's gs is less than the block's gs
                long  recoveryid = gs + 1;
                Block b          = new Block(firstblockid, length, gs + 1);
                try
                {
                    FsDatasetImpl.InitReplicaRecovery(bpid, map, b, recoveryid, DFSConfigKeys.DfsDatanodeXceiverStopTimeoutMillisDefault
                                                      );
                    NUnit.Framework.Assert.Fail("InitReplicaRecovery should fail because replica's "
                                                + "gs is less than the block's gs");
                }
                catch (IOException e)
                {
                    e.Message.StartsWith("replica.getGenerationStamp() < block.getGenerationStamp(), block="
                                         );
                }
            }
        }