internal virtual bool RemoveFromCorruptReplicasMap(Block blk, DatanodeDescriptor datanode, CorruptReplicasMap.Reason reason) { IDictionary <DatanodeDescriptor, CorruptReplicasMap.Reason> datanodes = corruptReplicasMap [blk]; if (datanodes == null) { return(false); } // if reasons can be compared but don't match, return false. CorruptReplicasMap.Reason storedReason = datanodes[datanode]; if (reason != CorruptReplicasMap.Reason.Any && storedReason != null && reason != storedReason) { return(false); } if (Sharpen.Collections.Remove(datanodes, datanode) != null) { // remove the replicas if (datanodes.IsEmpty()) { // remove the block if there is no more corrupted replicas Sharpen.Collections.Remove(corruptReplicasMap, blk); } return(true); } return(false); }
/// <summary> /// return the reason about corrupted replica for a given block /// on a given dn /// </summary> /// <param name="block">block that has corrupted replica</param> /// <param name="node">datanode that contains this corrupted replica</param> /// <returns>reason</returns> internal virtual string GetCorruptReason(Block block, DatanodeDescriptor node) { CorruptReplicasMap.Reason reason = null; if (corruptReplicasMap.Contains(block)) { if (corruptReplicasMap[block].Contains(node)) { reason = corruptReplicasMap[block][node]; } } if (reason != null) { return(reason.ToString()); } else { return(null); } }
// not specified. // wildcard reason // mismatch in generation stamps // mismatch in sizes // invalid state // client or datanode reported the corruption /// <summary>Mark the block belonging to datanode as corrupt.</summary> /// <param name="blk">Block to be added to CorruptReplicasMap</param> /// <param name="dn">DatanodeDescriptor which holds the corrupt replica</param> /// <param name="reason">a textual reason (for logging purposes)</param> /// <param name="reasonCode">the enum representation of the reason</param> internal virtual void AddToCorruptReplicasMap(Block blk, DatanodeDescriptor dn, string reason, CorruptReplicasMap.Reason reasonCode) { IDictionary <DatanodeDescriptor, CorruptReplicasMap.Reason> nodes = corruptReplicasMap [blk]; if (nodes == null) { nodes = new Dictionary <DatanodeDescriptor, CorruptReplicasMap.Reason>(); corruptReplicasMap[blk] = nodes; } string reasonText; if (reason != null) { reasonText = " because " + reason; } else { reasonText = string.Empty; } if (!nodes.Keys.Contains(dn)) { NameNode.blockStateChangeLog.Info("BLOCK NameSystem.addToCorruptReplicasMap: {} added as corrupt on " + "{} by {} {}", blk.GetBlockName(), dn, Org.Apache.Hadoop.Ipc.Server.GetRemoteIp (), reasonText); } else { NameNode.blockStateChangeLog.Info("BLOCK NameSystem.addToCorruptReplicasMap: duplicate requested for" + " {} to add as corrupt on {} by {} {}", blk.GetBlockName(), dn, Org.Apache.Hadoop.Ipc.Server .GetRemoteIp(), reasonText); } // Add the node or update the reason. nodes[dn] = reasonCode; }