This is an automated email from the ASF dual-hosted git repository.

sumitagrawal pushed a commit to branch HDDS-5713
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/HDDS-5713 by this push:
     new 4e9bb80c601 HDDS-13665. [DiskBalancer] Cleanup for multiple 
DiskBalancerReport sent to SCM (#9034)
4e9bb80c601 is described below

commit 4e9bb80c601ee2490492c5849320bebf507a103a
Author: Gargi Jaiswal <[email protected]>
AuthorDate: Fri Sep 19 13:48:05 2025 +0530

    HDDS-13665. [DiskBalancer] Cleanup for multiple DiskBalancerReport sent to 
SCM (#9034)
    
    Co-authored-by: Gargi Jaiswal <[email protected]>
---
 .../common/report/DiskBalancerReportPublisher.java | 25 +++++++++++++++++++++-
 .../common/statemachine/DatanodeStateMachine.java  |  2 ++
 .../states/endpoint/HeartbeatEndpointTask.java     |  9 --------
 .../diskbalancer/DiskBalancerService.java          | 16 --------------
 .../ozone/container/ozoneimpl/OzoneContainer.java  |  8 -------
 .../common/report/TestReportPublisher.java         |  5 ++++-
 .../states/endpoint/TestHeartbeatEndpointTask.java |  3 +++
 ...skBalancerDuringDecommissionAndMaintenance.java |  1 +
 8 files changed, 34 insertions(+), 35 deletions(-)

diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/report/DiskBalancerReportPublisher.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/report/DiskBalancerReportPublisher.java
index 80f61301f22..cf0c5d54b7e 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/report/DiskBalancerReportPublisher.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/report/DiskBalancerReportPublisher.java
@@ -24,19 +24,29 @@
 import java.util.concurrent.TimeUnit;
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.DiskBalancerReportProto;
 import org.apache.hadoop.hdds.utils.HddsServerUtil;
+import org.apache.hadoop.ozone.container.diskbalancer.DiskBalancerInfo;
 
 /**
  * Publishes DiskBalancer report which will be sent to SCM as part of 
heartbeat.
+ * Report is only published is lastPublishedReport is different from 
currentReport,
+ * when balancer is in stopped state.
+ * But when balancer is running or paused by node state, report is actively 
sent to SCM.
  * DiskBalancer Report consist of the following information:
  *   - isBalancerRunning
  *   - balancedBytes
  *   - DiskBalancerConfiguration
+ *   - successCount
+ *   - failureCount
+ *   - bytesToMove
  */
 public class DiskBalancerReportPublisher extends
     ReportPublisher<DiskBalancerReportProto> {
 
   private Long diskBalancerReportInterval = null;
 
+  // Cache the last published report to detect changes when balancer is stopped
+  private DiskBalancerReportProto lastPublishedReport = null;
+
   @Override
   protected long getReportFrequency() {
     if (diskBalancerReportInterval == null) {
@@ -59,6 +69,19 @@ protected long getReportFrequency() {
 
   @Override
   protected DiskBalancerReportProto getReport() {
-    return getContext().getParent().getContainer().getDiskBalancerReport();
+    DiskBalancerInfo info = 
getContext().getParent().getContainer().getDiskBalancerInfo();
+    if (info == null) {
+      return null;
+    }
+
+    DiskBalancerReportProto currentReport = info.toDiskBalancerReportProto();
+
+    // Publish a report only if it has changed since the last time.
+    if (currentReport.equals(lastPublishedReport)) {
+      return null;
+    }
+
+    lastPublishedReport = currentReport;
+    return currentReport;
   }
 }
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/DatanodeStateMachine.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/DatanodeStateMachine.java
index 0423dcb5db5..4dd7fc3aaa3 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/DatanodeStateMachine.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/DatanodeStateMachine.java
@@ -38,6 +38,7 @@
 import org.apache.hadoop.hdds.protocol.DatanodeDetails;
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.CommandStatusReportsProto;
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.ContainerReportsProto;
+import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.DiskBalancerReportProto;
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.NodeReportProto;
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.PipelineReportsProto;
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.SCMCommandProto;
@@ -288,6 +289,7 @@ public DatanodeStateMachine(HddsDatanodeService 
hddsDatanodeService,
         .addPublisherFor(ContainerReportsProto.class)
         .addPublisherFor(CommandStatusReportsProto.class)
         .addPublisherFor(PipelineReportsProto.class)
+        .addPublisherFor(DiskBalancerReportProto.class)
         .addThreadNamePrefix(threadNamePrefix)
         .build();
 
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/states/endpoint/HeartbeatEndpointTask.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/states/endpoint/HeartbeatEndpointTask.java
index 1309be796d1..5b23dcb5f94 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/states/endpoint/HeartbeatEndpointTask.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/states/endpoint/HeartbeatEndpointTask.java
@@ -49,7 +49,6 @@
 import 
org.apache.hadoop.ozone.container.common.statemachine.EndpointStateMachine;
 import 
org.apache.hadoop.ozone.container.common.statemachine.EndpointStateMachine.EndPointStates;
 import org.apache.hadoop.ozone.container.common.statemachine.StateContext;
-import org.apache.hadoop.ozone.container.diskbalancer.DiskBalancerInfo;
 import org.apache.hadoop.ozone.protocol.commands.CloseContainerCommand;
 import org.apache.hadoop.ozone.protocol.commands.ClosePipelineCommand;
 import org.apache.hadoop.ozone.protocol.commands.CreatePipelineCommand;
@@ -146,7 +145,6 @@ public EndpointStateMachine.EndPointStates call() throws 
Exception {
       addContainerActions(requestBuilder);
       addPipelineActions(requestBuilder);
       addQueuedCommandCounts(requestBuilder);
-      addDiskBalancerReport(requestBuilder);
       SCMHeartbeatRequestProto request = requestBuilder.build();
       LOG.debug("Sending heartbeat message : {}", request);
       SCMHeartbeatResponseProto response = rpcEndpoint.getEndPoint()
@@ -257,13 +255,6 @@ private void addQueuedCommandCounts(
     requestBuilder.setCommandQueueReport(reportProto.build());
   }
 
-  private void addDiskBalancerReport(SCMHeartbeatRequestProto.Builder 
requestBuilder) {
-    DiskBalancerInfo info = 
context.getParent().getContainer().getDiskBalancerInfo();
-    if (info != null) {
-      requestBuilder.setDiskBalancerReport(info.toDiskBalancerReportProto());
-    }
-  }
-
   /**
    * Returns a builder class for HeartbeatEndpointTask task.
    * @return   Builder.
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/diskbalancer/DiskBalancerService.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/diskbalancer/DiskBalancerService.java
index b827d2251f6..2eabf1ac236 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/diskbalancer/DiskBalancerService.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/diskbalancer/DiskBalancerService.java
@@ -41,7 +41,6 @@
 import org.apache.hadoop.hdds.protocol.DatanodeDetails;
 import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos;
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
-import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.DiskBalancerReportProto;
 import org.apache.hadoop.hdds.scm.ScmConfigKeys;
 import org.apache.hadoop.hdds.scm.container.ContainerID;
 import 
org.apache.hadoop.hdds.scm.container.common.helpers.StorageContainerException;
@@ -358,21 +357,6 @@ public void setVersion(DiskBalancerVersion version) {
     this.version = version;
   }
 
-  public DiskBalancerReportProto getDiskBalancerReportProto() {
-    DiskBalancerReportProto.Builder builder =
-        DiskBalancerReportProto.newBuilder();
-    return builder.setIsRunning(this.operationalState == 
DiskBalancerOperationalState.RUNNING)
-        .setBalancedBytes(totalBalancedBytes.get())
-        .setDiskBalancerConf(
-            HddsProtos.DiskBalancerConfigurationProto.newBuilder()
-                .setThreshold(threshold)
-                .setDiskBandwidthInMB(bandwidthInMB)
-                .setParallelThread(parallelThread)
-                .setStopAfterDiskEven(stopAfterDiskEven)
-                .build())
-        .build();
-  }
-
   @Override
   public BackgroundTaskQueue getTasks() {
     BackgroundTaskQueue queue = new BackgroundTaskQueue();
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/OzoneContainer.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/OzoneContainer.java
index db6c5352264..aef40d11559 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/OzoneContainer.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ozoneimpl/OzoneContainer.java
@@ -56,7 +56,6 @@
 import 
org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ContainerType;
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos;
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.ContainerReplicaProto;
-import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.DiskBalancerReportProto;
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.IncrementalContainerReportProto;
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.PipelineReportsProto;
 import org.apache.hadoop.hdds.scm.container.ContainerID;
@@ -719,13 +718,6 @@ public WitnessedContainerMetadataStore 
getWitnessedContainerMetadataStore() {
     return witnessedContainerMetadataStore;
   }
 
-  public DiskBalancerReportProto getDiskBalancerReport() {
-    if (diskBalancerService == null) {
-      return null;
-    }
-    return diskBalancerService.getDiskBalancerReportProto();
-  }
-
   public DiskBalancerInfo getDiskBalancerInfo() {
     if (diskBalancerService == null) {
       return null;
diff --git 
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/report/TestReportPublisher.java
 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/report/TestReportPublisher.java
index 1edd6e205c6..68036567d6c 100644
--- 
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/report/TestReportPublisher.java
+++ 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/report/TestReportPublisher.java
@@ -42,6 +42,7 @@
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.SCMCommandProto.Type;
 import 
org.apache.hadoop.ozone.container.common.statemachine.DatanodeStateMachine;
 import org.apache.hadoop.ozone.container.common.statemachine.StateContext;
+import org.apache.hadoop.ozone.container.diskbalancer.DiskBalancerInfo;
 import org.apache.hadoop.ozone.container.ozoneimpl.OzoneContainer;
 import org.apache.hadoop.ozone.protocol.commands.CommandStatus;
 import org.apache.hadoop.util.concurrent.HadoopExecutors;
@@ -180,6 +181,7 @@ public void testDiskBalancerReportPublisher() throws 
IOException {
     DatanodeStateMachine dummyStateMachine =
         mock(DatanodeStateMachine.class);
     OzoneContainer dummyContainer = mock(OzoneContainer.class);
+    DiskBalancerInfo dummyInfo = mock(DiskBalancerInfo.class);
 
     DiskBalancerReportProto.Builder builder = 
DiskBalancerReportProto.newBuilder();
     builder.setIsRunning(true);
@@ -191,7 +193,8 @@ public void testDiskBalancerReportPublisher() throws 
IOException {
     ReportPublisher publisher = new DiskBalancerReportPublisher();
     when(dummyContext.getParent()).thenReturn(dummyStateMachine);
     when(dummyStateMachine.getContainer()).thenReturn(dummyContainer);
-    when(dummyContainer.getDiskBalancerReport()).thenReturn(dummyReport);
+    when(dummyContainer.getDiskBalancerInfo()).thenReturn(dummyInfo);
+    when(dummyInfo.toDiskBalancerReportProto()).thenReturn(dummyReport);
     publisher.setConf(config);
 
     ScheduledExecutorService executorService = HadoopExecutors
diff --git 
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/states/endpoint/TestHeartbeatEndpointTask.java
 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/states/endpoint/TestHeartbeatEndpointTask.java
index 33cfc9ebd26..987916da27c 100644
--- 
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/states/endpoint/TestHeartbeatEndpointTask.java
+++ 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/states/endpoint/TestHeartbeatEndpointTask.java
@@ -357,6 +357,8 @@ public void testheartbeatWithAllReports() throws Exception {
                         .getDatanodeDetails().getUuid())
                 .build());
 
+    DiskBalancerInfo mockInfo = container.getDiskBalancerInfo();
+
     HeartbeatEndpointTask endpointTask = getHeartbeatEndpointTask(
         conf, context, scm);
     context.addEndpoint(TEST_SCM_ENDPOINT);
@@ -365,6 +367,7 @@ public void testheartbeatWithAllReports() throws Exception {
     context.addIncrementalReport(
         CommandStatusReportsProto.getDefaultInstance());
     context.addContainerAction(getContainerAction());
+    context.refreshFullReport(mockInfo.toDiskBalancerReportProto());
     endpointTask.call();
     SCMHeartbeatRequestProto heartbeat = argument.getValue();
     assertTrue(heartbeat.hasDatanodeDetails());
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/scm/node/TestDiskBalancerDuringDecommissionAndMaintenance.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/scm/node/TestDiskBalancerDuringDecommissionAndMaintenance.java
index 81490a9b3ce..f0130d20471 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/scm/node/TestDiskBalancerDuringDecommissionAndMaintenance.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/scm/node/TestDiskBalancerDuringDecommissionAndMaintenance.java
@@ -74,6 +74,7 @@ public class TestDiskBalancerDuringDecommissionAndMaintenance 
{
   public static void setup() throws Exception {
     conf = new OzoneConfiguration();
     conf.setBoolean(HddsConfigKeys.HDDS_DATANODE_DISK_BALANCER_ENABLED_KEY, 
true);
+    conf.setStrings(HddsConfigKeys.HDDS_DISK_BALANCER_REPORT_INTERVAL, "2s");
     conf.setClass(ScmConfigKeys.OZONE_SCM_CONTAINER_PLACEMENT_IMPL_KEY,
         SCMContainerPlacementCapacity.class, PlacementPolicy.class);
     conf.setTimeDuration("hdds.datanode.disk.balancer.service.interval", 2, 
TimeUnit.SECONDS);


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to