diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index ccec529c389..5a75f38312d 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -89,6 +89,8 @@ Release 2.8.0 - UNRELEASED HDFS-8089. Move o.a.h.hdfs.web.resources.* to the client jars. (wheat9) + HDFS-7979. Initialize block report IDs with a random number. (wang) + OPTIMIZATIONS HDFS-8026. Trace FSOutputSummer#writeChecksumChunks rather than diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BPServiceActor.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BPServiceActor.java index dd6f9ac032a..ba222259b57 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BPServiceActor.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BPServiceActor.java @@ -118,6 +118,7 @@ class BPServiceActor implements Runnable { private volatile boolean shouldServiceRun = true; private final DataNode dn; private final DNConf dnConf; + private long prevBlockReportId; private DatanodeRegistration bpRegistration; final LinkedList bpThreadQueue @@ -128,6 +129,7 @@ class BPServiceActor implements Runnable { this.dn = bpos.getDataNode(); this.nnAddr = nnAddr; this.dnConf = dn.getDnConf(); + prevBlockReportId = DFSUtil.getRandom().nextLong(); } boolean isAlive() { @@ -434,15 +436,15 @@ class BPServiceActor implements Runnable { return sendImmediateIBR; } - private long prevBlockReportId = 0; - private long generateUniqueBlockReportId() { - long id = System.nanoTime(); - if (id <= prevBlockReportId) { - id = prevBlockReportId + 1; + // Initialize the block report ID the first time through. + // Note that 0 is used on the NN to indicate "uninitialized", so we should + // not send a 0 value ourselves. + prevBlockReportId++; + while (prevBlockReportId == 0) { + prevBlockReportId = DFSUtil.getRandom().nextLong(); } - prevBlockReportId = id; - return id; + return prevBlockReportId; } /** diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/protocol/BlockReportContext.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/protocol/BlockReportContext.java index a084a813cf6..d0b02825f12 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/protocol/BlockReportContext.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/protocol/BlockReportContext.java @@ -18,6 +18,8 @@ package org.apache.hadoop.hdfs.server.protocol; +import org.apache.hadoop.classification.InterfaceAudience; + /** * The context of the block report. * @@ -27,6 +29,7 @@ package org.apache.hadoop.hdfs.server.protocol; * of RPCs which this block report is split into, and the index into that * total for the current RPC. */ +@InterfaceAudience.Private public class BlockReportContext { private final int totalRpcs; private final int curRpc;