From f4bc318be6edf31e6259085ed12abae83002c67b Mon Sep 17 00:00:00 2001 From: deveshsingh Date: Fri, 31 Mar 2023 17:08:07 +0530 Subject: [PATCH 01/11] HDDS-8326. Container Level Info - OM DB Insights. --- .../ozone/recon/api/ContainerEndpoint.java | 40 +++++++ .../api/types/ContainerDiscrepancyInfo.java | 103 ++++++++++++++++++ .../recon/api/types/ContainerMetadata.java | 15 +++ .../ReconContainerMetadataManagerImpl.java | 32 ++++++ .../recon/api/TestContainerEndpoint.java | 17 +++ 5 files changed, 207 insertions(+) create mode 100644 hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/ContainerDiscrepancyInfo.java diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java index 8059bb4c4d60..a6e50f81abe9 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java @@ -46,6 +46,7 @@ import org.apache.hadoop.ozone.om.helpers.OmKeyInfo; import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfo; import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfoGroup; +import org.apache.hadoop.ozone.recon.api.types.ContainerDiscrepancyInfo; import org.apache.hadoop.ozone.recon.api.types.ContainerKeyPrefix; import org.apache.hadoop.ozone.recon.api.types.ContainerMetadata; import org.apache.hadoop.ozone.recon.api.types.ContainersResponse; @@ -400,4 +401,43 @@ private List getBlocks( private BucketLayout getBucketLayout() { return BucketLayout.DEFAULT; } + + @GET + @Path("insights/nonscmcontainers") + public Response getContainerInsights() { + List containerDiscrepancyInfoList = + new ArrayList<>(); + try { + Map omContainers = + reconContainerMetadataManager.getContainers(-1, -1); + List scmContainers = containerManager.getContainers().stream() + .map(containerInfo -> containerInfo.getContainerID()).collect( + Collectors.toList()); + List> notExistsAtSCMContainers = + omContainers.entrySet().stream().filter(containerMetadataEntry -> + !(scmContainers.contains(containerMetadataEntry.getKey()))) + .collect( + Collectors.toList()); + + notExistsAtSCMContainers.forEach(nonSCMContainer -> { + ContainerDiscrepancyInfo containerDiscrepancyInfo = + new ContainerDiscrepancyInfo(); + containerDiscrepancyInfo.setContainerID(nonSCMContainer.getKey()); + containerDiscrepancyInfo.setNumberOfKeys( + nonSCMContainer.getValue().getNumberOfKeys()); + containerDiscrepancyInfo.setPipelines(nonSCMContainer.getValue() + .getPipelines()); + containerDiscrepancyInfo.setExistsAt("OM"); + containerDiscrepancyInfoList.add(containerDiscrepancyInfo); + }); + } catch (IOException ex) { + throw new WebApplicationException(ex, + Response.Status.INTERNAL_SERVER_ERROR); + } catch (IllegalArgumentException e) { + throw new WebApplicationException(e, Response.Status.BAD_REQUEST); + } + + return Response.ok(containerDiscrepancyInfoList).build(); + } + } diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/ContainerDiscrepancyInfo.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/ContainerDiscrepancyInfo.java new file mode 100644 index 000000000000..c1fa619bd01a --- /dev/null +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/ContainerDiscrepancyInfo.java @@ -0,0 +1,103 @@ +/* + * 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.api.types; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.hadoop.hdds.scm.pipeline.Pipeline; + +import java.util.List; + +/** + * Metadata object that represents a Container Discrepancy Info. + */ +public class ContainerDiscrepancyInfo { + + @JsonProperty("containerId") + private long containerID; + + @JsonProperty("omContainerState") + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private long omContainerState; + + @JsonProperty("scmContainerState") + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private long scmContainerState; + + @JsonProperty("numberOfKeys") + private long numberOfKeys; + + @JsonProperty("pipelines") + private List pipelines; + + @JsonProperty("existsAt") + private String existsAt; + + public ContainerDiscrepancyInfo() { + + } + + public long getContainerID() { + return containerID; + } + + public void setContainerID(long containerID) { + this.containerID = containerID; + } + + public long getNumberOfKeys() { + return numberOfKeys; + } + + public void setNumberOfKeys(long numberOfKeys) { + this.numberOfKeys = numberOfKeys; + } + + public long getOmContainerState() { + return omContainerState; + } + + public void setOmContainerState(long omContainerState) { + this.omContainerState = omContainerState; + } + + public long getScmContainerState() { + return scmContainerState; + } + + public void setScmContainerState(long scmContainerState) { + this.scmContainerState = scmContainerState; + } + + public List getPipelines() { + return pipelines; + } + + public void setPipelines( + List pipelines) { + this.pipelines = pipelines; + } + + public String getExistsAt() { + return existsAt; + } + + public void setExistsAt(String existsAt) { + this.existsAt = existsAt; + } +} diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/ContainerMetadata.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/ContainerMetadata.java index d4111fb5a05b..be91bd13cffd 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/ContainerMetadata.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/ContainerMetadata.java @@ -17,9 +17,13 @@ */ package org.apache.hadoop.ozone.recon.api.types; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.hadoop.hdds.scm.pipeline.Pipeline; + import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; +import java.util.List; /** * Metadata object that represents a Container. @@ -33,6 +37,9 @@ public class ContainerMetadata { @XmlElement(name = "NumberOfKeys") private long numberOfKeys; + @JsonProperty("pipelines") + private List pipelines; + public ContainerMetadata(long containerID) { this.containerID = containerID; } @@ -53,4 +60,12 @@ public void setNumberOfKeys(long numberOfKeys) { this.numberOfKeys = numberOfKeys; } + public List getPipelines() { + return pipelines; + } + + public void setPipelines( + List pipelines) { + this.pipelines = pipelines; + } } diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ReconContainerMetadataManagerImpl.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ReconContainerMetadataManagerImpl.java index 6c40afc0fdd9..6c623c70041f 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ReconContainerMetadataManagerImpl.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ReconContainerMetadataManagerImpl.java @@ -39,12 +39,16 @@ import javax.inject.Singleton; import org.apache.commons.lang3.StringUtils; +import org.apache.hadoop.hdds.scm.pipeline.Pipeline; import org.apache.hadoop.hdds.utils.db.BatchOperation; import org.apache.hadoop.hdds.utils.db.RDBBatchOperation; +import org.apache.hadoop.ozone.om.helpers.BucketLayout; +import org.apache.hadoop.ozone.om.helpers.OmKeyInfo; import org.apache.hadoop.ozone.recon.ReconUtils; import org.apache.hadoop.ozone.recon.api.types.ContainerKeyPrefix; import org.apache.hadoop.ozone.recon.api.types.ContainerMetadata; import org.apache.hadoop.ozone.recon.api.types.KeyPrefixContainer; +import org.apache.hadoop.ozone.recon.recovery.ReconOMMetadataManager; import org.apache.hadoop.ozone.recon.scm.ContainerReplicaHistory; import org.apache.hadoop.ozone.recon.scm.ContainerReplicaHistoryList; import org.apache.hadoop.ozone.recon.spi.ReconContainerMetadataManager; @@ -54,6 +58,7 @@ import org.apache.hadoop.hdds.utils.db.TableIterator; import org.hadoop.ozone.recon.schema.tables.daos.GlobalStatsDao; import org.hadoop.ozone.recon.schema.tables.pojos.GlobalStats; +import org.jetbrains.annotations.NotNull; import org.jooq.Configuration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -80,6 +85,9 @@ public class ReconContainerMetadataManagerImpl @Inject private Configuration sqlConfiguration; + @Inject + private ReconOMMetadataManager omMetadataManager; + @Inject public ReconContainerMetadataManagerImpl(ReconDBProvider reconDBProvider, Configuration sqlConfiguration) { @@ -455,6 +463,8 @@ public Map getContainers(int limit, ContainerKeyPrefix containerKeyPrefix = keyValue.getKey(); Long containerID = containerKeyPrefix.getContainerId(); Integer numberOfKeys = keyValue.getValue(); + List pipelines = + getPipelines(containerKeyPrefix); // break the loop if limit has been reached // and one more new entity needs to be added to the containers map @@ -469,12 +479,34 @@ public Map getContainers(int limit, ContainerMetadata containerMetadata = containers.get(containerID); containerMetadata.setNumberOfKeys(containerMetadata.getNumberOfKeys() + numberOfKeys); + containerMetadata.setPipelines(pipelines); containers.put(containerID, containerMetadata); } } return containers; } + @NotNull + private List getPipelines(ContainerKeyPrefix containerKeyPrefix) + throws IOException { + OmKeyInfo omKeyInfo = omMetadataManager.getKeyTable(BucketLayout.LEGACY) + .getSkipCache(containerKeyPrefix.getKeyPrefix()); + if (null == omKeyInfo) { + omKeyInfo = + omMetadataManager.getKeyTable(BucketLayout.FILE_SYSTEM_OPTIMIZED) + .getSkipCache(containerKeyPrefix.getKeyPrefix()); + } + List pipelines = new ArrayList<>(); + if (null != omKeyInfo) { + omKeyInfo.getKeyLocationVersions().stream().map( + omKeyLocationInfoGroup -> + omKeyLocationInfoGroup.getLocationList() + .stream().map(omKeyLocationInfo -> pipelines.add( + omKeyLocationInfo.getPipeline()))); + } + return pipelines; + } + @Override public void deleteContainerMapping(ContainerKeyPrefix containerKeyPrefix) throws IOException { diff --git a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java index c383c92589d4..8625e11545e8 100644 --- a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java +++ b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java @@ -64,6 +64,7 @@ import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfo; import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfoGroup; import org.apache.hadoop.ozone.recon.ReconTestInjector; +import org.apache.hadoop.ozone.recon.api.types.ContainerDiscrepancyInfo; import org.apache.hadoop.ozone.recon.api.types.ContainerMetadata; import org.apache.hadoop.ozone.recon.api.types.ContainersResponse; import org.apache.hadoop.ozone.recon.api.types.KeyMetadata; @@ -762,4 +763,20 @@ private void createUnhealthyRecord(int id, String state, int expected, private BucketLayout getBucketLayout() { return BucketLayout.DEFAULT; } + + @Test + public void testGetContainerInsights() throws IOException, TimeoutException { + reconContainerMetadataManager.getContainers(-1, 0); + putContainerInfos(2); + List containers = reconContainerManager.getContainers(); + assertEquals(2, containers.size()); + reconContainerManager.deleteContainer(ContainerID.valueOf(1)); + Response containerInsights = containerEndpoint.getContainerInsights(); + List containerDiscrepancyInfoList = + (List) containerInsights.getEntity(); + ContainerDiscrepancyInfo containerDiscrepancyInfo = + containerDiscrepancyInfoList.get(0); + assertEquals(1, containerDiscrepancyInfo.getContainerID()); + assertEquals(1, containerDiscrepancyInfoList.size()); + } } From caf38d0017b170c65c7a177add877089bcf9807f Mon Sep 17 00:00:00 2001 From: deveshsingh Date: Fri, 31 Mar 2023 21:46:35 +0530 Subject: [PATCH 02/11] HDDS-8326. Container Level Info - OM DB Insights. --- .../ozone/recon/api/ContainerEndpoint.java | 50 +++++++- .../recon/api/TestContainerEndpoint.java | 108 ++++++++++++------ 2 files changed, 118 insertions(+), 40 deletions(-) diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java index a6e50f81abe9..c29fca2cdf85 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java @@ -41,6 +41,11 @@ import org.apache.commons.lang3.StringUtils; import org.apache.hadoop.hdds.scm.container.ContainerID; import org.apache.hadoop.hdds.scm.container.ContainerInfo; +import org.apache.hadoop.hdds.scm.container.ContainerNotFoundException; +import org.apache.hadoop.hdds.scm.pipeline.Pipeline; +import org.apache.hadoop.hdds.scm.pipeline.PipelineID; +import org.apache.hadoop.hdds.scm.pipeline.PipelineManager; +import org.apache.hadoop.hdds.scm.pipeline.PipelineNotFoundException; import org.apache.hadoop.hdds.scm.server.OzoneStorageContainerManager; import org.apache.hadoop.ozone.om.helpers.BucketLayout; import org.apache.hadoop.ozone.om.helpers.OmKeyInfo; @@ -89,6 +94,7 @@ public class ContainerEndpoint { private ReconOMMetadataManager omMetadataManager; private final ReconContainerManager containerManager; + private final PipelineManager pipelineManager; private final ContainerHealthSchemaManager containerHealthSchemaManager; @Inject @@ -96,6 +102,7 @@ public ContainerEndpoint(OzoneStorageContainerManager reconSCM, ContainerHealthSchemaManager containerHealthSchemaManager) { this.containerManager = (ReconContainerManager) reconSCM.getContainerManager(); + this.pipelineManager = reconSCM.getPipelineManager(); this.containerHealthSchemaManager = containerHealthSchemaManager; } @@ -403,7 +410,7 @@ private BucketLayout getBucketLayout() { } @GET - @Path("insights/nonscmcontainers") + @Path("insights/containermismatch") public Response getContainerInsights() { List containerDiscrepancyInfoList = new ArrayList<>(); @@ -413,13 +420,15 @@ public Response getContainerInsights() { List scmContainers = containerManager.getContainers().stream() .map(containerInfo -> containerInfo.getContainerID()).collect( Collectors.toList()); - List> notExistsAtSCMContainers = + + // Filter list of container Ids which are present in OM but not in SCM. + List> notSCMContainers = omContainers.entrySet().stream().filter(containerMetadataEntry -> !(scmContainers.contains(containerMetadataEntry.getKey()))) .collect( Collectors.toList()); - notExistsAtSCMContainers.forEach(nonSCMContainer -> { + notSCMContainers.forEach(nonSCMContainer -> { ContainerDiscrepancyInfo containerDiscrepancyInfo = new ContainerDiscrepancyInfo(); containerDiscrepancyInfo.setContainerID(nonSCMContainer.getKey()); @@ -430,14 +439,45 @@ public Response getContainerInsights() { containerDiscrepancyInfo.setExistsAt("OM"); containerDiscrepancyInfoList.add(containerDiscrepancyInfo); }); + + // Filter list of container Ids which are present in SCM but not in OM. + List nonOMContainers = scmContainers.stream() + .filter(containerId -> !omContainers.containsKey(containerId)) + .collect(Collectors.toList()); + + List pipelines = new ArrayList<>(); + nonOMContainers.forEach(nonOMContainerId -> { + ContainerDiscrepancyInfo containerDiscrepancyInfo = + new ContainerDiscrepancyInfo(); + containerDiscrepancyInfo.setContainerID(nonOMContainerId); + containerDiscrepancyInfo.setNumberOfKeys(0); + try { + PipelineID pipelineID = containerManager.getContainer( + ContainerID.valueOf(nonOMContainerId)) + .getPipelineID(); + + if (null != pipelineID) { + pipelines.add(pipelineManager.getPipeline(pipelineID)); + } + } catch (ContainerNotFoundException e) { + throw new RuntimeException(e); + } catch (PipelineNotFoundException e) { + throw new RuntimeException(e); + } + containerDiscrepancyInfo.setPipelines(pipelines); + containerDiscrepancyInfo.setExistsAt("SCM"); + containerDiscrepancyInfoList.add(containerDiscrepancyInfo); + }); + } catch (IOException ex) { throw new WebApplicationException(ex, Response.Status.INTERNAL_SERVER_ERROR); } catch (IllegalArgumentException e) { throw new WebApplicationException(e, Response.Status.BAD_REQUEST); + } catch (Exception ex) { + throw new WebApplicationException(ex, + Response.Status.INTERNAL_SERVER_ERROR); } - return Response.ok(containerDiscrepancyInfoList).build(); } - } diff --git a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java index 8625e11545e8..ef90a5423dcf 100644 --- a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java +++ b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java @@ -18,35 +18,6 @@ package org.apache.hadoop.ozone.recon.api; -import static org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.getOmKeyLocationInfo; -import static org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.getRandomPipeline; -import static org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.getTestReconOmMetadataManager; -import static org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.initializeNewOmMetadataManager; -import static org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.writeDataToOm; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.concurrent.TimeoutException; -import java.util.stream.Collectors; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Response; - import org.apache.commons.lang3.StringUtils; import org.apache.hadoop.hdds.client.BlockID; import org.apache.hadoop.hdds.client.RatisReplicationConfig; @@ -59,12 +30,15 @@ import org.apache.hadoop.hdds.scm.pipeline.Pipeline; import org.apache.hadoop.hdds.scm.pipeline.PipelineID; import org.apache.hadoop.hdds.scm.server.OzoneStorageContainerManager; +import org.apache.hadoop.hdds.utils.db.RDBBatchOperation; +import org.apache.hadoop.hdds.utils.db.Table; import org.apache.hadoop.ozone.om.OMMetadataManager; import org.apache.hadoop.ozone.om.helpers.BucketLayout; import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfo; import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfoGroup; import org.apache.hadoop.ozone.recon.ReconTestInjector; import org.apache.hadoop.ozone.recon.api.types.ContainerDiscrepancyInfo; +import org.apache.hadoop.ozone.recon.api.types.ContainerKeyPrefix; import org.apache.hadoop.ozone.recon.api.types.ContainerMetadata; import org.apache.hadoop.ozone.recon.api.types.ContainersResponse; import org.apache.hadoop.ozone.recon.api.types.KeyMetadata; @@ -73,8 +47,8 @@ import org.apache.hadoop.ozone.recon.api.types.MissingContainersResponse; import org.apache.hadoop.ozone.recon.api.types.UnhealthyContainerMetadata; import org.apache.hadoop.ozone.recon.api.types.UnhealthyContainersResponse; -import org.apache.hadoop.ozone.recon.persistence.ContainerHistory; import org.apache.hadoop.ozone.recon.persistence.ContainerHealthSchemaManager; +import org.apache.hadoop.ozone.recon.persistence.ContainerHistory; import org.apache.hadoop.ozone.recon.recovery.ReconOMMetadataManager; import org.apache.hadoop.ozone.recon.scm.ReconContainerManager; import org.apache.hadoop.ozone.recon.scm.ReconPipelineManager; @@ -84,7 +58,6 @@ import org.apache.hadoop.ozone.recon.spi.impl.OzoneManagerServiceProviderImpl; import org.apache.hadoop.ozone.recon.spi.impl.StorageContainerServiceProviderImpl; import org.apache.hadoop.ozone.recon.tasks.ContainerKeyMapperTask; -import org.apache.hadoop.hdds.utils.db.Table; import org.hadoop.ozone.recon.schema.ContainerSchemaDefinition.UnHealthyContainerStates; import org.hadoop.ozone.recon.schema.tables.pojos.UnhealthyContainers; import org.junit.Assert; @@ -92,12 +65,46 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Response; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.TimeoutException; +import java.util.stream.Collectors; + +import static org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.getOmKeyLocationInfo; +import static org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.getRandomPipeline; +import static org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.getTestReconOmMetadataManager; +import static org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.initializeNewOmMetadataManager; +import static org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.writeDataToOm; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; /** * Test for container endpoint. */ public class TestContainerEndpoint { + private static final Logger LOG = + LoggerFactory.getLogger(TestContainerEndpoint.class); + @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); @@ -765,11 +772,14 @@ private BucketLayout getBucketLayout() { } @Test - public void testGetContainerInsights() throws IOException, TimeoutException { - reconContainerMetadataManager.getContainers(-1, 0); + public void testGetContainerInsights_NonSCMContainers() + throws IOException, TimeoutException { + Map omContainers = + reconContainerMetadataManager.getContainers(-1, 0); putContainerInfos(2); - List containers = reconContainerManager.getContainers(); - assertEquals(2, containers.size()); + List scmContainers = reconContainerManager.getContainers(); + assertEquals(omContainers.size(), scmContainers.size()); + // delete container Id 1 from SCM reconContainerManager.deleteContainer(ContainerID.valueOf(1)); Response containerInsights = containerEndpoint.getContainerInsights(); List containerDiscrepancyInfoList = @@ -778,5 +788,33 @@ public void testGetContainerInsights() throws IOException, TimeoutException { containerDiscrepancyInfoList.get(0); assertEquals(1, containerDiscrepancyInfo.getContainerID()); assertEquals(1, containerDiscrepancyInfoList.size()); + assertEquals("OM", containerDiscrepancyInfo.getExistsAt()); + } + + @Test + public void testGetContainerInsights_NonOMContainers() + throws IOException, TimeoutException { + putContainerInfos(2); + List deletedContainerKeyList = + reconContainerMetadataManager.getKeyPrefixesForContainer(2).entrySet() + .stream().map(entry -> entry.getKey()).collect( + Collectors.toList()); + deletedContainerKeyList.forEach((ContainerKeyPrefix key) -> { + try (RDBBatchOperation rdbBatchOperation = new RDBBatchOperation()) { + reconContainerMetadataManager + .batchDeleteContainerMapping(rdbBatchOperation, key); + reconContainerMetadataManager.commitBatchOperation(rdbBatchOperation); + } catch (IOException e) { + LOG.error("Unable to write Container Key Prefix data in Recon DB.", e); + } + }); + Response containerInsights = containerEndpoint.getContainerInsights(); + List containerDiscrepancyInfoList = + (List) containerInsights.getEntity(); + ContainerDiscrepancyInfo containerDiscrepancyInfo = + containerDiscrepancyInfoList.get(0); + assertEquals(2, containerDiscrepancyInfo.getContainerID()); + assertEquals(1, containerDiscrepancyInfoList.size()); + assertEquals("SCM", containerDiscrepancyInfo.getExistsAt()); } } From de7d1cde44d91b86eadcbf6da0b71d8dc894393c Mon Sep 17 00:00:00 2001 From: deveshsingh Date: Fri, 31 Mar 2023 21:51:40 +0530 Subject: [PATCH 03/11] HDDS-8326. Container Level Info - OM DB Insights. --- .../apache/hadoop/ozone/recon/api/TestContainerEndpoint.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java index ef90a5423dcf..b554f43336f5 100644 --- a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java +++ b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java @@ -772,7 +772,7 @@ private BucketLayout getBucketLayout() { } @Test - public void testGetContainerInsights_NonSCMContainers() + public void testGetContainerInsightsNonSCMContainers() throws IOException, TimeoutException { Map omContainers = reconContainerMetadataManager.getContainers(-1, 0); @@ -792,7 +792,7 @@ public void testGetContainerInsights_NonSCMContainers() } @Test - public void testGetContainerInsights_NonOMContainers() + public void testGetContainerInsightsNonOMContainers() throws IOException, TimeoutException { putContainerInfos(2); List deletedContainerKeyList = From 950b756180a739d39281e2fb0401a3e7bfec1cae Mon Sep 17 00:00:00 2001 From: deveshsingh Date: Mon, 3 Apr 2023 10:18:32 +0530 Subject: [PATCH 04/11] HDDS-8326. Container Level Info - OM DB Insights. --- .../hadoop/ozone/recon/api/TestContainerEndpoint.java | 4 ++-- .../spi/impl/TestReconContainerMetadataManagerImpl.java | 8 ++++++++ .../spi/impl/TestReconNamespaceSummaryManagerImpl.java | 9 +++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java index 3a0a4703156f..e7a03c2a88ac 100644 --- a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java +++ b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java @@ -1005,7 +1005,7 @@ private BucketLayout getBucketLayout() { } @Test - public void testGetContainerInsights_NonSCMContainers() + public void testGetContainerInsightsNonSCMContainers() throws IOException, TimeoutException { Map omContainers = reconContainerMetadataManager.getContainers(-1, 0); @@ -1025,7 +1025,7 @@ public void testGetContainerInsights_NonSCMContainers() } @Test - public void testGetContainerInsights_NonOMContainers() + public void testGetContainerInsightsNonOMContainers() throws IOException, TimeoutException { putContainerInfos(2); List deletedContainerKeyList = diff --git a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/spi/impl/TestReconContainerMetadataManagerImpl.java b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/spi/impl/TestReconContainerMetadataManagerImpl.java index d0184df9bee0..1c744409b9ff 100644 --- a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/spi/impl/TestReconContainerMetadataManagerImpl.java +++ b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/spi/impl/TestReconContainerMetadataManagerImpl.java @@ -18,6 +18,8 @@ package org.apache.hadoop.ozone.recon.spi.impl; +import static org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.getTestReconOmMetadataManager; +import static org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.initializeNewOmMetadataManager; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; @@ -31,6 +33,7 @@ import org.apache.hadoop.ozone.recon.api.types.ContainerKeyPrefix; import org.apache.hadoop.ozone.recon.api.types.ContainerMetadata; import org.apache.hadoop.ozone.recon.api.types.KeyPrefixContainer; +import org.apache.hadoop.ozone.recon.recovery.ReconOMMetadataManager; import org.apache.hadoop.ozone.recon.spi.ReconContainerMetadataManager; import org.junit.Assert; import org.junit.Before; @@ -47,6 +50,7 @@ public class TestReconContainerMetadataManagerImpl { @ClassRule public static final TemporaryFolder TEMP_FOLDER = new TemporaryFolder(); private static ReconContainerMetadataManager reconContainerMetadataManager; + private static ReconOMMetadataManager reconOMMetadataManager; private String keyPrefix1 = "V3/B1/K1"; private String keyPrefix2 = "V3/B1/K2"; @@ -54,10 +58,14 @@ public class TestReconContainerMetadataManagerImpl { @BeforeClass public static void setupOnce() throws Exception { + reconOMMetadataManager = getTestReconOmMetadataManager( + initializeNewOmMetadataManager(TEMP_FOLDER.newFolder()), + TEMP_FOLDER.newFolder()); ReconTestInjector reconTestInjector = new ReconTestInjector.Builder(TEMP_FOLDER) .withReconSqlDb() .withContainerDB() + .withReconOm(reconOMMetadataManager) .build(); reconContainerMetadataManager = reconTestInjector.getInstance(ReconContainerMetadataManager.class); diff --git a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/spi/impl/TestReconNamespaceSummaryManagerImpl.java b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/spi/impl/TestReconNamespaceSummaryManagerImpl.java index 8b10ab59b91a..60f52bab228f 100644 --- a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/spi/impl/TestReconNamespaceSummaryManagerImpl.java +++ b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/spi/impl/TestReconNamespaceSummaryManagerImpl.java @@ -21,6 +21,7 @@ import org.apache.hadoop.hdds.utils.db.RDBBatchOperation; import org.apache.hadoop.ozone.recon.ReconTestInjector; import org.apache.hadoop.ozone.recon.api.types.NSSummary; +import org.apache.hadoop.ozone.recon.recovery.ReconOMMetadataManager; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; @@ -35,6 +36,9 @@ import java.util.Map; import java.util.Set; +import static org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.getTestReconOmMetadataManager; +import static org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.initializeNewOmMetadataManager; + /** * Test for NSSummary manager. */ @@ -42,15 +46,20 @@ public class TestReconNamespaceSummaryManagerImpl { @ClassRule public static final TemporaryFolder TEMP_FOLDER = new TemporaryFolder(); private static ReconNamespaceSummaryManagerImpl reconNamespaceSummaryManager; + private static ReconOMMetadataManager reconOMMetadataManager; private static int[] testBucket; private static final Set TEST_CHILD_DIR = new HashSet<>(Arrays.asList(new Long[]{1L, 2L, 3L})); @BeforeClass public static void setupOnce() throws Exception { + reconOMMetadataManager = getTestReconOmMetadataManager( + initializeNewOmMetadataManager(TEMP_FOLDER.newFolder()), + TEMP_FOLDER.newFolder()); ReconTestInjector reconTestInjector = new ReconTestInjector.Builder(TEMP_FOLDER) .withReconSqlDb() + .withReconOm(reconOMMetadataManager) .withContainerDB() .build(); reconNamespaceSummaryManager = reconTestInjector.getInstance( From f65812717135ad2778931bd2230fa95995c3c50b Mon Sep 17 00:00:00 2001 From: deveshsingh Date: Wed, 5 Apr 2023 20:27:15 +0530 Subject: [PATCH 05/11] HDDS-8326. Container Level Info - OM DB Insights. --- .../hadoop/ozone/recon/api/ContainerEndpoint.java | 10 ++++++---- .../hadoop/ozone/recon/api/TestContainerEndpoint.java | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java index cb66c6c81eca..a7fa82204420 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java @@ -428,7 +428,7 @@ private BucketLayout getBucketLayout() { @GET @Path("insights/containermismatch") - public Response getContainerInsights() { + public Response getContainerMisMatchInsights() { List containerDiscrepancyInfoList = new ArrayList<>(); try { @@ -468,8 +468,9 @@ public Response getContainerInsights() { new ContainerDiscrepancyInfo(); containerDiscrepancyInfo.setContainerID(nonOMContainerId); containerDiscrepancyInfo.setNumberOfKeys(0); + PipelineID pipelineID = null; try { - PipelineID pipelineID = containerManager.getContainer( + pipelineID = containerManager.getContainer( ContainerID.valueOf(nonOMContainerId)) .getPipelineID(); @@ -477,9 +478,10 @@ public Response getContainerInsights() { pipelines.add(pipelineManager.getPipeline(pipelineID)); } } catch (ContainerNotFoundException e) { - throw new RuntimeException(e); + LOG.warn("Container {} not found in SCM: {}", nonOMContainerId, e); } catch (PipelineNotFoundException e) { - throw new RuntimeException(e); + LOG.debug("Pipeline not found for container: {} and pipelineId: {}", + nonOMContainerId, pipelineID, e); } containerDiscrepancyInfo.setPipelines(pipelines); containerDiscrepancyInfo.setExistsAt("SCM"); diff --git a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java index e7a03c2a88ac..cf7b14a534c3 100644 --- a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java +++ b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java @@ -1014,7 +1014,7 @@ public void testGetContainerInsightsNonSCMContainers() assertEquals(omContainers.size(), scmContainers.size()); // delete container Id 1 from SCM reconContainerManager.deleteContainer(ContainerID.valueOf(1)); - Response containerInsights = containerEndpoint.getContainerInsights(); + Response containerInsights = containerEndpoint.getContainerMisMatchInsights(); List containerDiscrepancyInfoList = (List) containerInsights.getEntity(); ContainerDiscrepancyInfo containerDiscrepancyInfo = @@ -1041,7 +1041,7 @@ public void testGetContainerInsightsNonOMContainers() LOG.error("Unable to write Container Key Prefix data in Recon DB.", e); } }); - Response containerInsights = containerEndpoint.getContainerInsights(); + Response containerInsights = containerEndpoint.getContainerMisMatchInsights(); List containerDiscrepancyInfoList = (List) containerInsights.getEntity(); ContainerDiscrepancyInfo containerDiscrepancyInfo = From 2fd3e9de6ae2910a291be5cd20818dfaa94d8d0e Mon Sep 17 00:00:00 2001 From: deveshsingh Date: Wed, 5 Apr 2023 23:05:10 +0530 Subject: [PATCH 06/11] HDDS-8326. Container Level Info - OM DB Insights. --- .../hadoop/ozone/recon/api/TestContainerEndpoint.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java index cf7b14a534c3..6c446bd70b4c 100644 --- a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java +++ b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java @@ -1014,7 +1014,8 @@ public void testGetContainerInsightsNonSCMContainers() assertEquals(omContainers.size(), scmContainers.size()); // delete container Id 1 from SCM reconContainerManager.deleteContainer(ContainerID.valueOf(1)); - Response containerInsights = containerEndpoint.getContainerMisMatchInsights(); + Response containerInsights = + containerEndpoint.getContainerMisMatchInsights(); List containerDiscrepancyInfoList = (List) containerInsights.getEntity(); ContainerDiscrepancyInfo containerDiscrepancyInfo = @@ -1041,7 +1042,8 @@ public void testGetContainerInsightsNonOMContainers() LOG.error("Unable to write Container Key Prefix data in Recon DB.", e); } }); - Response containerInsights = containerEndpoint.getContainerMisMatchInsights(); + Response containerInsights = + containerEndpoint.getContainerMisMatchInsights(); List containerDiscrepancyInfoList = (List) containerInsights.getEntity(); ContainerDiscrepancyInfo containerDiscrepancyInfo = From 5400a7106e7c48c3aefd0518ce20ba6e1a624e78 Mon Sep 17 00:00:00 2001 From: deveshsingh Date: Mon, 24 Apr 2023 09:54:17 +0530 Subject: [PATCH 07/11] HDDS-8326. Container Level Info - OM DB Insights. --- .../org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java index a7fa82204420..3bec87e1a050 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java @@ -427,7 +427,7 @@ private BucketLayout getBucketLayout() { } @GET - @Path("insights/containermismatch") + @Path("/mismatch") public Response getContainerMisMatchInsights() { List containerDiscrepancyInfoList = new ArrayList<>(); From f15b19c82ca672c7011002f5cb1a5aec94e1646b Mon Sep 17 00:00:00 2001 From: deveshsingh Date: Fri, 28 Apr 2023 16:17:11 +0530 Subject: [PATCH 08/11] HDDS-8326. Container Level Info - OM DB Insights. --- .../ozone/recon/api/ContainerEndpoint.java | 62 +++++++++-------- .../recon/api/TestContainerEndpoint.java | 68 +++++++++---------- 2 files changed, 69 insertions(+), 61 deletions(-) diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java index 3bec87e1a050..c3b54365b31d 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java @@ -17,28 +17,8 @@ */ package org.apache.hadoop.ozone.recon.api; -import java.io.IOException; -import java.time.Instant; -import java.util.Collection; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.stream.Collectors; - -import javax.ws.rs.DefaultValue; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; - -import javax.inject.Inject; import org.apache.commons.lang3.StringUtils; +import org.apache.hadoop.hdds.protocol.proto.HddsProtos; import org.apache.hadoop.hdds.scm.container.ContainerID; import org.apache.hadoop.hdds.scm.container.ContainerInfo; import org.apache.hadoop.hdds.scm.container.ContainerNotFoundException; @@ -56,15 +36,15 @@ import org.apache.hadoop.ozone.recon.api.types.ContainerMetadata; import org.apache.hadoop.ozone.recon.api.types.ContainersResponse; import org.apache.hadoop.ozone.recon.api.types.KeyMetadata; +import org.apache.hadoop.ozone.recon.api.types.KeyMetadata.ContainerBlockMetadata; import org.apache.hadoop.ozone.recon.api.types.KeysResponse; import org.apache.hadoop.ozone.recon.api.types.MissingContainerMetadata; import org.apache.hadoop.ozone.recon.api.types.MissingContainersResponse; import org.apache.hadoop.ozone.recon.api.types.UnhealthyContainerMetadata; -import org.apache.hadoop.ozone.recon.api.types.UnhealthyContainersSummary; import org.apache.hadoop.ozone.recon.api.types.UnhealthyContainersResponse; -import org.apache.hadoop.ozone.recon.api.types.KeyMetadata.ContainerBlockMetadata; -import org.apache.hadoop.ozone.recon.persistence.ContainerHistory; +import org.apache.hadoop.ozone.recon.api.types.UnhealthyContainersSummary; import org.apache.hadoop.ozone.recon.persistence.ContainerHealthSchemaManager; +import org.apache.hadoop.ozone.recon.persistence.ContainerHistory; import org.apache.hadoop.ozone.recon.recovery.ReconOMMetadataManager; import org.apache.hadoop.ozone.recon.scm.ReconContainerManager; import org.apache.hadoop.ozone.recon.spi.ReconContainerMetadataManager; @@ -74,6 +54,26 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.inject.Inject; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import java.io.IOException; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.stream.Collectors; + import static org.apache.hadoop.ozone.recon.ReconConstants.DEFAULT_BATCH_NUMBER; import static org.apache.hadoop.ozone.recon.ReconConstants.DEFAULT_FETCH_COUNT; import static org.apache.hadoop.ozone.recon.ReconConstants.PREV_CONTAINER_ID_DEFAULT_VALUE; @@ -434,14 +434,22 @@ public Response getContainerMisMatchInsights() { try { Map omContainers = reconContainerMetadataManager.getContainers(-1, -1); - List scmContainers = containerManager.getContainers().stream() + List scmAllContainers = containerManager.getContainers().stream() + .filter(containerInfo -> !(containerInfo.getState() == + HddsProtos.LifeCycleState.DELETED)) .map(containerInfo -> containerInfo.getContainerID()).collect( Collectors.toList()); + List scmNonDeletedContainers = + containerManager.getContainers().stream() + .filter(containerInfo -> !(containerInfo.getState() == + HddsProtos.LifeCycleState.DELETED)) + .map(containerInfo -> containerInfo.getContainerID()).collect( + Collectors.toList()); // Filter list of container Ids which are present in OM but not in SCM. List> notSCMContainers = omContainers.entrySet().stream().filter(containerMetadataEntry -> - !(scmContainers.contains(containerMetadataEntry.getKey()))) + !(scmAllContainers.contains(containerMetadataEntry.getKey()))) .collect( Collectors.toList()); @@ -458,7 +466,7 @@ public Response getContainerMisMatchInsights() { }); // Filter list of container Ids which are present in SCM but not in OM. - List nonOMContainers = scmContainers.stream() + List nonOMContainers = scmNonDeletedContainers.stream() .filter(containerId -> !omContainers.containsKey(containerId)) .collect(Collectors.toList()); diff --git a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java index 6c446bd70b4c..3eb105dfdbef 100644 --- a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java +++ b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestContainerEndpoint.java @@ -18,36 +18,6 @@ package org.apache.hadoop.ozone.recon.api; -import static org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.getOmKeyLocationInfo; -import static org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.getRandomPipeline; -import static org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.getTestReconOmMetadataManager; -import static org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.initializeNewOmMetadataManager; -import static org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.writeDataToOm; -import static org.junit.Assert.assertNotNull; -import static org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.writeKeyToOm; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.concurrent.TimeoutException; -import java.util.stream.Collectors; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Response; - import org.apache.commons.lang3.StringUtils; import org.apache.hadoop.hdds.client.BlockID; import org.apache.hadoop.hdds.client.RatisReplicationConfig; @@ -61,13 +31,14 @@ import org.apache.hadoop.hdds.scm.pipeline.PipelineID; import org.apache.hadoop.hdds.scm.server.OzoneStorageContainerManager; import org.apache.hadoop.hdds.utils.db.RDBBatchOperation; +import org.apache.hadoop.hdds.utils.db.Table; import org.apache.hadoop.ozone.om.OMMetadataManager; -import org.apache.hadoop.ozone.om.helpers.OmDirectoryInfo; import org.apache.hadoop.ozone.om.helpers.BucketLayout; -import org.apache.hadoop.ozone.om.helpers.OmVolumeArgs; import org.apache.hadoop.ozone.om.helpers.OmBucketInfo; +import org.apache.hadoop.ozone.om.helpers.OmDirectoryInfo; import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfo; import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfoGroup; +import org.apache.hadoop.ozone.om.helpers.OmVolumeArgs; import org.apache.hadoop.ozone.recon.ReconTestInjector; import org.apache.hadoop.ozone.recon.api.types.ContainerDiscrepancyInfo; import org.apache.hadoop.ozone.recon.api.types.ContainerKeyPrefix; @@ -79,8 +50,8 @@ import org.apache.hadoop.ozone.recon.api.types.MissingContainersResponse; import org.apache.hadoop.ozone.recon.api.types.UnhealthyContainerMetadata; import org.apache.hadoop.ozone.recon.api.types.UnhealthyContainersResponse; -import org.apache.hadoop.ozone.recon.persistence.ContainerHistory; import org.apache.hadoop.ozone.recon.persistence.ContainerHealthSchemaManager; +import org.apache.hadoop.ozone.recon.persistence.ContainerHistory; import org.apache.hadoop.ozone.recon.recovery.ReconOMMetadataManager; import org.apache.hadoop.ozone.recon.scm.ReconContainerManager; import org.apache.hadoop.ozone.recon.scm.ReconPipelineManager; @@ -90,7 +61,6 @@ import org.apache.hadoop.ozone.recon.spi.impl.OzoneManagerServiceProviderImpl; import org.apache.hadoop.ozone.recon.spi.impl.StorageContainerServiceProviderImpl; import org.apache.hadoop.ozone.recon.tasks.ContainerKeyMapperTask; -import org.apache.hadoop.hdds.utils.db.Table; import org.hadoop.ozone.recon.schema.ContainerSchemaDefinition.UnHealthyContainerStates; import org.hadoop.ozone.recon.schema.tables.pojos.UnhealthyContainers; import org.junit.Assert; @@ -101,6 +71,36 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Response; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.TimeoutException; +import java.util.stream.Collectors; + +import static org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.getOmKeyLocationInfo; +import static org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.getRandomPipeline; +import static org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.getTestReconOmMetadataManager; +import static org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.initializeNewOmMetadataManager; +import static org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.writeDataToOm; +import static org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.writeKeyToOm; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + /** * Test for container endpoint. */ From f6645446a12f1d9e120b703fdad5ed8316e2a151 Mon Sep 17 00:00:00 2001 From: deveshsingh Date: Fri, 28 Apr 2023 19:55:47 +0530 Subject: [PATCH 09/11] HDDS-8326. Container Level Info - OM DB Insights. --- .../org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java index c3b54365b31d..3efdf8b892a9 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java @@ -435,8 +435,6 @@ public Response getContainerMisMatchInsights() { Map omContainers = reconContainerMetadataManager.getContainers(-1, -1); List scmAllContainers = containerManager.getContainers().stream() - .filter(containerInfo -> !(containerInfo.getState() == - HddsProtos.LifeCycleState.DELETED)) .map(containerInfo -> containerInfo.getContainerID()).collect( Collectors.toList()); List scmNonDeletedContainers = From dc93c636c3874172b8fe072c1b3816b903270c67 Mon Sep 17 00:00:00 2001 From: deveshsingh Date: Mon, 8 May 2023 09:45:30 +0530 Subject: [PATCH 10/11] HDDS-8326. Container Level Info - OM DB Insights. --- .../apache/hadoop/ozone/recon/api/ContainerEndpoint.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java index d3903d0a5808..5990435b6c0e 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ContainerEndpoint.java @@ -497,9 +497,6 @@ public Response getContainerMisMatchInsights() { try { Map omContainers = reconContainerMetadataManager.getContainers(-1, -1); - List scmAllContainers = containerManager.getContainers().stream() - .map(containerInfo -> containerInfo.getContainerID()).collect( - Collectors.toList()); List scmNonDeletedContainers = containerManager.getContainers().stream() .filter(containerInfo -> !(containerInfo.getState() == @@ -510,7 +507,8 @@ public Response getContainerMisMatchInsights() { // Filter list of container Ids which are present in OM but not in SCM. List> notSCMContainers = omContainers.entrySet().stream().filter(containerMetadataEntry -> - !(scmAllContainers.contains(containerMetadataEntry.getKey()))) + !(scmNonDeletedContainers.contains( + containerMetadataEntry.getKey()))) .collect( Collectors.toList()); From 13639c084d7ed7e46acedf3a01a9181379b2f861 Mon Sep 17 00:00:00 2001 From: deveshsingh Date: Tue, 9 May 2023 20:48:02 +0530 Subject: [PATCH 11/11] HDDS-8326. Container Level Info - OM DB Insights. --- .../api/types/ContainerDiscrepancyInfo.java | 25 ------------------- 1 file changed, 25 deletions(-) diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/ContainerDiscrepancyInfo.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/ContainerDiscrepancyInfo.java index c1fa619bd01a..33702bf3a050 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/ContainerDiscrepancyInfo.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/ContainerDiscrepancyInfo.java @@ -17,7 +17,6 @@ */ package org.apache.hadoop.ozone.recon.api.types; -import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import org.apache.hadoop.hdds.scm.pipeline.Pipeline; @@ -31,14 +30,6 @@ public class ContainerDiscrepancyInfo { @JsonProperty("containerId") private long containerID; - @JsonProperty("omContainerState") - @JsonInclude(JsonInclude.Include.NON_EMPTY) - private long omContainerState; - - @JsonProperty("scmContainerState") - @JsonInclude(JsonInclude.Include.NON_EMPTY) - private long scmContainerState; - @JsonProperty("numberOfKeys") private long numberOfKeys; @@ -68,22 +59,6 @@ public void setNumberOfKeys(long numberOfKeys) { this.numberOfKeys = numberOfKeys; } - public long getOmContainerState() { - return omContainerState; - } - - public void setOmContainerState(long omContainerState) { - this.omContainerState = omContainerState; - } - - public long getScmContainerState() { - return scmContainerState; - } - - public void setScmContainerState(long scmContainerState) { - this.scmContainerState = scmContainerState; - } - public List getPipelines() { return pipelines; }