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
                                         ());
 }
예제 #2
0
 /// <summary>Add a replica's meta information into the map</summary>
 /// <param name="bpid">block pool id</param>
 /// <param name="replicaInfo">a replica's meta information</param>
 /// <returns>previous meta information of the replica</returns>
 /// <exception cref="System.ArgumentException">if the input parameter is null</exception>
 internal virtual ReplicaInfo Add(string bpid, ReplicaInfo replicaInfo)
 {
     CheckBlockPool(bpid);
     CheckBlock(replicaInfo);
     lock (mutex)
     {
         IDictionary <long, ReplicaInfo> m = map[bpid];
         if (m == null)
         {
             // Add an entry for block pool if it does not exist already
             m         = new Dictionary <long, ReplicaInfo>();
             map[bpid] = m;
         }
         return(m[replicaInfo.GetBlockId()] = replicaInfo);
     }
 }
        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="
                                         );
                }
            }
        }