/// <exception cref="System.IO.IOException"/>
        private void TestRbwReplicas(MiniDFSCluster cluster, bool isCorrupt)
        {
            FSDataOutputStream @out = null;
            FileSystem         fs   = cluster.GetFileSystem();
            Path src = new Path("/test.txt");

            try
            {
                int fileLen = 515;
                // create some rbw replicas on disk
                byte[] writeBuf = new byte[fileLen];
                new Random().NextBytes(writeBuf);
                @out = fs.Create(src);
                @out.Write(writeBuf);
                @out.Hflush();
                DataNode dn = cluster.GetDataNodes()[0];
                foreach (FsVolumeSpi v in Dataset(dn).GetVolumes())
                {
                    FsVolumeImpl volume     = (FsVolumeImpl)v;
                    FilePath     currentDir = volume.GetCurrentDir().GetParentFile().GetParentFile();
                    FilePath     rbwDir     = new FilePath(currentDir, "rbw");
                    foreach (FilePath file in rbwDir.ListFiles())
                    {
                        if (isCorrupt && Block.IsBlockFilename(file))
                        {
                            new RandomAccessFile(file, "rw").SetLength(fileLen - 1);
                        }
                    }
                }
                // corrupt
                cluster.RestartDataNodes();
                cluster.WaitActive();
                dn = cluster.GetDataNodes()[0];
                // check volumeMap: one rwr replica
                string     bpid     = cluster.GetNamesystem().GetBlockPoolId();
                ReplicaMap replicas = Dataset(dn).volumeMap;
                NUnit.Framework.Assert.AreEqual(1, replicas.Size(bpid));
                ReplicaInfo replica = replicas.Replicas(bpid).GetEnumerator().Next();
                NUnit.Framework.Assert.AreEqual(HdfsServerConstants.ReplicaState.Rwr, replica.GetState
                                                    ());
                if (isCorrupt)
                {
                    NUnit.Framework.Assert.AreEqual((fileLen - 1) / 512 * 512, replica.GetNumBytes());
                }
                else
                {
                    NUnit.Framework.Assert.AreEqual(fileLen, replica.GetNumBytes());
                }
                Dataset(dn).Invalidate(bpid, new Block[] { replica });
            }
            finally
            {
                IOUtils.CloseStream(@out);
                if (fs.Exists(src))
                {
                    fs.Delete(src, false);
                }
                fs.Close();
            }
        }
        internal static ReplicaInfo SelectReplicaToDelete(ReplicaInfo replica1, ReplicaInfo
                                                          replica2)
        {
            ReplicaInfo replicaToKeep;
            ReplicaInfo replicaToDelete;

            // it's the same block so don't ever delete it, even if GS or size
            // differs.  caller should keep the one it just discovered on disk
            if (replica1.GetBlockFile().Equals(replica2.GetBlockFile()))
            {
                return(null);
            }
            if (replica1.GetGenerationStamp() != replica2.GetGenerationStamp())
            {
                replicaToKeep = replica1.GetGenerationStamp() > replica2.GetGenerationStamp() ? replica1
                                         : replica2;
            }
            else
            {
                if (replica1.GetNumBytes() != replica2.GetNumBytes())
                {
                    replicaToKeep = replica1.GetNumBytes() > replica2.GetNumBytes() ? replica1 : replica2;
                }
                else
                {
                    if (replica1.GetVolume().IsTransientStorage() && !replica2.GetVolume().IsTransientStorage
                            ())
                    {
                        replicaToKeep = replica2;
                    }
                    else
                    {
                        replicaToKeep = replica1;
                    }
                }
            }
            replicaToDelete = (replicaToKeep == replica1) ? replica2 : replica1;
            if (Log.IsDebugEnabled())
            {
                Log.Debug("resolveDuplicateReplicas decide to keep " + replicaToKeep + ".  Will try to delete "
                          + replicaToDelete);
            }
            return(replicaToDelete);
        }