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

adoroszlai pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/master by this push:
     new 2bf3f16c38 HDDS-12568. Implement MiniOzoneCluster.Service for Recon 
(#8452)
2bf3f16c38 is described below

commit 2bf3f16c38f624648433547c0307c94b3fe9b6a7
Author: Doroszlai, Attila <[email protected]>
AuthorDate: Thu May 15 11:57:39 2025 +0200

    HDDS-12568. Implement MiniOzoneCluster.Service for Recon (#8452)
---
 .../apache/hadoop/ozone/MiniOzoneChaosCluster.java |   2 +-
 .../apache/hadoop/ozone/recon/ReconService.java    | 109 +++++++++++++++++++++
 .../ozone/recon/TestReconAndAdminContainerCLI.java |  18 ++--
 .../hadoop/ozone/recon/TestReconAsPassiveScm.java  |  18 ++--
 .../ozone/recon/TestReconContainerEndpoint.java    |  16 +--
 .../TestReconInsightsForDeletedDirectories.java    |  28 +++---
 .../hadoop/ozone/recon/TestReconScmSnapshot.java   |  36 ++++---
 .../apache/hadoop/ozone/recon/TestReconTasks.java  |  15 +--
 .../ozone/recon/TestReconWithOzoneManager.java     |  28 +++---
 .../ozone/recon/TestReconWithOzoneManagerFSO.java  |  19 ++--
 .../ozone/recon/TestReconWithOzoneManagerHA.java   |   8 +-
 .../hadoop/ozone/shell/TestNSSummaryAdmin.java     |   5 +-
 .../org/apache/hadoop/ozone/MiniOzoneCluster.java  |  30 ------
 .../apache/hadoop/ozone/MiniOzoneClusterImpl.java  | 104 +-------------------
 .../hadoop/ozone/MiniOzoneHAClusterImpl.java       |  16 +--
 15 files changed, 226 insertions(+), 226 deletions(-)

diff --git 
a/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/java/org/apache/hadoop/ozone/MiniOzoneChaosCluster.java
 
b/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/java/org/apache/hadoop/ozone/MiniOzoneChaosCluster.java
index 555055a630..f8ef8e01c1 100644
--- 
a/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/java/org/apache/hadoop/ozone/MiniOzoneChaosCluster.java
+++ 
b/hadoop-ozone/fault-injection-test/mini-chaos-tests/src/test/java/org/apache/hadoop/ozone/MiniOzoneChaosCluster.java
@@ -72,7 +72,7 @@ public MiniOzoneChaosCluster(OzoneConfiguration conf,
       List<HddsDatanodeService> hddsDatanodes, String clusterPath,
       Set<Class<? extends Failures>> clazzes) {
     super(conf, new SCMConfigurator(), omService, scmService, hddsDatanodes,
-        clusterPath, null);
+        clusterPath, Collections.emptyList());
     this.numDatanodes = getHddsDatanodes().size();
     this.numOzoneManagers = omService.getServices().size();
     this.numStorageContainerManagers = scmService.getServices().size();
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/ReconService.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/ReconService.java
new file mode 100644
index 0000000000..99f0faa35f
--- /dev/null
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/ReconService.java
@@ -0,0 +1,109 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.ozone.recon;
+
+import static 
org.apache.hadoop.hdds.recon.ReconConfigKeys.OZONE_RECON_ADDRESS_KEY;
+import static 
org.apache.hadoop.hdds.recon.ReconConfigKeys.OZONE_RECON_DATANODE_ADDRESS_KEY;
+import static 
org.apache.hadoop.hdds.recon.ReconConfigKeys.OZONE_RECON_HTTP_ADDRESS_KEY;
+import static 
org.apache.hadoop.hdds.recon.ReconConfigKeys.OZONE_RECON_TASK_SAFEMODE_WAIT_THRESHOLD;
+import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_METADATA_DIRS;
+import static 
org.apache.hadoop.ozone.recon.ReconServerConfigKeys.OZONE_RECON_DB_DIR;
+import static 
org.apache.hadoop.ozone.recon.ReconServerConfigKeys.OZONE_RECON_OM_SNAPSHOT_DB_DIR;
+import static 
org.apache.hadoop.ozone.recon.ReconServerConfigKeys.OZONE_RECON_SCM_DB_DIR;
+import static 
org.apache.ozone.test.GenericTestUtils.PortAllocator.localhostWithFreePort;
+
+import java.io.File;
+import java.util.Objects;
+import org.apache.hadoop.hdds.conf.OzoneConfiguration;
+import org.apache.hadoop.ozone.MiniOzoneCluster;
+import org.apache.ozone.recon.schema.ReconSqlDbConfig;
+import org.apache.ratis.util.Preconditions;
+
+/** Recon for {@link MiniOzoneCluster}. */
+public class ReconService implements MiniOzoneCluster.Service {
+
+  private static final String[] NO_ARGS = new String[0];
+
+  private final String httpAddress;
+  private final String datanodeAddress;
+
+  private ReconServer reconServer;
+
+  public ReconService(OzoneConfiguration conf) {
+    httpAddress = localhostWithFreePort();
+    datanodeAddress = localhostWithFreePort();
+    setReconAddress(conf);
+  }
+
+  @Override
+  public void start(OzoneConfiguration conf) {
+    Preconditions.assertNull(reconServer, "Recon already started");
+
+    ConfigurationProvider.resetConfiguration();
+    ConfigurationProvider.setConfiguration(conf);
+    configureRecon(conf);
+
+    reconServer = new ReconServer();
+    reconServer.execute(NO_ARGS);
+  }
+
+  @Override
+  public void stop() {
+    final ReconServer instance = reconServer;
+    Preconditions.assertNotNull(instance, "Recon not running");
+    instance.stop();
+    instance.join();
+    reconServer = null;
+  }
+
+  @Override
+  public String toString() {
+    final ReconServer instance = reconServer;
+    return instance != null
+        ? "Recon(http=" + instance.getHttpServer().getHttpAddress()
+            + ", https=" + instance.getHttpServer().getHttpsAddress() + ")"
+        : "Recon";
+  }
+
+  ReconServer getReconServer() {
+    return reconServer;
+  }
+
+  private void configureRecon(OzoneConfiguration conf) {
+    String metadataDir = Objects.requireNonNull(conf.get(OZONE_METADATA_DIRS), 
OZONE_METADATA_DIRS + " must be set");
+    File dir = new File(metadataDir, "recon");
+    conf.set(OZONE_RECON_DB_DIR, dir.getAbsolutePath());
+    conf.set(OZONE_RECON_OM_SNAPSHOT_DB_DIR, dir.getAbsolutePath());
+    conf.set(OZONE_RECON_SCM_DB_DIR, dir.getAbsolutePath());
+
+    ReconSqlDbConfig dbConfig = conf.getObject(ReconSqlDbConfig.class);
+    dbConfig.setJdbcUrl("jdbc:derby:" + dir.getAbsolutePath()
+        + "/ozone_recon_derby.db");
+    conf.setFromObject(dbConfig);
+
+    conf.set(OZONE_RECON_TASK_SAFEMODE_WAIT_THRESHOLD, "10s");
+
+    setReconAddress(conf);
+  }
+
+  private void setReconAddress(OzoneConfiguration conf) {
+    conf.set(OZONE_RECON_ADDRESS_KEY, datanodeAddress);
+    conf.set(OZONE_RECON_DATANODE_ADDRESS_KEY, datanodeAddress);
+    conf.set(OZONE_RECON_HTTP_ADDRESS_KEY, httpAddress);
+  }
+}
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconAndAdminContainerCLI.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconAndAdminContainerCLI.java
index 1913b17384..70be91b786 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconAndAdminContainerCLI.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconAndAdminContainerCLI.java
@@ -112,6 +112,7 @@ class TestReconAndAdminContainerCLI {
   private static OzoneBucket ozoneBucket;
   private static ContainerManager scmContainerManager;
   private static ContainerManager reconContainerManager;
+  private static ReconService recon;
 
   private static Stream<Arguments> outOfServiceNodeStateArgs() {
     return Stream.of(
@@ -125,10 +126,11 @@ private static Stream<Arguments> 
outOfServiceNodeStateArgs() {
   @BeforeAll
   static void init() throws Exception {
     setupConfigKeys();
+    recon = new ReconService(CONF);
     cluster = MiniOzoneCluster.newBuilder(CONF)
-                  .setNumDatanodes(5)
-                  .includeRecon(true)
-                  .build();
+        .setNumDatanodes(5)
+        .addService(recon)
+        .build();
     cluster.waitForClusterToBeReady();
     GenericTestUtils.setLogLevel(ReconNodeManager.class, Level.DEBUG);
 
@@ -140,7 +142,7 @@ static void init() throws Exception {
 
     ReconStorageContainerManagerFacade reconScm =
         (ReconStorageContainerManagerFacade)
-            cluster.getReconServer().getReconStorageContainerManager();
+            recon.getReconServer().getReconStorageContainerManager();
     PipelineManager reconPipelineManager = reconScm.getPipelineManager();
     reconContainerManager = reconScm.getContainerManager();
 
@@ -168,7 +170,7 @@ static void init() throws Exception {
         client, volumeName, bucketName, BucketLayout.FILE_SYSTEM_OPTIMIZED);
 
     String keyNameR3 = "key1";
-    containerIdR3 = setupRatisKey(keyNameR3,
+    containerIdR3 = setupRatisKey(recon, keyNameR3,
         HddsProtos.ReplicationFactor.THREE);
   }
 
@@ -186,7 +188,7 @@ static void shutdown() {
   @Test
   void testMissingContainer() throws Exception {
     String keyNameR1 = "key2";
-    long containerID = setupRatisKey(keyNameR1,
+    long containerID = setupRatisKey(recon, keyNameR1,
         HddsProtos.ReplicationFactor.ONE);
 
     Pipeline pipeline =
@@ -377,7 +379,7 @@ private static boolean 
assertReportsMatch(UnHealthyContainerStates state) {
     return true;
   }
 
-  private static long setupRatisKey(String keyName,
+  private static long setupRatisKey(ReconService reconService, String keyName,
       HddsProtos.ReplicationFactor replicationFactor) throws Exception {
     OmKeyInfo omKeyInfo = createTestKey(keyName,
         RatisReplicationConfig.getInstance(replicationFactor));
@@ -395,7 +397,7 @@ private static long setupRatisKey(String keyName,
         reconContainerManager.getContainers());
 
     ReconContainerMetadataManager reconContainerMetadataManager =
-        cluster.getReconServer().getReconContainerMetadataManager();
+        reconService.getReconServer().getReconContainerMetadataManager();
 
     // Verify Recon picked up the new keys and
     // updated its container key mappings.
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconAsPassiveScm.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconAsPassiveScm.java
index 93c6e17dba..1b47f97238 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconAsPassiveScm.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconAsPassiveScm.java
@@ -59,14 +59,18 @@
 public class TestReconAsPassiveScm {
   private MiniOzoneCluster cluster;
   private OzoneConfiguration conf;
+  private ReconService recon;
 
   @BeforeEach
   public void init() throws Exception {
     conf = new OzoneConfiguration();
     conf.set(HDDS_CONTAINER_REPORT_INTERVAL, "5s");
     conf.set(HDDS_PIPELINE_REPORT_INTERVAL, "5s");
-    cluster =  MiniOzoneCluster.newBuilder(conf).setNumDatanodes(3)
-        .includeRecon(true).build();
+    recon = new ReconService(conf);
+    cluster =  MiniOzoneCluster.newBuilder(conf)
+        .setNumDatanodes(3)
+        .addService(recon)
+        .build();
     cluster.waitForClusterToBeReady();
     GenericTestUtils.setLogLevel(ReconNodeManager.class, Level.DEBUG);
   }
@@ -82,7 +86,7 @@ public void shutdown() {
   public void testDatanodeRegistrationAndReports() throws Exception {
     ReconStorageContainerManagerFacade reconScm =
         (ReconStorageContainerManagerFacade)
-        cluster.getReconServer().getReconStorageContainerManager();
+        recon.getReconServer().getReconStorageContainerManager();
     StorageContainerManager scm = cluster.getStorageContainerManager();
     PipelineManager reconPipelineManager = reconScm.getPipelineManager();
     PipelineManager scmPipelineManager = scm.getPipelineManager();
@@ -143,7 +147,7 @@ public void testDatanodeRegistrationAndReports() throws 
Exception {
   @Test
   public void testReconRestart() throws Exception {
     final OzoneStorageContainerManager reconScm =
-            cluster.getReconServer().getReconStorageContainerManager();
+            recon.getReconServer().getReconStorageContainerManager();
     StorageContainerManager scm = cluster.getStorageContainerManager();
 
     // Stop Recon
@@ -155,7 +159,7 @@ public void testReconRestart() throws Exception {
     LambdaTestUtils.await(60000, 5000,
         () -> (reconScm.getScmNodeManager().getAllNodes().size() == 3));
 
-    cluster.stopRecon();
+    recon.stop();
 
     // Create container in SCM.
     ContainerInfo containerInfo =
@@ -180,7 +184,7 @@ public void testReconRestart() throws Exception {
     scmPipelineManager.deletePipeline(pipelineToClose.get().getId());
 
     // Start Recon
-    cluster.startRecon();
+    recon.start(cluster.getConf());
 
     // Verify if Recon has all the nodes on restart (even if heartbeats are
     // not yet received).
@@ -191,7 +195,7 @@ public void testReconRestart() throws Exception {
 
     // Verify Recon picks up new container, close pipeline SCM actions.
     OzoneStorageContainerManager newReconScm =
-        cluster.getReconServer().getReconStorageContainerManager();
+        recon.getReconServer().getReconStorageContainerManager();
     PipelineManager reconPipelineManager = newReconScm.getPipelineManager();
     assertFalse(
         reconPipelineManager.containsPipeline(pipelineToClose.get().getId()));
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconContainerEndpoint.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconContainerEndpoint.java
index 14e72e3656..45325042d1 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconContainerEndpoint.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconContainerEndpoint.java
@@ -55,15 +55,17 @@ public class TestReconContainerEndpoint {
   private MiniOzoneCluster cluster;
   private OzoneClient client;
   private ObjectStore store;
+  private ReconService recon;
 
   @BeforeEach
   public void init() throws Exception {
     conf = new OzoneConfiguration();
     conf.set(OMConfigKeys.OZONE_DEFAULT_BUCKET_LAYOUT,
         OMConfigKeys.OZONE_BUCKET_LAYOUT_FILE_SYSTEM_OPTIMIZED);
+    recon = new ReconService(conf);
     cluster = MiniOzoneCluster.newBuilder(conf)
         .setNumDatanodes(3)
-        .includeRecon(true)
+        .addService(recon)
         .build();
     cluster.waitForClusterToBeReady();
     client = cluster.newClient();
@@ -102,7 +104,7 @@ public void testContainerEndpointForFSOLayout() throws 
Exception {
 
     // Synchronize data from OM to Recon
     OzoneManagerServiceProviderImpl impl = (OzoneManagerServiceProviderImpl)
-        cluster.getReconServer().getOzoneManagerServiceProvider();
+        recon.getReconServer().getOzoneManagerServiceProvider();
     impl.syncDataFromOM();
 
     //Search for the bucket from the bucket table and verify its FSO
@@ -162,7 +164,7 @@ public void testContainerEndpointForOBSBucket() throws 
Exception {
     writeTestData(volumeName, obsBucketName, obsSingleFileKey, "Hello OBS!");
 
     OzoneManagerServiceProviderImpl impl =
-        (OzoneManagerServiceProviderImpl) cluster.getReconServer()
+        (OzoneManagerServiceProviderImpl) recon.getReconServer()
             .getOzoneManagerServiceProvider();
     impl.syncDataFromOM();
 
@@ -191,19 +193,19 @@ public void testContainerEndpointForOBSBucket() throws 
Exception {
 
   private Response getContainerEndpointResponse(long containerId) {
     OzoneStorageContainerManager reconSCM =
-        cluster.getReconServer().getReconStorageContainerManager();
+        recon.getReconServer().getReconStorageContainerManager();
     ReconContainerManager reconContainerManager =
         (ReconContainerManager) reconSCM.getContainerManager();
     ContainerHealthSchemaManager containerHealthSchemaManager =
         reconContainerManager.getContainerSchemaManager();
     ReconOMMetadataManager omMetadataManagerInstance =
         (ReconOMMetadataManager)
-            cluster.getReconServer().getOzoneManagerServiceProvider()
+            recon.getReconServer().getOzoneManagerServiceProvider()
                 .getOMMetadataManagerInstance();
     ContainerEndpoint containerEndpoint =
         new ContainerEndpoint(reconSCM, containerHealthSchemaManager,
-            cluster.getReconServer().getReconNamespaceSummaryManager(),
-            cluster.getReconServer().getReconContainerMetadataManager(),
+            recon.getReconServer().getReconNamespaceSummaryManager(),
+            recon.getReconServer().getReconContainerMetadataManager(),
             omMetadataManagerInstance);
     return containerEndpoint.getKeysForContainer(containerId, 10, "");
   }
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconInsightsForDeletedDirectories.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconInsightsForDeletedDirectories.java
index 14b11c74fd..904a1a9193 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconInsightsForDeletedDirectories.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconInsightsForDeletedDirectories.java
@@ -82,6 +82,7 @@ public class TestReconInsightsForDeletedDirectories {
   private static String volumeName;
   private static String bucketName;
   private static OzoneClient client;
+  private static ReconService recon;
 
   @BeforeAll
   public static void init() throws Exception {
@@ -90,9 +91,10 @@ public static void init() throws Exception {
     conf.setTimeDuration(OZONE_BLOCK_DELETING_SERVICE_INTERVAL, 10000000,
         TimeUnit.MILLISECONDS);
     conf.setBoolean(OZONE_ACL_ENABLED, true);
+    recon = new ReconService(conf);
     cluster = MiniOzoneCluster.newBuilder(conf)
         .setNumDatanodes(3)
-        .includeRecon(true)
+        .addService(recon)
         .build();
     cluster.waitForClusterToBeReady();
     client = cluster.newClient();
@@ -174,7 +176,7 @@ public void testGetDeletedDirectoryInfo()
 
     // Retrieve tables from Recon's OM-DB.
     ReconOMMetadataManager reconOmMetadataManagerInstance =
-        (ReconOMMetadataManager) cluster.getReconServer()
+        (ReconOMMetadataManager) recon.getReconServer()
             .getOzoneManagerServiceProvider().getOMMetadataManagerInstance();
     Table<String, OmKeyInfo> reconFileTable =
         reconOmMetadataManagerInstance.getKeyTable(getFSOBucketLayout());
@@ -203,7 +205,7 @@ public void testGetDeletedDirectoryInfo()
     } else {
       // Retrieve Namespace Summary for dir1 from Recon.
       ReconNamespaceSummaryManagerImpl namespaceSummaryManager =
-          (ReconNamespaceSummaryManagerImpl) cluster.getReconServer()
+          (ReconNamespaceSummaryManagerImpl) recon.getReconServer()
               .getReconNamespaceSummaryManager();
       NSSummary summary =
           namespaceSummaryManager.getNSSummary(directoryObjectId);
@@ -222,9 +224,9 @@ public void testGetDeletedDirectoryInfo()
 
     // Create an Instance of OMDBInsightEndpoint.
     OzoneStorageContainerManager reconSCM =
-        cluster.getReconServer().getReconStorageContainerManager();
+        recon.getReconServer().getReconStorageContainerManager();
     ReconNamespaceSummaryManagerImpl reconNamespaceSummaryManager =
-        (ReconNamespaceSummaryManagerImpl) cluster.getReconServer()
+        (ReconNamespaceSummaryManagerImpl) recon.getReconServer()
             .getReconNamespaceSummaryManager();
 
     OMDBInsightEndpoint omdbInsightEndpoint =
@@ -286,7 +288,7 @@ public void 
testGetDeletedDirectoryInfoForNestedDirectories()
 
     // Retrieve tables from Recon's OM-DB.
     ReconOMMetadataManager reconOmMetadataManagerInstance =
-        (ReconOMMetadataManager) cluster.getReconServer()
+        (ReconOMMetadataManager) recon.getReconServer()
             .getOzoneManagerServiceProvider().getOMMetadataManagerInstance();
     Table<String, OmKeyInfo> reconFileTable =
         reconOmMetadataManagerInstance.getKeyTable(getFSOBucketLayout());
@@ -302,9 +304,9 @@ public void 
testGetDeletedDirectoryInfoForNestedDirectories()
 
     // Create an Instance of OMDBInsightEndpoint.
     OzoneStorageContainerManager reconSCM =
-        cluster.getReconServer().getReconStorageContainerManager();
+        recon.getReconServer().getReconStorageContainerManager();
     ReconNamespaceSummaryManagerImpl namespaceSummaryManager =
-        (ReconNamespaceSummaryManagerImpl) cluster.getReconServer()
+        (ReconNamespaceSummaryManagerImpl) recon.getReconServer()
             .getReconNamespaceSummaryManager();
 
     OMDBInsightEndpoint omdbInsightEndpoint =
@@ -373,12 +375,12 @@ public void 
testGetDeletedDirectoryInfoWithMultipleSubdirectories()
 
     // Fetch the deleted directory info from Recon OmDbInsightEndpoint.
     OzoneStorageContainerManager reconSCM =
-        cluster.getReconServer().getReconStorageContainerManager();
+        recon.getReconServer().getReconStorageContainerManager();
     ReconNamespaceSummaryManagerImpl namespaceSummaryManager =
-        (ReconNamespaceSummaryManagerImpl) cluster.getReconServer()
+        (ReconNamespaceSummaryManagerImpl) recon.getReconServer()
             .getReconNamespaceSummaryManager();
     ReconOMMetadataManager reconOmMetadataManagerInstance =
-        (ReconOMMetadataManager) cluster.getReconServer()
+        (ReconOMMetadataManager) recon.getReconServer()
             .getOzoneManagerServiceProvider().getOMMetadataManagerInstance();
     OMDBInsightEndpoint omdbInsightEndpoint =
         new OMDBInsightEndpoint(reconSCM, reconOmMetadataManagerInstance,
@@ -467,7 +469,7 @@ private boolean assertTableRowCount(int expectedCount,
     AtomicLong count = new AtomicLong(0L);
     assertDoesNotThrow(() -> {
       if (isRecon) {
-        count.set(cluster.getReconServer().getOzoneManagerServiceProvider()
+        count.set(recon.getReconServer().getOzoneManagerServiceProvider()
             .getOMMetadataManagerInstance().countRowsInTable(table));
       } else {
         count.set(cluster.getOzoneManager().getMetadataManager()
@@ -482,7 +484,7 @@ private boolean assertTableRowCount(int expectedCount,
   private void syncDataFromOM() throws IOException {
     // Sync data from Ozone Manager to Recon.
     OzoneManagerServiceProviderImpl impl = (OzoneManagerServiceProviderImpl)
-        cluster.getReconServer().getOzoneManagerServiceProvider();
+        recon.getReconServer().getOzoneManagerServiceProvider();
     impl.syncDataFromOM();
   }
 
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconScmSnapshot.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconScmSnapshot.java
index 9f75a3f08a..2084af458d 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconScmSnapshot.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconScmSnapshot.java
@@ -46,7 +46,8 @@
  */
 public class TestReconScmSnapshot {
   private OzoneConfiguration conf;
-  private MiniOzoneCluster ozoneCluster = null;
+  private MiniOzoneCluster cluster;
+  private ReconService recon;
 
   @BeforeEach
   public void setup() throws Exception {
@@ -56,33 +57,30 @@ public void setup() throws Exception {
     conf.setBoolean(
         ReconServerConfigKeys.OZONE_RECON_SCM_SNAPSHOT_ENABLED, true);
     conf.setInt(ReconServerConfigKeys.OZONE_RECON_SCM_CONTAINER_THRESHOLD, 0);
-    ozoneCluster = MiniOzoneCluster.newBuilder(conf)
+    recon = new ReconService(conf);
+    cluster = MiniOzoneCluster.newBuilder(conf)
         .setNumDatanodes(4)
-        .includeRecon(true)
+        .addService(recon)
         .build();
-    ozoneCluster.waitForClusterToBeReady();
+    cluster.waitForClusterToBeReady();
   }
 
   @Test
   public void testScmSnapshot() throws Exception {
-    testSnapshot(ozoneCluster);
-  }
-
-  public static void testSnapshot(MiniOzoneCluster cluster) throws Exception {
     LogCapturer logCapturer = 
LogCapturer.captureLogs(ReconStorageContainerManagerFacade.class);
 
-    List<ContainerInfo> reconContainers = cluster.getReconServer()
+    List<ContainerInfo> reconContainers = recon.getReconServer()
         .getReconStorageContainerManager().getContainerManager()
         .getContainers();
     assertEquals(0, reconContainers.size());
 
     ReconNodeManager nodeManager;
-    nodeManager = (ReconNodeManager) cluster.getReconServer()
+    nodeManager = (ReconNodeManager) recon.getReconServer()
         .getReconStorageContainerManager().getScmNodeManager();
     long keyCountBefore = nodeManager.getNodeDBKeyCount();
 
     //Stopping Recon to add Containers in SCM
-    cluster.stopRecon();
+    recon.stop();
 
     ContainerManager containerManager;
     containerManager = cluster.getStorageContainerManager()
@@ -93,12 +91,12 @@ public static void testSnapshot(MiniOzoneCluster cluster) 
throws Exception {
           HddsProtos.ReplicationFactor.ONE), "testOwner");
     }
 
-    cluster.startRecon();
+    recon.start(conf);
 
     //ContainerCount after Recon DB is updated with SCM DB
     containerManager = cluster.getStorageContainerManager()
         .getContainerManager();
-    ContainerManager reconContainerManager = cluster.getReconServer()
+    ContainerManager reconContainerManager = recon.getReconServer()
         .getReconStorageContainerManager().getContainerManager();
     assertTrue(logCapturer.getOutput()
         .contains("Recon Container Count: " + reconContainers.size() +
@@ -109,13 +107,13 @@ public static void testSnapshot(MiniOzoneCluster cluster) 
throws Exception {
     //PipelineCount after Recon DB is updated with SCM DB
     PipelineManager scmPipelineManager = cluster.getStorageContainerManager()
         .getPipelineManager();
-    PipelineManager reconPipelineManager = cluster.getReconServer()
+    PipelineManager reconPipelineManager = recon.getReconServer()
         .getReconStorageContainerManager().getPipelineManager();
     assertEquals(scmPipelineManager.getPipelines().size(),
         reconPipelineManager.getPipelines().size());
 
     //NodeCount after Recon DB updated with SCM DB
-    nodeManager = (ReconNodeManager) cluster.getReconServer()
+    nodeManager = (ReconNodeManager) recon.getReconServer()
         .getReconStorageContainerManager().getScmNodeManager();
     long keyCountAfter = nodeManager.getNodeDBKeyCount();
     assertEquals(keyCountAfter, keyCountBefore);
@@ -124,14 +122,14 @@ public static void testSnapshot(MiniOzoneCluster cluster) 
throws Exception {
   @Test
   @Flaky("HDDS-11645")
   public void testExplicitRemovalOfNode() throws Exception {
-    ReconNodeManager nodeManager = (ReconNodeManager) 
ozoneCluster.getReconServer()
+    ReconNodeManager nodeManager = (ReconNodeManager) recon.getReconServer()
         .getReconStorageContainerManager().getScmNodeManager();
     long nodeDBCountBefore = nodeManager.getNodeDBKeyCount();
     List<? extends DatanodeDetails> allNodes = nodeManager.getAllNodes();
     assertEquals(nodeDBCountBefore, allNodes.size());
 
     DatanodeDetails datanodeDetails = allNodes.get(3);
-    ozoneCluster.shutdownHddsDatanode(datanodeDetails);
+    cluster.shutdownHddsDatanode(datanodeDetails);
 
     GenericTestUtils.waitFor(() -> {
       try {
@@ -168,8 +166,8 @@ public void testExplicitRemovalOfNode() throws Exception {
 
   @AfterEach
   public void shutdown() throws Exception {
-    if (ozoneCluster != null) {
-      ozoneCluster.shutdown();
+    if (cluster != null) {
+      cluster.shutdown();
     }
   }
 }
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconTasks.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconTasks.java
index f5ee2b4b05..c4a7dbb0fb 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconTasks.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconTasks.java
@@ -60,6 +60,7 @@
 public class TestReconTasks {
   private MiniOzoneCluster cluster = null;
   private OzoneConfiguration conf;
+  private ReconService recon;
 
   @BeforeEach
   public void init() throws Exception {
@@ -73,8 +74,10 @@ public void init() throws Exception {
 
     conf.set("ozone.scm.stale.node.interval", "6s");
     conf.set("ozone.scm.dead.node.interval", "8s");
+    recon = new ReconService(conf);
     cluster =  MiniOzoneCluster.newBuilder(conf).setNumDatanodes(1)
-        .includeRecon(true).build();
+        .addService(recon)
+        .build();
     cluster.waitForClusterToBeReady();
     cluster.waitForPipelineTobeReady(ONE, 30000);
     GenericTestUtils.setLogLevel(SCMDatanodeHeartbeatDispatcher.class,
@@ -92,7 +95,7 @@ public void shutdown() {
   public void testSyncSCMContainerInfo() throws Exception {
     ReconStorageContainerManagerFacade reconScm =
         (ReconStorageContainerManagerFacade)
-            cluster.getReconServer().getReconStorageContainerManager();
+            recon.getReconServer().getReconStorageContainerManager();
     StorageContainerManager scm = cluster.getStorageContainerManager();
     ContainerManager scmContainerManager = scm.getContainerManager();
     ContainerManager reconContainerManager = reconScm.getContainerManager();
@@ -124,9 +127,9 @@ public void testSyncSCMContainerInfo() throws Exception {
   public void testMissingContainerDownNode() throws Exception {
     ReconStorageContainerManagerFacade reconScm =
         (ReconStorageContainerManagerFacade)
-            cluster.getReconServer().getReconStorageContainerManager();
+            recon.getReconServer().getReconStorageContainerManager();
     ReconContainerMetadataManager reconContainerMetadataManager =
-        cluster.getReconServer().getReconContainerMetadataManager();
+        recon.getReconServer().getReconContainerMetadataManager();
 
     StorageContainerManager scm = cluster.getStorageContainerManager();
     PipelineManager reconPipelineManager = reconScm.getPipelineManager();
@@ -205,9 +208,9 @@ public void testMissingContainerDownNode() throws Exception 
{
   public void testEmptyMissingContainerDownNode() throws Exception {
     ReconStorageContainerManagerFacade reconScm =
         (ReconStorageContainerManagerFacade)
-            cluster.getReconServer().getReconStorageContainerManager();
+            recon.getReconServer().getReconStorageContainerManager();
     ReconContainerMetadataManager reconContainerMetadataManager =
-        cluster.getReconServer().getReconContainerMetadataManager();
+        recon.getReconServer().getReconContainerMetadataManager();
     StorageContainerManager scm = cluster.getStorageContainerManager();
     PipelineManager reconPipelineManager = reconScm.getPipelineManager();
     PipelineManager scmPipelineManager = scm.getPipelineManager();
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconWithOzoneManager.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconWithOzoneManager.java
index adbbf7971c..4f3a354edf 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconWithOzoneManager.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconWithOzoneManager.java
@@ -19,6 +19,7 @@
 
 import static java.net.HttpURLConnection.HTTP_CREATED;
 import static java.net.HttpURLConnection.HTTP_OK;
+import static 
org.apache.hadoop.hdds.recon.ReconConfigKeys.OZONE_RECON_HTTP_ADDRESS_KEY;
 import static 
org.apache.hadoop.ozone.recon.ReconServerConfigKeys.OZONE_RECON_OM_CONNECTION_REQUEST_TIMEOUT;
 import static 
org.apache.hadoop.ozone.recon.ReconServerConfigKeys.OZONE_RECON_OM_CONNECTION_REQUEST_TIMEOUT_DEFAULT;
 import static 
org.apache.hadoop.ozone.recon.ReconServerConfigKeys.OZONE_RECON_OM_CONNECTION_TIMEOUT;
@@ -34,7 +35,6 @@
 import static org.slf4j.event.Level.INFO;
 
 import java.io.IOException;
-import java.net.InetSocketAddress;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -79,6 +79,7 @@ public class TestReconWithOzoneManager {
   private static OMMetadataManager metadataManager;
   private static CloseableHttpClient httpClient;
   private static String taskStatusURL;
+  private static ReconService recon;
 
   @BeforeAll
   public static void init() throws Exception {
@@ -109,19 +110,17 @@ public static void init() throws Exception {
         .setConnectionRequestTimeout(connectionTimeout)
         .setSocketTimeout(connectionRequestTimeout).build();
 
-    cluster =
-        MiniOzoneCluster.newBuilder(conf)
-            .setNumDatanodes(1)
-            .includeRecon(true)
-            .build();
+    recon = new ReconService(conf);
+    cluster = MiniOzoneCluster.newBuilder(conf)
+        .setNumDatanodes(1)
+        .addService(recon)
+        .build();
     cluster.waitForClusterToBeReady();
     metadataManager = cluster.getOzoneManager().getMetadataManager();
 
     cluster.getStorageContainerManager().exitSafeMode();
 
-    InetSocketAddress address =
-        cluster.getReconServer().getHttpServer().getHttpAddress();
-    String reconHTTPAddress = address.getHostName() + ":" + address.getPort();
+    String reconHTTPAddress = conf.get(OZONE_RECON_HTTP_ADDRESS_KEY);
     taskStatusURL = "http://"; + reconHTTPAddress + "/api/v1/task/status";
 
     // initialize HTTPClient
@@ -181,7 +180,7 @@ public void testOmDBSyncing() throws Exception {
     assertEquals("bucket0", keyInfo1.getBucketName());
 
     OzoneManagerServiceProviderImpl impl = (OzoneManagerServiceProviderImpl)
-        cluster.getReconServer().getOzoneManagerServiceProvider();
+        recon.getReconServer().getOzoneManagerServiceProvider();
     impl.syncDataFromOM();
     OzoneManagerSyncMetrics metrics = impl.getMetrics();
 
@@ -223,10 +222,11 @@ public void testOmDBSyncing() throws Exception {
         "lastUpdatedTimestamp");
 
     //restart Recon
-    cluster.restartReconServer();
+    recon.stop();
+    recon.start(cluster.getConf());
 
     impl = (OzoneManagerServiceProviderImpl)
-        cluster.getReconServer().getOzoneManagerServiceProvider();
+        recon.getReconServer().getOzoneManagerServiceProvider();
 
     //add 5 more keys to OM
     addKeys(5, 10);
@@ -287,7 +287,7 @@ public void testOmDBSyncWithSeqNumberMismatch() throws 
Exception {
     assertEquals("bucket10", keyInfo1.getBucketName());
 
     OzoneManagerServiceProviderImpl impl = (OzoneManagerServiceProviderImpl)
-        cluster.getReconServer().getOzoneManagerServiceProvider();
+        recon.getReconServer().getOzoneManagerServiceProvider();
     impl.syncDataFromOM();
     OzoneManagerSyncMetrics metrics = impl.getMetrics();
 
@@ -296,7 +296,7 @@ public void testOmDBSyncWithSeqNumberMismatch() throws 
Exception {
         .getDb().getLatestSequenceNumber();
 
     OMMetadataManager reconMetadataManagerInstance =
-        cluster.getReconServer().getOzoneManagerServiceProvider()
+        recon.getReconServer().getOzoneManagerServiceProvider()
             .getOMMetadataManagerInstance();
     long reconLatestSeqNumber =
         ((RDBStore) reconMetadataManagerInstance.getStore()).getDb()
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconWithOzoneManagerFSO.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconWithOzoneManagerFSO.java
index e2e8485466..1fc0547ab3 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconWithOzoneManagerFSO.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconWithOzoneManagerFSO.java
@@ -55,17 +55,18 @@ public class TestReconWithOzoneManagerFSO {
   private static MiniOzoneCluster cluster = null;
   private static OzoneConfiguration conf;
   private static ObjectStore store;
+  private static ReconService recon;
 
   @BeforeAll
   public static void init() throws Exception {
     conf = new OzoneConfiguration();
     conf.set(OMConfigKeys.OZONE_DEFAULT_BUCKET_LAYOUT,
         OMConfigKeys.OZONE_BUCKET_LAYOUT_FILE_SYSTEM_OPTIMIZED);
-    cluster =
-            MiniOzoneCluster.newBuilder(conf)
-                    .setNumDatanodes(3)
-                    .includeRecon(true)
-                    .build();
+    recon = new ReconService(conf);
+    cluster = MiniOzoneCluster.newBuilder(conf)
+        .setNumDatanodes(3)
+        .addService(recon)
+        .build();
     cluster.waitForClusterToBeReady();
     cluster.waitForPipelineTobeReady(HddsProtos.ReplicationFactor.ONE, 30000);
 
@@ -98,16 +99,16 @@ public void testNamespaceSummaryAPI() throws Exception {
     // add a vol, bucket and key
     addKeys(0, 10, "dir");
     OzoneManagerServiceProviderImpl impl = (OzoneManagerServiceProviderImpl)
-            cluster.getReconServer().getOzoneManagerServiceProvider();
+            recon.getReconServer().getOzoneManagerServiceProvider();
     impl.syncDataFromOM();
     ReconNamespaceSummaryManager namespaceSummaryManager =
-            cluster.getReconServer().getReconNamespaceSummaryManager();
+            recon.getReconServer().getReconNamespaceSummaryManager();
     ReconOMMetadataManager omMetadataManagerInstance =
             (ReconOMMetadataManager)
-                    cluster.getReconServer().getOzoneManagerServiceProvider()
+                    recon.getReconServer().getOzoneManagerServiceProvider()
                             .getOMMetadataManagerInstance();
     OzoneStorageContainerManager reconSCM =
-            cluster.getReconServer().getReconStorageContainerManager();
+            recon.getReconServer().getReconStorageContainerManager();
     NSSummaryEndpoint endpoint = new NSSummaryEndpoint(namespaceSummaryManager,
             omMetadataManagerInstance, reconSCM);
     Response basicInfo = endpoint.getBasicInfo("/vol1/bucket1/dir1");
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconWithOzoneManagerHA.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconWithOzoneManagerHA.java
index 7a6673b01e..da69308337 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconWithOzoneManagerHA.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconWithOzoneManagerHA.java
@@ -59,6 +59,7 @@ public class TestReconWithOzoneManagerHA {
   private static final String OM_SERVICE_ID = "omService1";
   private static final String VOL_NAME = "testrecon";
   private OzoneClient client;
+  private ReconService recon;
 
   @BeforeEach
   public void setup() throws Exception {
@@ -70,10 +71,11 @@ public void setup() throws Exception {
     conf.setFromObject(dbConf);
 
     MiniOzoneHAClusterImpl.Builder builder = 
MiniOzoneCluster.newHABuilder(conf);
+    recon = new ReconService(conf);
     builder.setOMServiceId(OM_SERVICE_ID)
         .setNumOfOzoneManagers(3)
         .setNumDatanodes(1)
-        .includeRecon(true);
+        .addService(recon);
     cluster = builder.build();
     cluster.waitForClusterToBeReady();
     client = OzoneClientFactory.getRpcClient(OM_SERVICE_ID, conf);
@@ -108,7 +110,7 @@ public void testReconGetsSnapshotFromLeader() throws 
Exception {
     assertTrue(ozoneManager.get().isLeaderReady(), "Should have gotten the 
leader!");
 
     OzoneManagerServiceProviderImpl impl = (OzoneManagerServiceProviderImpl)
-        cluster.getReconServer().getOzoneManagerServiceProvider();
+        recon.getReconServer().getOzoneManagerServiceProvider();
 
     String hostname =
         ozoneManager.get().getHttpServer().getHttpAddress().getHostName();
@@ -131,7 +133,7 @@ public void testReconGetsSnapshotFromLeader() throws 
Exception {
     impl.syncDataFromOM();
 
     ReconContainerMetadataManager reconContainerMetadataManager =
-        cluster.getReconServer().getReconContainerMetadataManager();
+        recon.getReconServer().getReconContainerMetadataManager();
     try (TableIterator iterator =
         reconContainerMetadataManager.getContainerTableIterator()) {
       String reconKeyPrefix = null;
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/shell/TestNSSummaryAdmin.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/shell/TestNSSummaryAdmin.java
index a4292eeab4..89f98d6fcf 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/shell/TestNSSummaryAdmin.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/shell/TestNSSummaryAdmin.java
@@ -33,6 +33,7 @@
 import org.apache.hadoop.ozone.client.OzoneVolume;
 import org.apache.hadoop.ozone.om.helpers.BucketLayout;
 import org.apache.hadoop.ozone.om.request.OMRequestTestUtils;
+import org.apache.hadoop.ozone.recon.ReconService;
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
@@ -59,7 +60,9 @@ public static void init() throws Exception {
     OMRequestTestUtils.configureFSOptimizedPaths(conf, true);
     conf.set(OZONE_RECON_ADDRESS_KEY, "localhost:9888");
     cluster = MiniOzoneCluster.newBuilder(conf)
-        .withoutDatanodes().includeRecon(true).build();
+        .withoutDatanodes()
+        .addService(new ReconService(conf))
+        .build();
     cluster.waitForClusterToBeReady();
     client = cluster.newClient();
     store = client.getObjectStore();
diff --git 
a/hadoop-ozone/mini-cluster/src/main/java/org/apache/hadoop/ozone/MiniOzoneCluster.java
 
b/hadoop-ozone/mini-cluster/src/main/java/org/apache/hadoop/ozone/MiniOzoneCluster.java
index 3b376ceefa..a1bcadd793 100644
--- 
a/hadoop-ozone/mini-cluster/src/main/java/org/apache/hadoop/ozone/MiniOzoneCluster.java
+++ 
b/hadoop-ozone/mini-cluster/src/main/java/org/apache/hadoop/ozone/MiniOzoneCluster.java
@@ -33,7 +33,6 @@
 import 
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClient;
 import org.apache.hadoop.ozone.client.OzoneClient;
 import org.apache.hadoop.ozone.om.OzoneManager;
-import org.apache.hadoop.ozone.recon.ReconServer;
 import 
org.apache.hadoop.security.authentication.client.AuthenticationException;
 import org.apache.ratis.util.ExitUtils;
 import org.apache.ratis.util.function.CheckedFunction;
@@ -137,13 +136,6 @@ void waitForPipelineTobeReady(HddsProtos.ReplicationFactor 
factor,
 
   HddsDatanodeService getHddsDatanode(DatanodeDetails dn) throws IOException;
 
-  /**
-   * Returns a {@link ReconServer} instance.
-   *
-   * @return {@link ReconServer} instance if it is initialized, otherwise null.
-   */
-  ReconServer getReconServer();
-
   /**
    * Returns an {@link OzoneClient} to access the {@link MiniOzoneCluster}.
    * The caller is responsible for closing the client after use.
@@ -171,11 +163,6 @@ void restartStorageContainerManager(boolean 
waitForDatanode)
    */
   void restartOzoneManager() throws IOException;
 
-  /**
-   * Restarts Recon instance.
-   */
-  void restartReconServer() throws Exception;
-
   /**
    * Restart a particular HddsDatanode.
    *
@@ -208,16 +195,6 @@ void restartHddsDatanode(DatanodeDetails dn, boolean 
waitForDatanode)
    */
   void shutdownHddsDatanode(DatanodeDetails dn) throws IOException;
 
-  /**
-   * Start Recon.
-   */
-  void startRecon();
-
-  /**
-   * Stop Recon.
-   */
-  void stopRecon();
-
   /**
    * Shutdown the MiniOzoneCluster and delete the storage dirs.
    */
@@ -276,8 +253,6 @@ abstract class Builder {
     protected String scmId = UUID.randomUUID().toString();
     protected String omId = UUID.randomUUID().toString();
 
-    protected boolean includeRecon = false;
-
     protected int numOfDatanodes = 3;
     protected boolean  startDataNodes = true;
     protected CertificateClient certClient;
@@ -377,11 +352,6 @@ public Builder setDatanodeFactory(DatanodeFactory factory) 
{
       return this;
     }
 
-    public Builder includeRecon(boolean include) {
-      this.includeRecon = include;
-      return this;
-    }
-
     public Builder addService(Service service) {
       services.add(service);
       return this;
diff --git 
a/hadoop-ozone/mini-cluster/src/main/java/org/apache/hadoop/ozone/MiniOzoneClusterImpl.java
 
b/hadoop-ozone/mini-cluster/src/main/java/org/apache/hadoop/ozone/MiniOzoneClusterImpl.java
index dd0d476170..cf18edbb5b 100644
--- 
a/hadoop-ozone/mini-cluster/src/main/java/org/apache/hadoop/ozone/MiniOzoneClusterImpl.java
+++ 
b/hadoop-ozone/mini-cluster/src/main/java/org/apache/hadoop/ozone/MiniOzoneClusterImpl.java
@@ -19,14 +19,6 @@
 
 import static java.util.Collections.singletonList;
 import static 
org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeState.HEALTHY;
-import static 
org.apache.hadoop.hdds.recon.ReconConfigKeys.OZONE_RECON_ADDRESS_KEY;
-import static 
org.apache.hadoop.hdds.recon.ReconConfigKeys.OZONE_RECON_DATANODE_ADDRESS_KEY;
-import static 
org.apache.hadoop.hdds.recon.ReconConfigKeys.OZONE_RECON_HTTP_ADDRESS_KEY;
-import static 
org.apache.hadoop.hdds.recon.ReconConfigKeys.OZONE_RECON_TASK_SAFEMODE_WAIT_THRESHOLD;
-import static 
org.apache.hadoop.ozone.recon.ReconServerConfigKeys.OZONE_RECON_DB_DIR;
-import static 
org.apache.hadoop.ozone.recon.ReconServerConfigKeys.OZONE_RECON_OM_SNAPSHOT_DB_DIR;
-import static 
org.apache.hadoop.ozone.recon.ReconServerConfigKeys.OZONE_RECON_SCM_DB_DIR;
-import static 
org.apache.ozone.test.GenericTestUtils.PortAllocator.anyHostWithFreePort;
 import static org.apache.ozone.test.GenericTestUtils.PortAllocator.getFreePort;
 import static 
org.apache.ozone.test.GenericTestUtils.PortAllocator.localhostWithFreePort;
 
@@ -63,7 +55,6 @@
 import 
org.apache.hadoop.hdds.scm.proxy.SCMContainerLocationFailoverProxyProvider;
 import org.apache.hadoop.hdds.scm.safemode.HealthyPipelineSafeModeRule;
 import org.apache.hadoop.hdds.scm.safemode.SafeModeRuleFactory;
-import org.apache.hadoop.hdds.scm.server.OzoneStorageContainerManager;
 import org.apache.hadoop.hdds.scm.server.SCMConfigurator;
 import org.apache.hadoop.hdds.scm.server.SCMStorageConfig;
 import org.apache.hadoop.hdds.scm.server.StorageContainerManager;
@@ -82,10 +73,7 @@
 import org.apache.hadoop.ozone.om.OMConfigKeys;
 import org.apache.hadoop.ozone.om.OMStorage;
 import org.apache.hadoop.ozone.om.OzoneManager;
-import org.apache.hadoop.ozone.recon.ConfigurationProvider;
-import org.apache.hadoop.ozone.recon.ReconServer;
 import 
org.apache.hadoop.security.authentication.client.AuthenticationException;
-import org.apache.ozone.recon.schema.ReconSqlDbConfig;
 import org.apache.ozone.test.GenericTestUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -112,7 +100,6 @@ public class MiniOzoneClusterImpl implements 
MiniOzoneCluster {
   private StorageContainerManager scm;
   private OzoneManager ozoneManager;
   private final List<HddsDatanodeService> hddsDatanodes;
-  private ReconServer reconServer;
   private final List<Service> services;
 
   // Timeout for the cluster to be ready
@@ -121,20 +108,16 @@ public class MiniOzoneClusterImpl implements 
MiniOzoneCluster {
   private final Set<AutoCloseable> clients = ConcurrentHashMap.newKeySet();
   private SecretKeyClient secretKeyClient;
 
-  /**
-   * Creates a new MiniOzoneCluster with Recon.
-   */
   private MiniOzoneClusterImpl(OzoneConfiguration conf,
       SCMConfigurator scmConfigurator,
       OzoneManager ozoneManager,
       StorageContainerManager scm,
       List<HddsDatanodeService> hddsDatanodes,
-      ReconServer reconServer, List<Service> services) {
+      List<Service> services) {
     this.conf = conf;
     this.ozoneManager = ozoneManager;
     this.scm = scm;
     this.hddsDatanodes = hddsDatanodes;
-    this.reconServer = reconServer;
     this.scmConfigurator = scmConfigurator;
     this.services = services;
   }
@@ -146,11 +129,10 @@ private MiniOzoneClusterImpl(OzoneConfiguration conf,
    * OzoneManagers and StorageContainerManagers.
    */
   MiniOzoneClusterImpl(OzoneConfiguration conf, SCMConfigurator 
scmConfigurator,
-      List<HddsDatanodeService> hddsDatanodes, ReconServer reconServer, 
List<Service> services) {
+      List<HddsDatanodeService> hddsDatanodes, List<Service> services) {
     this.scmConfigurator = scmConfigurator;
     this.conf = conf;
     this.hddsDatanodes = hddsDatanodes;
-    this.reconServer = reconServer;
     this.services = services;
   }
 
@@ -256,11 +238,6 @@ public HddsDatanodeService getHddsDatanode(DatanodeDetails 
dn)
         "Not able to find datanode with datanode Id " + dn.getUuid());
   }
 
-  @Override
-  public ReconServer getReconServer() {
-    return this.reconServer;
-  }
-
   @Override
   public int getHddsDatanodeIndex(DatanodeDetails dn) throws IOException {
     for (HddsDatanodeService service : hddsDatanodes) {
@@ -321,12 +298,6 @@ public void restartOzoneManager() throws IOException {
     ozoneManager.restart();
   }
 
-  @Override
-  public void restartReconServer() {
-    stopRecon(reconServer);
-    startRecon();
-  }
-
   private void waitForHddsDatanodeToStop(DatanodeDetails dn)
       throws TimeoutException, InterruptedException {
     GenericTestUtils.waitFor(() -> {
@@ -411,7 +382,6 @@ public void stop() {
     stopOM(ozoneManager);
     stopDatanodes(hddsDatanodes);
     stopSCM(scm);
-    stopRecon(reconServer);
     stopServices(services);
   }
 
@@ -441,17 +411,6 @@ public void shutdownHddsDatanodes() {
     });
   }
 
-  @Override
-  public void startRecon() {
-    reconServer = new ReconServer();
-    reconServer.execute(NO_ARGS);
-  }
-
-  @Override
-  public void stopRecon() {
-    stopRecon(reconServer);
-  }
-
   public void startServices() throws Exception {
     for (Service service : services) {
       service.start(getConf());
@@ -500,18 +459,6 @@ protected static void stopOM(OzoneManager om) {
     }
   }
 
-  private static void stopRecon(ReconServer reconServer) {
-    try {
-      if (reconServer != null) {
-        LOG.info("Stopping Recon");
-        reconServer.stop();
-        reconServer.join();
-      }
-    } catch (Exception e) {
-      LOG.error("Exception while shutting down Recon.", e);
-    }
-  }
-
   private static void stopServices(List<Service> services) {
     // stop in reverse order
     List<Service> reverse = new ArrayList<>(services);
@@ -548,32 +495,27 @@ public MiniOzoneCluster build() throws IOException {
       initializeConfiguration();
       StorageContainerManager scm = null;
       OzoneManager om = null;
-      ReconServer reconServer = null;
       List<HddsDatanodeService> hddsDatanodes = Collections.emptyList();
       try {
         scm = createAndStartSingleSCM();
         om = createAndStartSingleOM();
-        reconServer = createRecon();
         hddsDatanodes = createHddsDatanodes();
 
         MiniOzoneClusterImpl cluster = new MiniOzoneClusterImpl(conf,
             scmConfigurator, om, scm,
-            hddsDatanodes, reconServer, getServices());
+            hddsDatanodes, getServices());
+        cluster.startServices();
 
         cluster.setCAClient(certClient);
         cluster.setSecretKeyClient(secretKeyClient);
         if (startDataNodes) {
           cluster.startHddsDatanodes();
         }
-        cluster.startServices();
 
         prepareForNextBuild();
         return cluster;
       } catch (Exception ex) {
         stopOM(om);
-        if (includeRecon) {
-          stopRecon(reconServer);
-        }
         stopServices(getServices());
         if (startDataNodes) {
           stopDatanodes(hddsDatanodes);
@@ -727,22 +669,6 @@ protected void 
configureScmDatanodeAddress(List<StorageContainerManager> scms) {
       conf.setStrings(ScmConfigKeys.OZONE_SCM_NAMES, getSCMAddresses(scms));
     }
 
-    protected ReconServer createRecon() {
-      ReconServer reconServer = null;
-      if (includeRecon) {
-        configureRecon();
-        reconServer = new ReconServer();
-        reconServer.execute(NO_ARGS);
-
-        OzoneStorageContainerManager reconScm =
-            reconServer.getReconStorageContainerManager();
-        conf.set(OZONE_RECON_ADDRESS_KEY,
-            reconScm.getDatanodeRpcAddress().getHostString() + ":" +
-                reconScm.getDatanodeRpcAddress().getPort());
-      }
-      return reconServer;
-    }
-
     /**
      * Creates HddsDatanodeService(s) instance.
      *
@@ -786,27 +712,5 @@ private void configureOM() {
       conf.setInt(OMConfigKeys.OZONE_OM_RATIS_PORT_KEY, getFreePort());
     }
 
-    protected void configureRecon() {
-      ConfigurationProvider.resetConfiguration();
-
-      File tempNewFolder = new File(path, "recon");
-      conf.set(OZONE_RECON_DB_DIR,
-          tempNewFolder.getAbsolutePath());
-      conf.set(OZONE_RECON_OM_SNAPSHOT_DB_DIR, tempNewFolder
-          .getAbsolutePath());
-      conf.set(OZONE_RECON_SCM_DB_DIR,
-          tempNewFolder.getAbsolutePath());
-
-      ReconSqlDbConfig dbConfig = conf.getObject(ReconSqlDbConfig.class);
-      dbConfig.setJdbcUrl("jdbc:derby:" + tempNewFolder.getAbsolutePath()
-          + "/ozone_recon_derby.db");
-      conf.setFromObject(dbConfig);
-
-      conf.set(OZONE_RECON_HTTP_ADDRESS_KEY, anyHostWithFreePort());
-      conf.set(OZONE_RECON_DATANODE_ADDRESS_KEY, anyHostWithFreePort());
-      conf.set(OZONE_RECON_TASK_SAFEMODE_WAIT_THRESHOLD, "10s");
-
-      ConfigurationProvider.setConfiguration(conf);
-    }
   }
 }
diff --git 
a/hadoop-ozone/mini-cluster/src/main/java/org/apache/hadoop/ozone/MiniOzoneHAClusterImpl.java
 
b/hadoop-ozone/mini-cluster/src/main/java/org/apache/hadoop/ozone/MiniOzoneHAClusterImpl.java
index fdea7b0f4f..8612eaa174 100644
--- 
a/hadoop-ozone/mini-cluster/src/main/java/org/apache/hadoop/ozone/MiniOzoneHAClusterImpl.java
+++ 
b/hadoop-ozone/mini-cluster/src/main/java/org/apache/hadoop/ozone/MiniOzoneHAClusterImpl.java
@@ -17,7 +17,6 @@
 
 package org.apache.hadoop.ozone;
 
-import static java.util.Collections.emptyList;
 import static java.util.Collections.singletonList;
 import static org.apache.hadoop.hdds.HddsConfigKeys.OZONE_METADATA_DIRS;
 import static org.apache.ozone.test.GenericTestUtils.PortAllocator.getFreePort;
@@ -52,7 +51,6 @@
 import org.apache.hadoop.ozone.om.OMConfigKeys;
 import org.apache.hadoop.ozone.om.OzoneManager;
 import org.apache.hadoop.ozone.om.ratis.OzoneManagerRatisServer;
-import org.apache.hadoop.ozone.recon.ReconServer;
 import 
org.apache.hadoop.security.authentication.client.AuthenticationException;
 import org.apache.ozone.test.GenericTestUtils;
 import org.apache.ratis.util.function.CheckedConsumer;
@@ -87,8 +85,8 @@ public MiniOzoneHAClusterImpl(
       SCMHAService scmhaService,
       List<HddsDatanodeService> hddsDatanodes,
       String clusterPath,
-      ReconServer reconServer) {
-    super(conf, scmConfigurator, hddsDatanodes, reconServer, emptyList());
+      List<Service> services) {
+    super(conf, scmConfigurator, hddsDatanodes, services);
     this.omhaService = omhaService;
     this.scmhaService = scmhaService;
     this.clusterMetaPath = clusterPath;
@@ -421,11 +419,9 @@ public MiniOzoneHAClusterImpl build() throws IOException {
       initOMRatisConf();
       SCMHAService scmService;
       OMHAService omService;
-      ReconServer reconServer;
       try {
         scmService = createSCMService();
         omService = createOMService();
-        reconServer = createRecon();
       } catch (AuthenticationException ex) {
         throw new IOException("Unable to build MiniOzoneCluster. ", ex);
       }
@@ -433,8 +429,12 @@ public MiniOzoneHAClusterImpl build() throws IOException {
       final List<HddsDatanodeService> hddsDatanodes = createHddsDatanodes();
 
       MiniOzoneHAClusterImpl cluster = new MiniOzoneHAClusterImpl(conf,
-          scmConfigurator, omService, scmService, hddsDatanodes, path,
-          reconServer);
+          scmConfigurator, omService, scmService, hddsDatanodes, path, 
getServices());
+      try {
+        cluster.startServices();
+      } catch (Exception e) {
+        throw new IOException("Unable to start services", e);
+      }
 
       if (startDataNodes) {
         cluster.startHddsDatanodes();


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

Reply via email to