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]