From 3237d6762c5c40e25a83b5ff5bbccf76913100c1 Mon Sep 17 00:00:00 2001 From: Xiaoyu Yao Date: Fri, 15 Nov 2019 12:38:56 -0800 Subject: [PATCH] HDDS-2518. Ensure RATIS leader info is properly updated with pipeline report. --- .../hadoop/hdds/scm/pipeline/Pipeline.java | 1 + .../org/apache/hadoop/hdds/scm/TestUtils.java | 9 +++++++++ .../scm/pipeline/TestSCMPipelineManager.java | 18 ++++++++++++++---- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/pipeline/Pipeline.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/pipeline/Pipeline.java index 522a7477c8dd..51598a77ce88 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/pipeline/Pipeline.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/pipeline/Pipeline.java @@ -313,6 +313,7 @@ public Builder(Pipeline pipeline) { this.state = pipeline.state; this.nodeStatus = pipeline.nodeStatus; this.nodesInOrder = pipeline.nodesInOrder.get(); + this.leaderId = pipeline.getLeaderId(); } public Builder setId(PipelineID id1) { diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/TestUtils.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/TestUtils.java index 89c4eb3d64f1..baeb6dcf318a 100644 --- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/TestUtils.java +++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/TestUtils.java @@ -362,6 +362,15 @@ public static PipelineReportFromDatanode getPipelineReportFromDatanode( return new PipelineReportFromDatanode(dn, reportBuilder.build()); } + public static PipelineReportFromDatanode getPipelineReportFromDatanode( + DatanodeDetails dn, PipelineID pipelineID, boolean isLeader) { + PipelineReportsProto.Builder reportBuilder = + PipelineReportsProto.newBuilder(); + reportBuilder.addPipelineReport(PipelineReport.newBuilder() + .setPipelineID(pipelineID.getProtobuf()).setIsLeader(isLeader)); + return new PipelineReportFromDatanode(dn, reportBuilder.build()); + } + public static void openAllRatisPipelines(PipelineManager pipelineManager) throws IOException { // Pipeline is created by background thread diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestSCMPipelineManager.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestSCMPipelineManager.java index 69227021a694..3e6017fdf8f2 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestSCMPipelineManager.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestSCMPipelineManager.java @@ -177,14 +177,19 @@ public void testPipelineReport() throws IOException { // get pipeline report from each dn in the pipeline PipelineReportHandler pipelineReportHandler = new PipelineReportHandler(scmSafeModeManager, pipelineManager, conf); + Boolean isLeader = true; for (DatanodeDetails dn: pipeline.getNodes()) { PipelineReportFromDatanode pipelineReportFromDatanode = - TestUtils.getPipelineReportFromDatanode(dn, pipeline.getId()); + TestUtils.getPipelineReportFromDatanode(dn, pipeline.getId(), + isLeader); + if (isLeader) { + isLeader = false; + } // pipeline is not healthy until all dns report Assert.assertFalse( pipelineManager.getPipeline(pipeline.getId()).isHealthy()); pipelineReportHandler - .onMessage(pipelineReportFromDatanode, new EventQueue()); + .onMessage(pipelineReportFromDatanode, eventQueue); } // pipeline is healthy when all dns report @@ -197,12 +202,17 @@ public void testPipelineReport() throws IOException { // close the pipeline pipelineManager.finalizeAndDestroyPipeline(pipeline, false); + isLeader = true; for (DatanodeDetails dn: pipeline.getNodes()) { PipelineReportFromDatanode pipelineReportFromDatanode = - TestUtils.getPipelineReportFromDatanode(dn, pipeline.getId()); + TestUtils.getPipelineReportFromDatanode(dn, pipeline.getId(), + isLeader); + if (isLeader) { + isLeader = false; + } // pipeline report for destroyed pipeline should be ignored pipelineReportHandler - .onMessage(pipelineReportFromDatanode, new EventQueue()); + .onMessage(pipelineReportFromDatanode, eventQueue); } try {