Uploaded image for project: 'Hadoop HDFS'
  1. Hadoop HDFS
  2. HDFS-4815

TestRBWBlockInvalidation#testBlockInvalidationWhenRBWReplicaMissedInDN: Double call countReplicas() to fetch corruptReplicas and liveReplicas is not needed

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • None
    • 2.1.0-beta
    • datanode, test
    • Reviewed

    Description

      tesIn TestRBWBlockInvalidation, the original code is:
      while (!isCorruptReported) {
      if (countReplicas(namesystem, blk).corruptReplicas() > 0)

      { isCorruptReported = true; }

      Thread.sleep(100);
      }
      assertEquals("There should be 1 replica in the corruptReplicasMap", 1,
      countReplicas(namesystem, blk).corruptReplicas());

      Once the program detects there exists one corruptReplica, it will break the while loop. After that, it call countReplicas() again in assertEquals(). But sometimes I met the following error:
      java.lang.AssertionError: There should be 1 replica in the corruptReplicasMap expected:<1> but was:<0>

      It's obviously that second function call countReplicas() in assertEquals(), the corruptReplicas value has been changed since program go to sleep and BlockManger recovered the corrupt block during this sleep time.

      So what I do is:
      1) once detecting there exists one corruptReplica, break the loop and don't call sleep(), the same as liveReplicas
      2) don't double check the countReplicas & liveReplicas in assertEquals()
      3) sometimes I meet the problem of testcase timeout, so I speed up the block report interval

      Attachments

        1. HDFS-4815.patch
          2 kB
          Tian Hong Wang

        Activity

          People

            tianhonglouis Tian Hong Wang
            tianhonglouis Tian Hong Wang
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: