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 ()); }
/// <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=" ); } } }