diff --git a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/ShortCodec.java b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/ShortCodec.java new file mode 100644 index 000000000000..a7c4c068ef60 --- /dev/null +++ b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/ShortCodec.java @@ -0,0 +1,43 @@ +/** + * 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.hdds.utils.db; + +import java.io.IOException; +import com.google.common.primitives.Shorts; + +/** + * Codec to convert Short to/from byte array. + */ +public class ShortCodec implements Codec { + + @Override + public byte[] toPersistedFormat(Short object) throws IOException { + return Shorts.toByteArray(object); + } + + @Override + public Short fromPersistedFormat(byte[] rawData) throws IOException { + return Shorts.fromByteArray(rawData); + } + + @Override + public Short copyObject(Short object) { + return object; + } +} 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 8123410344e6..14ec9ff0cd19 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 @@ -38,7 +38,7 @@ import org.apache.hadoop.ozone.om.OMConfigKeys; import org.apache.hadoop.ozone.om.OzoneManager; import org.apache.hadoop.ozone.recon.api.types.ContainerKeyPrefix; -import org.apache.hadoop.ozone.recon.spi.ContainerDBServiceProvider; +import org.apache.hadoop.ozone.recon.spi.ReconContainerMetadataManager; import org.apache.hadoop.ozone.recon.spi.impl.OzoneManagerServiceProviderImpl; import org.apache.ozone.test.GenericTestUtils; import org.junit.After; @@ -130,10 +130,10 @@ public void testReconGetsSnapshotFromLeader() throws Exception { // Sync data to Recon impl.syncDataFromOM(); - ContainerDBServiceProvider containerDBServiceProvider = - cluster.getReconServer().getContainerDBServiceProvider(); + ReconContainerMetadataManager reconContainerMetadataManager = + cluster.getReconServer().getReconContainerMetadataManager(); TableIterator iterator = - containerDBServiceProvider.getContainerTableIterator(); + reconContainerMetadataManager.getContainerTableIterator(); String reconKeyPrefix = null; while (iterator.hasNext()) { Table.KeyValue keyValue = diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconConstants.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconConstants.java index 0cbc61fa2459..2eeb3235af32 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconConstants.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconConstants.java @@ -58,4 +58,11 @@ private ReconConstants() { + PIPELINE_DB_SUFFIX; public static final String RECON_SCM_NODE_DB = "recon-node.db"; + // 1125899906842624L = 1PB + public static final long MAX_FILE_SIZE_UPPER_BOUND = 1125899906842624L; + public static final long MIN_FILE_SIZE_UPPER_BOUND = 1024L; + // 41 bins + public static final int NUM_OF_BINS = (int) Math.ceil(Math.log( + (double) MAX_FILE_SIZE_UPPER_BOUND / MIN_FILE_SIZE_UPPER_BOUND) / + Math.log(2)) + 1; } diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconControllerModule.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconControllerModule.java index 8ddc8acd5dd0..27c407e7d1da 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconControllerModule.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconControllerModule.java @@ -26,7 +26,6 @@ import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.hdds.scm.protocol.StorageContainerLocationProtocol; import org.apache.hadoop.hdds.scm.server.OzoneStorageContainerManager; -import org.apache.hadoop.hdds.utils.db.DBStore; import org.apache.hadoop.ozone.om.OMMetadataManager; import org.apache.hadoop.ozone.om.protocol.OzoneManagerProtocol; import org.apache.hadoop.ozone.om.protocolPB.OmTransport; @@ -38,12 +37,14 @@ import org.apache.hadoop.ozone.recon.recovery.ReconOMMetadataManager; import org.apache.hadoop.ozone.recon.recovery.ReconOmMetadataManagerImpl; import org.apache.hadoop.ozone.recon.scm.ReconStorageContainerManagerFacade; -import org.apache.hadoop.ozone.recon.spi.ContainerDBServiceProvider; +import org.apache.hadoop.ozone.recon.spi.ReconContainerMetadataManager; import org.apache.hadoop.ozone.recon.spi.OzoneManagerServiceProvider; +import org.apache.hadoop.ozone.recon.spi.ReconNamespaceSummaryManager; import org.apache.hadoop.ozone.recon.spi.StorageContainerServiceProvider; -import org.apache.hadoop.ozone.recon.spi.impl.ContainerDBServiceProviderImpl; +import org.apache.hadoop.ozone.recon.spi.impl.ReconContainerMetadataManagerImpl; import org.apache.hadoop.ozone.recon.spi.impl.OzoneManagerServiceProviderImpl; -import org.apache.hadoop.ozone.recon.spi.impl.ReconContainerDBProvider; +import org.apache.hadoop.ozone.recon.spi.impl.ReconDBProvider; +import org.apache.hadoop.ozone.recon.spi.impl.ReconNamespaceSummaryManagerImpl; import org.apache.hadoop.ozone.recon.spi.impl.StorageContainerServiceProviderImpl; import org.apache.hadoop.ozone.recon.tasks.ContainerKeyMapperTask; import org.apache.hadoop.ozone.recon.tasks.FileSizeCountTask; @@ -85,15 +86,16 @@ public class ReconControllerModule extends AbstractModule { protected void configure() { bind(OzoneConfiguration.class).toProvider(ConfigurationProvider.class); bind(ReconHttpServer.class).in(Singleton.class); - bind(DBStore.class) - .toProvider(ReconContainerDBProvider.class).in(Singleton.class); + bind(ReconDBProvider.class).in(Singleton.class); bind(ReconOMMetadataManager.class) .to(ReconOmMetadataManagerImpl.class); bind(OMMetadataManager.class).to(ReconOmMetadataManagerImpl.class); bind(ContainerHealthSchemaManager.class).in(Singleton.class); - bind(ContainerDBServiceProvider.class) - .to(ContainerDBServiceProviderImpl.class).in(Singleton.class); + bind(ReconContainerMetadataManager.class) + .to(ReconContainerMetadataManagerImpl.class).in(Singleton.class); + bind(ReconNamespaceSummaryManager.class) + .to(ReconNamespaceSummaryManagerImpl.class).in(Singleton.class); bind(OzoneManagerServiceProvider.class) .to(OzoneManagerServiceProviderImpl.class).in(Singleton.class); bind(ReconUtils.class).in(Singleton.class); diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconServer.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconServer.java index c2b1c5fdd1bd..c9030c0d3906 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconServer.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconServer.java @@ -29,9 +29,11 @@ import org.apache.hadoop.hdds.scm.server.OzoneStorageContainerManager; import org.apache.hadoop.hdds.utils.HddsServerUtil; import org.apache.hadoop.ozone.OzoneSecurityUtil; -import org.apache.hadoop.ozone.recon.spi.ContainerDBServiceProvider; +import org.apache.hadoop.ozone.recon.spi.ReconContainerMetadataManager; import org.apache.hadoop.ozone.recon.spi.OzoneManagerServiceProvider; +import org.apache.hadoop.ozone.recon.spi.ReconNamespaceSummaryManager; import org.apache.hadoop.ozone.recon.spi.StorageContainerServiceProvider; +import org.apache.hadoop.ozone.recon.spi.impl.ReconDBProvider; import org.apache.hadoop.ozone.util.OzoneVersionInfo; import org.apache.hadoop.security.SecurityUtil; import org.apache.hadoop.security.UserGroupInformation; @@ -56,8 +58,10 @@ public class ReconServer extends GenericCli { private Injector injector; private ReconHttpServer httpServer; - private ContainerDBServiceProvider containerDBServiceProvider; + private ReconContainerMetadataManager reconContainerMetadataManager; private OzoneManagerServiceProvider ozoneManagerServiceProvider; + private ReconDBProvider reconDBProvider; + private ReconNamespaceSummaryManager reconNamespaceSummaryManager; private OzoneStorageContainerManager reconStorageContainerManager; private OzoneConfiguration configuration; @@ -93,8 +97,11 @@ protected void configureServlets() { LOG.info("Initializing Recon server..."); try { loginReconUserIfSecurityEnabled(configuration); - this.containerDBServiceProvider = - injector.getInstance(ContainerDBServiceProvider.class); + this.reconDBProvider = injector.getInstance(ReconDBProvider.class); + this.reconContainerMetadataManager = + injector.getInstance(ReconContainerMetadataManager.class); + this.reconNamespaceSummaryManager = + injector.getInstance(ReconNamespaceSummaryManager.class); ReconSchemaManager reconSchemaManager = injector.getInstance(ReconSchemaManager.class); @@ -159,8 +166,8 @@ public void stop() throws Exception { if (ozoneManagerServiceProvider != null) { ozoneManagerServiceProvider.stop(); } - if (containerDBServiceProvider != null) { - containerDBServiceProvider.close(); + if (reconDBProvider != null) { + reconDBProvider.close(); } isStarted = false; } @@ -234,8 +241,8 @@ public StorageContainerServiceProvider getStorageContainerServiceProvider() { } @VisibleForTesting - public ContainerDBServiceProvider getContainerDBServiceProvider() { - return containerDBServiceProvider; + public ReconContainerMetadataManager getReconContainerMetadataManager() { + return reconContainerMetadataManager; } @VisibleForTesting 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 93f41fc7f5f9..8f3ad94ae35f 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 @@ -59,7 +59,7 @@ import org.apache.hadoop.ozone.recon.persistence.ContainerHealthSchemaManager; import org.apache.hadoop.ozone.recon.recovery.ReconOMMetadataManager; import org.apache.hadoop.ozone.recon.scm.ReconContainerManager; -import org.apache.hadoop.ozone.recon.spi.ContainerDBServiceProvider; +import org.apache.hadoop.ozone.recon.spi.ReconContainerMetadataManager; import org.hadoop.ozone.recon.schema.ContainerSchemaDefinition.UnHealthyContainerStates; import org.hadoop.ozone.recon.schema.tables.pojos.UnhealthyContainers; @@ -79,7 +79,7 @@ public class ContainerEndpoint { @Inject - private ContainerDBServiceProvider containerDBServiceProvider; + private ReconContainerMetadataManager reconContainerMetadataManager; @Inject private ReconOMMetadataManager omMetadataManager; @@ -113,8 +113,9 @@ public Response getContainers( Map containersMap; long containersCount; try { - containersMap = containerDBServiceProvider.getContainers(limit, prevKey); - containersCount = containerDBServiceProvider.getCountForContainers(); + containersMap = + reconContainerMetadataManager.getContainers(limit, prevKey); + containersCount = reconContainerMetadataManager.getCountForContainers(); } catch (IOException ioEx) { throw new WebApplicationException(ioEx, Response.Status.INTERNAL_SERVER_ERROR); @@ -147,7 +148,7 @@ public Response getKeysForContainer( long totalCount; try { Map containerKeyPrefixMap = - containerDBServiceProvider.getKeyPrefixesForContainer(containerID, + reconContainerMetadataManager.getKeyPrefixesForContainer(containerID, prevKeyPrefix); // Get set of Container-Key mappings for given containerId. @@ -204,7 +205,7 @@ public Response getKeysForContainer( } totalCount = - containerDBServiceProvider.getKeyCountForContainer(containerID); + reconContainerMetadataManager.getKeyCountForContainer(containerID); } catch (IOException ioEx) { throw new WebApplicationException(ioEx, Response.Status.INTERNAL_SERVER_ERROR); diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/NSSummary.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/NSSummary.java new file mode 100644 index 000000000000..86eabd3f1f20 --- /dev/null +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/NSSummary.java @@ -0,0 +1,70 @@ +/* + * 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 org.apache.hadoop.ozone.recon.ReconConstants; + +import java.util.Arrays; + +/** + * Class to encapsulate namespace metadata summaries from OM. + */ + +public class NSSummary { + private int numOfFiles; + private int sizeOfFiles; + private int[] fileSizeBucket; + + public NSSummary() { + this.numOfFiles = 0; + this.sizeOfFiles = 0; + this.fileSizeBucket = new int[ReconConstants.NUM_OF_BINS]; + } + + public NSSummary(int numOfFiles, int sizeOfFiles, int[] bucket) { + this.numOfFiles = numOfFiles; + this.sizeOfFiles = sizeOfFiles; + setFileSizeBucket(bucket); + } + + public int getNumOfFiles() { + return numOfFiles; + } + + public int getSizeOfFiles() { + return sizeOfFiles; + } + + public int[] getFileSizeBucket() { + return Arrays.copyOf(this.fileSizeBucket, ReconConstants.NUM_OF_BINS); + } + + public void setNumOfFiles(int numOfFiles) { + this.numOfFiles = numOfFiles; + } + + public void setSizeOfFiles(int sizeOfFiles) { + this.sizeOfFiles = sizeOfFiles; + } + + public void setFileSizeBucket(int[] fileSizeBucket) { + this.fileSizeBucket = Arrays.copyOf( + fileSizeBucket, ReconConstants.NUM_OF_BINS); + } +} diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/codec/NSSummaryCodec.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/codec/NSSummaryCodec.java new file mode 100644 index 000000000000..389434556b6f --- /dev/null +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/codec/NSSummaryCodec.java @@ -0,0 +1,81 @@ +/* + * 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.codec; + +import org.apache.hadoop.hdds.utils.db.IntegerCodec; +import org.apache.hadoop.hdds.utils.db.ShortCodec; +import org.apache.hadoop.ozone.recon.ReconConstants; +import org.apache.hadoop.ozone.recon.api.types.NSSummary; +import org.apache.hadoop.hdds.utils.db.Codec; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.IOException; + +/** + * Codec for Namespace Summary. + */ +public class NSSummaryCodec implements Codec { + + private final Codec integerCodec = new IntegerCodec(); + private final Codec shortCodec = new ShortCodec(); + // 2 int fields + 41-length int array + private static final int NUM_OF_INTS = 2 + ReconConstants.NUM_OF_BINS; + + @Override + public byte[] toPersistedFormat(NSSummary object) throws IOException { + final int sizeOfRes = NUM_OF_INTS * Integer.BYTES + Short.BYTES; + ByteArrayOutputStream out = new ByteArrayOutputStream(sizeOfRes); + out.write(integerCodec.toPersistedFormat(object.getNumOfFiles())); + out.write(integerCodec.toPersistedFormat(object.getSizeOfFiles())); + out.write(shortCodec.toPersistedFormat((short)ReconConstants.NUM_OF_BINS)); + int[] fileSizeBucket = object.getFileSizeBucket(); + for (int i = 0; i < ReconConstants.NUM_OF_BINS; ++i) { + out.write(integerCodec.toPersistedFormat(fileSizeBucket[i])); + } + return out.toByteArray(); + } + + @Override + public NSSummary fromPersistedFormat(byte[] rawData) throws IOException { + assert(rawData.length == NUM_OF_INTS * Integer.BYTES + Short.BYTES); + DataInputStream in = new DataInputStream(new ByteArrayInputStream(rawData)); + NSSummary res = new NSSummary(); + res.setNumOfFiles(in.readInt()); + res.setSizeOfFiles(in.readInt()); + short len = in.readShort(); + assert(len == (short) ReconConstants.NUM_OF_BINS); + int[] fileSizeBucket = new int[len]; + for (int i = 0; i < len; ++i) { + fileSizeBucket[i] = in.readInt(); + } + res.setFileSizeBucket(fileSizeBucket); + return res; + } + + @Override + public NSSummary copyObject(NSSummary object) { + NSSummary copy = new NSSummary(); + copy.setNumOfFiles(object.getNumOfFiles()); + copy.setSizeOfFiles(object.getSizeOfFiles()); + copy.setFileSizeBucket(object.getFileSizeBucket()); + return copy; + } +} diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconContainerManager.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconContainerManager.java index e2958938623d..215ceb1d5f71 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconContainerManager.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconContainerManager.java @@ -50,7 +50,7 @@ import org.apache.hadoop.hdds.utils.db.Table; import org.apache.hadoop.ozone.recon.persistence.ContainerHistory; import org.apache.hadoop.ozone.recon.persistence.ContainerHealthSchemaManager; -import org.apache.hadoop.ozone.recon.spi.ContainerDBServiceProvider; +import org.apache.hadoop.ozone.recon.spi.ReconContainerMetadataManager; import org.apache.hadoop.ozone.recon.spi.StorageContainerServiceProvider; import org.slf4j.Logger; @@ -66,7 +66,7 @@ public class ReconContainerManager extends ContainerManagerImpl { private StorageContainerServiceProvider scmClient; private PipelineManager pipelineManager; private final ContainerHealthSchemaManager containerHealthSchemaManager; - private final ContainerDBServiceProvider cdbServiceProvider; + private final ReconContainerMetadataManager cdbServiceProvider; private final Table nodeDB; // Container ID -> Datanode UUID -> Timestamp private final Map> replicaHistoryMap; @@ -91,7 +91,7 @@ public ReconContainerManager( PipelineManager pipelineManager, StorageContainerServiceProvider scm, ContainerHealthSchemaManager containerHealthSchemaManager, - ContainerDBServiceProvider containerDBServiceProvider, + ReconContainerMetadataManager reconContainerMetadataManager, SCMHAManager scmhaManager, SequenceIdGenerator sequenceIdGen) throws IOException { @@ -99,7 +99,7 @@ public ReconContainerManager( this.scmClient = scm; this.pipelineManager = pipelineManager; this.containerHealthSchemaManager = containerHealthSchemaManager; - this.cdbServiceProvider = containerDBServiceProvider; + this.cdbServiceProvider = reconContainerMetadataManager; // batchHandler = scmDBStore this.nodeDB = ReconSCMDBDefinition.NODES.getTable(store); this.replicaHistoryMap = new ConcurrentHashMap<>(); diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconStorageContainerManagerFacade.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconStorageContainerManagerFacade.java index 652ab6e5e1a6..87c4eef121ff 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconStorageContainerManagerFacade.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconStorageContainerManagerFacade.java @@ -63,7 +63,7 @@ import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.ozone.recon.fsck.ContainerHealthTask; import org.apache.hadoop.ozone.recon.persistence.ContainerHealthSchemaManager; -import org.apache.hadoop.ozone.recon.spi.ContainerDBServiceProvider; +import org.apache.hadoop.ozone.recon.spi.ReconContainerMetadataManager; import org.apache.hadoop.ozone.recon.spi.StorageContainerServiceProvider; import org.apache.hadoop.ozone.recon.tasks.ReconTaskConfig; import com.google.inject.Inject; @@ -108,7 +108,7 @@ public ReconStorageContainerManagerFacade(OzoneConfiguration conf, StorageContainerServiceProvider scmServiceProvider, ReconTaskStatusDao reconTaskStatusDao, ContainerHealthSchemaManager containerHealthSchemaManager, - ContainerDBServiceProvider containerDBServiceProvider) + ReconContainerMetadataManager reconContainerMetadataManager) throws IOException { reconNodeDetails = getReconNodeDetails(conf); this.eventQueue = new EventQueue(); @@ -143,7 +143,7 @@ public ReconStorageContainerManagerFacade(OzoneConfiguration conf, dbStore, ReconSCMDBDefinition.CONTAINERS.getTable(dbStore), pipelineManager, scmServiceProvider, - containerHealthSchemaManager, containerDBServiceProvider, + containerHealthSchemaManager, reconContainerMetadataManager, scmhaManager, sequenceIdGen); this.scmServiceProvider = scmServiceProvider; diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/ContainerDBServiceProvider.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/ReconContainerMetadataManager.java similarity index 97% rename from hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/ContainerDBServiceProvider.java rename to hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/ReconContainerMetadataManager.java index df771a625e2b..2c27e7190fac 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/ContainerDBServiceProvider.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/ReconContainerMetadataManager.java @@ -32,12 +32,7 @@ * The Recon Container DB Service interface. */ @InterfaceStability.Unstable -public interface ContainerDBServiceProvider { - - /* - * Close the container DB - */ - void close() throws Exception; +public interface ReconContainerMetadataManager { /** * Create new container DB and bulk Store the container to Key prefix @@ -45,7 +40,7 @@ public interface ContainerDBServiceProvider { * @param containerKeyPrefixCounts Map of containerId, key-prefix tuple to * key count. */ - void initNewContainerDB(Map + void reinitWithNewContainerDataFromOm(Map containerKeyPrefixCounts) throws IOException; diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/ReconNamespaceSummaryManager.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/ReconNamespaceSummaryManager.java new file mode 100644 index 000000000000..5264824b4785 --- /dev/null +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/ReconNamespaceSummaryManager.java @@ -0,0 +1,37 @@ +/* + * 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.spi; + +import org.apache.hadoop.hdds.annotation.InterfaceStability; +import org.apache.hadoop.ozone.recon.api.types.NSSummary; + +import java.io.IOException; + +/** + * Interface for DB operations on NSSummary. + */ +@InterfaceStability.Unstable +public interface ReconNamespaceSummaryManager { + + void initNSSummaryTable() throws IOException; + + void storeNSSummary(long objectId, NSSummary nsSummary) throws IOException; + + NSSummary getNSSummary(long objectId) throws IOException; +} diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ContainerDBServiceProviderImpl.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ReconContainerMetadataManagerImpl.java similarity index 90% rename from hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ContainerDBServiceProviderImpl.java rename to hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ReconContainerMetadataManagerImpl.java index f613558d50de..d93ccad7e4ab 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ContainerDBServiceProviderImpl.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ReconContainerMetadataManagerImpl.java @@ -19,12 +19,11 @@ package org.apache.hadoop.ozone.recon.spi.impl; import static org.apache.hadoop.ozone.recon.ReconConstants.CONTAINER_COUNT_KEY; -import static org.apache.hadoop.ozone.recon.spi.impl.ReconContainerDBProvider.getNewDBStore; +import static org.apache.hadoop.ozone.recon.spi.impl.ReconDBProvider.truncateTable; import static org.apache.hadoop.ozone.recon.spi.impl.ReconDBDefinition.CONTAINER_KEY; import static org.apache.hadoop.ozone.recon.spi.impl.ReconDBDefinition.CONTAINER_KEY_COUNT; import static org.apache.hadoop.ozone.recon.spi.impl.ReconDBDefinition.REPLICA_HISTORY; -import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; @@ -36,16 +35,14 @@ import javax.inject.Inject; import javax.inject.Singleton; -import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.hdds.utils.db.BatchOperation; 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.scm.ContainerReplicaHistory; import org.apache.hadoop.ozone.recon.scm.ContainerReplicaHistoryList; -import org.apache.hadoop.ozone.recon.spi.ContainerDBServiceProvider; +import org.apache.hadoop.ozone.recon.spi.ReconContainerMetadataManager; import org.apache.hadoop.hdds.utils.db.DBStore; import org.apache.hadoop.hdds.utils.db.Table; import org.apache.hadoop.hdds.utils.db.Table.KeyValue; @@ -60,11 +57,11 @@ * Implementation of the Recon Container DB Service. */ @Singleton -public class ContainerDBServiceProviderImpl - implements ContainerDBServiceProvider { +public class ReconContainerMetadataManagerImpl + implements ReconContainerMetadataManager { private static final Logger LOG = - LoggerFactory.getLogger(ContainerDBServiceProviderImpl.class); + LoggerFactory.getLogger(ReconContainerMetadataManagerImpl.class); private Table containerKeyTable; private Table containerKeyCountTable; @@ -72,32 +69,19 @@ public class ContainerDBServiceProviderImpl containerReplicaHistoryTable; private GlobalStatsDao globalStatsDao; - @Inject - private OzoneConfiguration configuration; - - @Inject private DBStore containerDbStore; @Inject private Configuration sqlConfiguration; @Inject - public ContainerDBServiceProviderImpl(DBStore dbStore, - Configuration sqlConfiguration) { - containerDbStore = dbStore; + public ReconContainerMetadataManagerImpl(ReconDBProvider reconDBProvider, + Configuration sqlConfiguration) { + containerDbStore = reconDBProvider.getDbStore(); globalStatsDao = new GlobalStatsDao(sqlConfiguration); initializeTables(); } - @Override - public void close() throws Exception { - if (containerDbStore != null) { - LOG.info("Stopping ContainerKeyDB Service Provider"); - containerDbStore.close(); - containerDbStore = null; - } - } - /** * Initialize a new container DB instance, getting rid of the old instance * and then storing the passed in container prefix counts into the created @@ -107,28 +91,14 @@ public void close() throws Exception { * @throws IOException */ @Override - public void initNewContainerDB(Map + public void reinitWithNewContainerDataFromOm(Map containerKeyPrefixCounts) throws IOException { - - File oldDBLocation = containerDbStore.getDbLocation(); - try { - containerDbStore.close(); - } catch (Exception e) { - LOG.warn("Unable to close old Recon container key DB at {}.", - containerDbStore.getDbLocation().getAbsolutePath()); - } - containerDbStore = getNewDBStore(configuration); - LOG.info("Creating new Recon Container DB at {}", - containerDbStore.getDbLocation().getAbsolutePath()); + // clear and re-init all container-related tables + truncateTable(this.containerKeyTable); + truncateTable(this.containerKeyCountTable); initializeTables(); - if (oldDBLocation.exists()) { - LOG.info("Cleaning up old Recon Container key DB at {}.", - oldDBLocation.getAbsolutePath()); - FileUtils.deleteDirectory(oldDBLocation); - } - if (containerKeyPrefixCounts != null) { for (Map.Entry entry : containerKeyPrefixCounts.entrySet()) { diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ReconDBDefinition.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ReconDBDefinition.java index a9b23cea86d0..cfaa2b050827 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ReconDBDefinition.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ReconDBDefinition.java @@ -17,7 +17,6 @@ * */ package org.apache.hadoop.ozone.recon.spi.impl; - import org.apache.hadoop.hdds.utils.db.DBColumnFamilyDefinition; import org.apache.hadoop.hdds.utils.db.DBDefinition; import org.apache.hadoop.hdds.utils.db.IntegerCodec; @@ -25,7 +24,9 @@ import org.apache.hadoop.ozone.recon.ReconServerConfigKeys; import org.apache.hadoop.ozone.recon.api.types.ContainerKeyPrefix; import org.apache.hadoop.ozone.recon.codec.ContainerReplicaHistoryListCodec; +import org.apache.hadoop.ozone.recon.codec.NSSummaryCodec; import org.apache.hadoop.ozone.recon.scm.ContainerReplicaHistoryList; +import org.apache.hadoop.ozone.recon.api.types.NSSummary; /** * RocksDB definition for the DB internal to Recon. @@ -65,6 +66,14 @@ public ReconDBDefinition(String dbName) { ContainerReplicaHistoryList.class, new ContainerReplicaHistoryListCodec()); + public static final DBColumnFamilyDefinition + NAMESPACE_SUMMARY = new DBColumnFamilyDefinition( + "namespaceSummaryTable", + Long.class, + new LongCodec(), + NSSummary.class, + new NSSummaryCodec()); + @Override public String getName() { return dbName; @@ -78,6 +87,6 @@ public String getLocationConfigKey() { @Override public DBColumnFamilyDefinition[] getColumnFamilies() { return new DBColumnFamilyDefinition[] { - CONTAINER_KEY, CONTAINER_KEY_COUNT, REPLICA_HISTORY}; + CONTAINER_KEY, CONTAINER_KEY_COUNT, REPLICA_HISTORY, NAMESPACE_SUMMARY}; } } diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ReconContainerDBProvider.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ReconDBProvider.java similarity index 61% rename from hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ReconContainerDBProvider.java rename to hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ReconDBProvider.java index ec36597a0816..fe4b3ee13ac6 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ReconContainerDBProvider.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ReconDBProvider.java @@ -17,79 +17,101 @@ */ package org.apache.hadoop.ozone.recon.spi.impl; - import static org.apache.hadoop.ozone.recon.ReconConstants.RECON_CONTAINER_KEY_DB; import static org.apache.hadoop.ozone.recon.ReconServerConfigKeys.OZONE_RECON_DB_DIR; - import java.io.File; +import java.io.IOException; +import javax.inject.Inject; +import com.google.common.annotations.VisibleForTesting; import org.apache.hadoop.hdds.conf.OzoneConfiguration; -import org.apache.hadoop.ozone.recon.ReconUtils; import org.apache.hadoop.hdds.utils.db.DBStore; import org.apache.hadoop.hdds.utils.db.DBStoreBuilder; +import org.apache.hadoop.hdds.utils.db.TableIterator; +import org.apache.hadoop.ozone.recon.ReconUtils; +import com.google.inject.ProvisionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - -import com.google.common.annotations.VisibleForTesting; -import com.google.inject.Inject; -import com.google.inject.Provider; -import com.google.inject.ProvisionException; +import org.apache.hadoop.hdds.utils.db.Table; +import org.apache.hadoop.hdds.utils.db.Table.KeyValue; /** - * Provider for the Recon container DB (Metadata store). + * Provider for Recon's RDB. */ -public class ReconContainerDBProvider implements Provider { +public class ReconDBProvider { + private OzoneConfiguration configuration; + private ReconUtils reconUtils; + private DBStore dbStore; @VisibleForTesting private static final Logger LOG = - LoggerFactory.getLogger(ReconContainerDBProvider.class); - - private OzoneConfiguration configuration; - private ReconUtils reconUtils; + LoggerFactory.getLogger(ReconDBProvider.class); @Inject - public ReconContainerDBProvider(OzoneConfiguration configuration, - ReconUtils reconUtils) { + ReconDBProvider(OzoneConfiguration configuration, ReconUtils reconUtils) { this.configuration = configuration; this.reconUtils = reconUtils; + this.dbStore = provideReconDB(); } - @Override - public DBStore get() { - DBStore dbStore; + public DBStore provideReconDB() { + DBStore db; File reconDbDir = - reconUtils.getReconDbDir(configuration, OZONE_RECON_DB_DIR); + reconUtils.getReconDbDir(configuration, OZONE_RECON_DB_DIR); File lastKnownContainerKeyDb = - reconUtils.getLastKnownDB(reconDbDir, RECON_CONTAINER_KEY_DB); + reconUtils.getLastKnownDB(reconDbDir, RECON_CONTAINER_KEY_DB); if (lastKnownContainerKeyDb != null) { - LOG.info("Last known container-key DB : {}", - lastKnownContainerKeyDb.getAbsolutePath()); - dbStore = initializeDBStore(configuration, - lastKnownContainerKeyDb.getName()); + LOG.info("Last known Recon DB : {}", + lastKnownContainerKeyDb.getAbsolutePath()); + db = initializeDBStore(configuration, + lastKnownContainerKeyDb.getName()); } else { - dbStore = getNewDBStore(configuration); + db = getNewDBStore(configuration); } - if (dbStore == null) { + if (db == null) { throw new ProvisionException("Unable to provide instance of DBStore " + - "store."); + "store."); } + return db; + } + + public DBStore getDbStore() { return dbStore; } + static void truncateTable(Table table) throws IOException { + if (table == null) { + return; + } + TableIterator> + tableIterator = table.iterator(); + while (tableIterator.hasNext()) { + KeyValue entry = tableIterator.next(); + table.delete(entry.getKey()); + } + } + + static DBStore getNewDBStore(OzoneConfiguration configuration) { + String dbName = RECON_CONTAINER_KEY_DB + "_" + System.currentTimeMillis(); + return initializeDBStore(configuration, dbName); + } + private static DBStore initializeDBStore(OzoneConfiguration configuration, String dbName) { DBStore dbStore = null; try { dbStore = DBStoreBuilder.createDBStore(configuration, - new ReconDBDefinition(dbName)); + new ReconDBDefinition(dbName)); } catch (Exception ex) { LOG.error("Unable to initialize Recon container metadata store.", ex); } return dbStore; } - static DBStore getNewDBStore(OzoneConfiguration configuration) { - String dbName = RECON_CONTAINER_KEY_DB + "_" + System.currentTimeMillis(); - return initializeDBStore(configuration, dbName); + public void close() throws Exception { + if (this.dbStore != null) { + dbStore.close(); + dbStore = null; + } } } diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ReconNamespaceSummaryManagerImpl.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ReconNamespaceSummaryManagerImpl.java new file mode 100644 index 000000000000..01f8c4e3e4a6 --- /dev/null +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ReconNamespaceSummaryManagerImpl.java @@ -0,0 +1,67 @@ +/* + * 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.spi.impl; + +import org.apache.hadoop.hdds.utils.db.DBStore; +import org.apache.hadoop.hdds.utils.db.Table; +import org.apache.hadoop.ozone.recon.api.types.NSSummary; +import org.apache.hadoop.ozone.recon.spi.ReconNamespaceSummaryManager; +import static org.apache.hadoop.ozone.recon.spi.impl.ReconDBProvider.truncateTable; + +import javax.inject.Inject; +import static org.apache.hadoop.ozone.recon.spi.impl.ReconDBDefinition.NAMESPACE_SUMMARY; + +import java.io.IOException; + +/** + * Wrapper functions for DB operations on recon namespace summary metadata. + */ +public class ReconNamespaceSummaryManagerImpl + implements ReconNamespaceSummaryManager { + + private Table nsSummaryTable; + private DBStore namespaceDbStore; + + @Inject + public ReconNamespaceSummaryManagerImpl(ReconDBProvider reconDBProvider) + throws IOException { + namespaceDbStore = reconDBProvider.getDbStore(); + this.nsSummaryTable = NAMESPACE_SUMMARY.getTable(namespaceDbStore); + } + + @Override + public void initNSSummaryTable() throws IOException { + truncateTable(nsSummaryTable); + } + + @Override + public void storeNSSummary(long objectId, NSSummary nsSummary) + throws IOException { + nsSummaryTable.put(objectId, nsSummary); + } + + @Override + public NSSummary getNSSummary(long objectId) throws IOException { + return nsSummaryTable.get(objectId); + } + + public Table getNSSummaryTable() { + return nsSummaryTable; + } +} diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/tasks/ContainerKeyMapperTask.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/tasks/ContainerKeyMapperTask.java index af38d5298a98..544b0db1713b 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/tasks/ContainerKeyMapperTask.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/tasks/ContainerKeyMapperTask.java @@ -37,7 +37,7 @@ import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfo; import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfoGroup; import org.apache.hadoop.ozone.recon.api.types.ContainerKeyPrefix; -import org.apache.hadoop.ozone.recon.spi.ContainerDBServiceProvider; +import org.apache.hadoop.ozone.recon.spi.ReconContainerMetadataManager; import org.apache.hadoop.hdds.utils.db.Table; import org.apache.hadoop.hdds.utils.db.TableIterator; import org.slf4j.Logger; @@ -54,12 +54,12 @@ public class ContainerKeyMapperTask implements ReconOmTask { private static final Logger LOG = LoggerFactory.getLogger(ContainerKeyMapperTask.class); - private ContainerDBServiceProvider containerDBServiceProvider; + private ReconContainerMetadataManager reconContainerMetadataManager; @Inject - public ContainerKeyMapperTask(ContainerDBServiceProvider - containerDBServiceProvider) { - this.containerDBServiceProvider = containerDBServiceProvider; + public ContainerKeyMapperTask(ReconContainerMetadataManager + reconContainerMetadataManager) { + this.reconContainerMetadataManager = reconContainerMetadataManager; } /** @@ -74,7 +74,8 @@ public Pair reprocess(OMMetadataManager omMetadataManager) { Instant start = Instant.now(); // initialize new container DB - containerDBServiceProvider.initNewContainerDB(new HashMap<>()); + reconContainerMetadataManager + .reinitWithNewContainerDataFromOm(new HashMap<>()); Table omKeyInfoTable = omMetadataManager.getKeyTable(); try (TableIterator> @@ -170,7 +171,7 @@ private void deleteOMKeyFromContainerDB(String key) TableIterator> containerIterator = - containerDBServiceProvider.getContainerTableIterator(); + reconContainerMetadataManager.getContainerTableIterator(); Set keysToBeDeleted = new HashSet<>(); @@ -184,14 +185,14 @@ private void deleteOMKeyFromContainerDB(String key) } for (ContainerKeyPrefix containerKeyPrefix : keysToBeDeleted) { - containerDBServiceProvider.deleteContainerMapping(containerKeyPrefix); + reconContainerMetadataManager.deleteContainerMapping(containerKeyPrefix); // decrement count and update containerKeyCount. Long containerID = containerKeyPrefix.getContainerId(); long keyCount = - containerDBServiceProvider.getKeyCountForContainer(containerID); + reconContainerMetadataManager.getKeyCountForContainer(containerID); if (keyCount > 0) { - containerDBServiceProvider.storeContainerKeyCount(containerID, + reconContainerMetadataManager.storeContainerKeyCount(containerID, --keyCount); } } @@ -216,34 +217,34 @@ private void writeOMKeyToContainerDB(String key, OmKeyInfo omKeyInfo) long containerId = omKeyLocationInfo.getContainerID(); ContainerKeyPrefix containerKeyPrefix = new ContainerKeyPrefix( containerId, key, keyVersion); - if (containerDBServiceProvider.getCountForContainerKeyPrefix( + if (reconContainerMetadataManager.getCountForContainerKeyPrefix( containerKeyPrefix) == 0) { // Save on writes. No need to save same container-key prefix // mapping again. - containerDBServiceProvider.storeContainerKeyMapping( + reconContainerMetadataManager.storeContainerKeyMapping( containerKeyPrefix, 1); // check if container already exists and // increment the count of containers if it does not exist - if (!containerDBServiceProvider.doesContainerExists(containerId)) { + if (!reconContainerMetadataManager.doesContainerExists(containerId)) { containerCountToIncrement++; } // update the count of keys for the given containerID - long keyCount = - containerDBServiceProvider.getKeyCountForContainer(containerId); + long keyCount = reconContainerMetadataManager + .getKeyCountForContainer(containerId); // increment the count and update containerKeyCount. // keyCount will be 0 if containerID is not found. So, there is no // need to initialize keyCount for the first time. - containerDBServiceProvider.storeContainerKeyCount(containerId, + reconContainerMetadataManager.storeContainerKeyCount(containerId, ++keyCount); } } } if (containerCountToIncrement > 0) { - containerDBServiceProvider + reconContainerMetadataManager .incrementContainerCountBy(containerCountToIncrement); } } diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/tasks/FileSizeCountTask.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/tasks/FileSizeCountTask.java index e14096a86de5..b561d4329b57 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/tasks/FileSizeCountTask.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/tasks/FileSizeCountTask.java @@ -25,6 +25,7 @@ import org.apache.hadoop.ozone.om.helpers.OmKeyInfo; import org.apache.hadoop.hdds.utils.db.Table; import org.apache.hadoop.hdds.utils.db.TableIterator; +import org.apache.hadoop.ozone.recon.ReconConstants; import org.hadoop.ozone.recon.schema.UtilizationSchemaDefinition; import org.hadoop.ozone.recon.schema.tables.daos.FileCountBySizeDao; import org.hadoop.ozone.recon.schema.tables.pojos.FileCountBySize; @@ -52,8 +53,6 @@ public class FileSizeCountTask implements ReconOmTask { private static final Logger LOG = LoggerFactory.getLogger(FileSizeCountTask.class); - // 1125899906842624L = 1PB - private static final long MAX_FILE_SIZE_UPPER_BOUND = 1125899906842624L; private FileCountBySizeDao fileCountBySizeDao; private DSLContext dslContext; @@ -167,7 +166,7 @@ public Pair process(OMUpdateEventBatch events) { } private long getFileSizeUpperBound(long fileSize) { - if (fileSize >= MAX_FILE_SIZE_UPPER_BOUND) { + if (fileSize >= ReconConstants.MAX_FILE_SIZE_UPPER_BOUND) { return Long.MAX_VALUE; } int index = nextClosestPowerIndexOfTwo(fileSize); diff --git a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/ReconTestInjector.java b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/ReconTestInjector.java index ccdc2799ea0b..e4484cd5a015 100644 --- a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/ReconTestInjector.java +++ b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/ReconTestInjector.java @@ -36,13 +36,14 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.hdds.scm.server.OzoneStorageContainerManager; -import org.apache.hadoop.hdds.utils.db.DBStore; import org.apache.hadoop.ozone.recon.persistence.AbstractReconSqlDBTest; import org.apache.hadoop.ozone.recon.recovery.ReconOMMetadataManager; -import org.apache.hadoop.ozone.recon.spi.ContainerDBServiceProvider; +import org.apache.hadoop.ozone.recon.spi.ReconContainerMetadataManager; +import org.apache.hadoop.ozone.recon.spi.ReconNamespaceSummaryManager; import org.apache.hadoop.ozone.recon.spi.OzoneManagerServiceProvider; -import org.apache.hadoop.ozone.recon.spi.impl.ContainerDBServiceProviderImpl; -import org.apache.hadoop.ozone.recon.spi.impl.ReconContainerDBProvider; +import org.apache.hadoop.ozone.recon.spi.impl.ReconContainerMetadataManagerImpl; +import org.apache.hadoop.ozone.recon.spi.impl.ReconNamespaceSummaryManagerImpl; +import org.apache.hadoop.ozone.recon.spi.impl.ReconDBProvider; import org.junit.Assert; import org.junit.rules.TemporaryFolder; @@ -172,10 +173,13 @@ protected void configure() { } if (withContainerDB) { - bind(ContainerDBServiceProvider.class) - .to(ContainerDBServiceProviderImpl.class).in(Singleton.class); - bind(DBStore.class).toProvider(ReconContainerDBProvider.class). - in(Singleton.class); + bind(ReconContainerMetadataManager.class) + .to(ReconContainerMetadataManagerImpl.class) + .in(Singleton.class); + bind(ReconNamespaceSummaryManager.class) + .to(ReconNamespaceSummaryManagerImpl.class) + .in(Singleton.class); + bind(ReconDBProvider.class).in(Singleton.class); } for (Map.Entry entry : 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 9e4afd2ca3fd..bbf5daa5451c 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 @@ -75,7 +75,7 @@ import org.apache.hadoop.ozone.recon.scm.ReconContainerManager; import org.apache.hadoop.ozone.recon.scm.ReconPipelineManager; import org.apache.hadoop.ozone.recon.scm.ReconStorageContainerManagerFacade; -import org.apache.hadoop.ozone.recon.spi.ContainerDBServiceProvider; +import org.apache.hadoop.ozone.recon.spi.ReconContainerMetadataManager; import org.apache.hadoop.ozone.recon.spi.StorageContainerServiceProvider; import org.apache.hadoop.ozone.recon.spi.impl.OzoneManagerServiceProviderImpl; import org.apache.hadoop.ozone.recon.spi.impl.StorageContainerServiceProviderImpl; @@ -101,7 +101,7 @@ public class TestContainerEndpoint { private OzoneStorageContainerManager ozoneStorageContainerManager; private ReconContainerManager reconContainerManager; private ReconPipelineManager reconPipelineManager; - private ContainerDBServiceProvider containerDbServiceProvider; + private ReconContainerMetadataManager reconContainerMetadataManager; private ContainerEndpoint containerEndpoint; private boolean isSetupDone = false; private ContainerHealthSchemaManager containerHealthSchemaManager; @@ -143,8 +143,8 @@ private void initializeInjector() throws Exception { ozoneStorageContainerManager.getContainerManager(); reconPipelineManager = (ReconPipelineManager) ozoneStorageContainerManager.getPipelineManager(); - containerDbServiceProvider = - reconTestInjector.getInstance(ContainerDBServiceProvider.class); + reconContainerMetadataManager = + reconTestInjector.getInstance(ReconContainerMetadataManager.class); containerEndpoint = reconTestInjector.getInstance(ContainerEndpoint.class); containerHealthSchemaManager = reconTestInjector.getInstance(ContainerHealthSchemaManager.class); @@ -229,7 +229,7 @@ public void setUp() throws Exception { when(tableMock.getName()).thenReturn("KeyTable"); when(omMetadataManagerMock.getKeyTable()).thenReturn(tableMock); ContainerKeyMapperTask containerKeyMapperTask = - new ContainerKeyMapperTask(containerDbServiceProvider); + new ContainerKeyMapperTask(reconContainerMetadataManager); containerKeyMapperTask.reprocess(reconOMMetadataManager); } diff --git a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/AbstractReconContainerManagerTest.java b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/AbstractReconContainerManagerTest.java index 1276b770178e..c1218dc80089 100644 --- a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/AbstractReconContainerManagerTest.java +++ b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/AbstractReconContainerManagerTest.java @@ -44,7 +44,7 @@ import org.apache.hadoop.hdds.utils.db.DBStoreBuilder; import org.apache.hadoop.hdds.utils.db.Table; import org.apache.hadoop.ozone.recon.persistence.ContainerHealthSchemaManager; -import org.apache.hadoop.ozone.recon.spi.ContainerDBServiceProvider; +import org.apache.hadoop.ozone.recon.spi.ReconContainerMetadataManager; import org.apache.hadoop.ozone.recon.spi.StorageContainerServiceProvider; import static org.apache.hadoop.hdds.protocol.proto.HddsProtos.LifeCycleState.OPEN; @@ -109,7 +109,7 @@ public void setUp() throws Exception { pipelineManager, getScmServiceProvider(), mock(ContainerHealthSchemaManager.class), - mock(ContainerDBServiceProvider.class), + mock(ReconContainerMetadataManager.class), scmhaManager, sequenceIdGen); } diff --git a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/spi/impl/TestContainerDBServiceProviderImpl.java b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/spi/impl/TestReconContainerMetadataManagerImpl.java similarity index 65% rename from hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/spi/impl/TestContainerDBServiceProviderImpl.java rename to hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/spi/impl/TestReconContainerMetadataManagerImpl.java index a4b0b54da8ed..245cb03d6730 100644 --- a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/spi/impl/TestContainerDBServiceProviderImpl.java +++ b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/spi/impl/TestReconContainerMetadataManagerImpl.java @@ -29,7 +29,7 @@ import org.apache.hadoop.ozone.recon.ReconTestInjector; import org.apache.hadoop.ozone.recon.api.types.ContainerKeyPrefix; import org.apache.hadoop.ozone.recon.api.types.ContainerMetadata; -import org.apache.hadoop.ozone.recon.spi.ContainerDBServiceProvider; +import org.apache.hadoop.ozone.recon.spi.ReconContainerMetadataManager; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; @@ -40,11 +40,11 @@ /** * Unit Tests for ContainerDBServiceProviderImpl. */ -public class TestContainerDBServiceProviderImpl { +public class TestReconContainerMetadataManagerImpl { @ClassRule public static final TemporaryFolder TEMP_FOLDER = new TemporaryFolder(); - private static ContainerDBServiceProvider containerDbServiceProvider; + private static ReconContainerMetadataManager reconContainerMetadataManager; private String keyPrefix1 = "V3/B1/K1"; private String keyPrefix2 = "V3/B1/K2"; @@ -57,14 +57,14 @@ public static void setupOnce() throws Exception { .withReconSqlDb() .withContainerDB() .build(); - containerDbServiceProvider = - reconTestInjector.getInstance(ContainerDBServiceProvider.class); + reconContainerMetadataManager = + reconTestInjector.getInstance(ReconContainerMetadataManager.class); } @Before public void setUp() throws Exception { // Reset containerDB before running each test - containerDbServiceProvider.initNewContainerDB(null); + reconContainerMetadataManager.reinitWithNewContainerDataFromOm(null); } private void populateKeysInContainers(long containerId1, long containerId2) @@ -72,18 +72,18 @@ private void populateKeysInContainers(long containerId1, long containerId2) ContainerKeyPrefix containerKeyPrefix1 = new ContainerKeyPrefix(containerId1, keyPrefix1, 0); - containerDbServiceProvider.storeContainerKeyMapping(containerKeyPrefix1, + reconContainerMetadataManager.storeContainerKeyMapping(containerKeyPrefix1, 1); ContainerKeyPrefix containerKeyPrefix2 = new ContainerKeyPrefix( containerId1, keyPrefix2, 0); - containerDbServiceProvider.storeContainerKeyMapping(containerKeyPrefix2, + reconContainerMetadataManager.storeContainerKeyMapping(containerKeyPrefix2, 2); ContainerKeyPrefix containerKeyPrefix3 = new ContainerKeyPrefix( containerId2, keyPrefix3, 0); - containerDbServiceProvider.storeContainerKeyMapping(containerKeyPrefix3, + reconContainerMetadataManager.storeContainerKeyMapping(containerKeyPrefix3, 3); } @@ -106,11 +106,11 @@ public void testInitNewContainerDB() throws Exception { for (Map.Entry entry : prefixCounts.entrySet()) { - containerDbServiceProvider.storeContainerKeyMapping( + reconContainerMetadataManager.storeContainerKeyMapping( entry.getKey(), prefixCounts.get(entry.getKey())); } - assertEquals(1, containerDbServiceProvider + assertEquals(1, reconContainerMetadataManager .getCountForContainerKeyPrefix(ckp1).intValue()); prefixCounts.clear(); @@ -123,9 +123,10 @@ public void testInitNewContainerDB() throws Exception { "V1/B3/K2", 0); prefixCounts.put(ckp5, 15); - containerDbServiceProvider.initNewContainerDB(prefixCounts); + reconContainerMetadataManager + .reinitWithNewContainerDataFromOm(prefixCounts); Map keyPrefixesForContainer = - containerDbServiceProvider.getKeyPrefixesForContainer(containerId); + reconContainerMetadataManager.getKeyPrefixesForContainer(containerId); assertEquals(4, keyPrefixesForContainer.size()); assertEquals(12, keyPrefixesForContainer.get(ckp2).intValue()); @@ -133,7 +134,7 @@ public void testInitNewContainerDB() throws Exception { assertEquals(14, keyPrefixesForContainer.get(ckp4).intValue()); assertEquals(15, keyPrefixesForContainer.get(ckp5).intValue()); - assertEquals(0, containerDbServiceProvider + assertEquals(0, reconContainerMetadataManager .getCountForContainerKeyPrefix(ckp1).intValue()); } @@ -149,20 +150,20 @@ public void testStoreContainerKeyMapping() throws Exception { for (Map.Entry entry : prefixCounts.entrySet()) { ContainerKeyPrefix containerKeyPrefix = new ContainerKeyPrefix( containerId, entry.getKey(), 0); - containerDbServiceProvider.storeContainerKeyMapping( + reconContainerMetadataManager.storeContainerKeyMapping( containerKeyPrefix, prefixCounts.get(entry.getKey())); } Assert.assertEquals(1, - containerDbServiceProvider.getCountForContainerKeyPrefix( + reconContainerMetadataManager.getCountForContainerKeyPrefix( new ContainerKeyPrefix(containerId, keyPrefix1, 0)).longValue()); Assert.assertEquals(2, - containerDbServiceProvider.getCountForContainerKeyPrefix( + reconContainerMetadataManager.getCountForContainerKeyPrefix( new ContainerKeyPrefix(containerId, keyPrefix2, 0)).longValue()); Assert.assertEquals(3, - containerDbServiceProvider.getCountForContainerKeyPrefix( + reconContainerMetadataManager.getCountForContainerKeyPrefix( new ContainerKeyPrefix(containerId, keyPrefix3, 0)).longValue()); } @@ -171,61 +172,62 @@ public void testStoreContainerKeyMapping() throws Exception { public void testStoreContainerKeyCount() throws Exception { long containerId = 1L; long nextContainerId = 2L; - containerDbServiceProvider.storeContainerKeyCount(containerId, 2L); - containerDbServiceProvider.storeContainerKeyCount(nextContainerId, 3L); + reconContainerMetadataManager.storeContainerKeyCount(containerId, 2L); + reconContainerMetadataManager.storeContainerKeyCount(nextContainerId, 3L); assertEquals(2, - containerDbServiceProvider.getKeyCountForContainer(containerId)); + reconContainerMetadataManager.getKeyCountForContainer(containerId)); assertEquals(3, - containerDbServiceProvider.getKeyCountForContainer(nextContainerId)); + reconContainerMetadataManager.getKeyCountForContainer(nextContainerId)); - containerDbServiceProvider.storeContainerKeyCount(containerId, 20L); + reconContainerMetadataManager.storeContainerKeyCount(containerId, 20L); assertEquals(20, - containerDbServiceProvider.getKeyCountForContainer(containerId)); + reconContainerMetadataManager.getKeyCountForContainer(containerId)); } @Test public void testGetKeyCountForContainer() throws Exception { long containerId = 1L; long nextContainerId = 2L; - containerDbServiceProvider.storeContainerKeyCount(containerId, 2L); - containerDbServiceProvider.storeContainerKeyCount(nextContainerId, 3L); + reconContainerMetadataManager.storeContainerKeyCount(containerId, 2L); + reconContainerMetadataManager.storeContainerKeyCount(nextContainerId, 3L); assertEquals(2, - containerDbServiceProvider.getKeyCountForContainer(containerId)); + reconContainerMetadataManager.getKeyCountForContainer(containerId)); assertEquals(3, - containerDbServiceProvider.getKeyCountForContainer(nextContainerId)); + reconContainerMetadataManager.getKeyCountForContainer(nextContainerId)); assertEquals(0, - containerDbServiceProvider.getKeyCountForContainer(5L)); + reconContainerMetadataManager.getKeyCountForContainer(5L)); } @Test public void testDoesContainerExists() throws Exception { long containerId = 1L; long nextContainerId = 2L; - containerDbServiceProvider.storeContainerKeyCount(containerId, 2L); - containerDbServiceProvider.storeContainerKeyCount(nextContainerId, 3L); - - assertTrue(containerDbServiceProvider.doesContainerExists(containerId)); - assertTrue(containerDbServiceProvider.doesContainerExists(nextContainerId)); - assertFalse(containerDbServiceProvider.doesContainerExists(0L)); - assertFalse(containerDbServiceProvider.doesContainerExists(3L)); + reconContainerMetadataManager.storeContainerKeyCount(containerId, 2L); + reconContainerMetadataManager.storeContainerKeyCount(nextContainerId, 3L); + + assertTrue(reconContainerMetadataManager.doesContainerExists(containerId)); + assertTrue(reconContainerMetadataManager. + doesContainerExists(nextContainerId)); + assertFalse(reconContainerMetadataManager.doesContainerExists(0L)); + assertFalse(reconContainerMetadataManager.doesContainerExists(3L)); } @Test public void testGetCountForContainerKeyPrefix() throws Exception { long containerId = System.currentTimeMillis(); - containerDbServiceProvider.storeContainerKeyMapping(new + reconContainerMetadataManager.storeContainerKeyMapping(new ContainerKeyPrefix(containerId, keyPrefix1), 2); - Integer count = containerDbServiceProvider. + Integer count = reconContainerMetadataManager. getCountForContainerKeyPrefix(new ContainerKeyPrefix(containerId, keyPrefix1)); assertEquals(2L, count.longValue()); - count = containerDbServiceProvider. + count = reconContainerMetadataManager. getCountForContainerKeyPrefix(new ContainerKeyPrefix(containerId, "invalid")); assertEquals(0L, count.longValue()); @@ -246,13 +248,13 @@ public void testGetKeyPrefixesForContainer() throws Exception { Map keyPrefixMap = - containerDbServiceProvider.getKeyPrefixesForContainer(containerId); + reconContainerMetadataManager.getKeyPrefixesForContainer(containerId); assertEquals(2, keyPrefixMap.size()); assertEquals(1, keyPrefixMap.get(containerKeyPrefix1).longValue()); assertEquals(2, keyPrefixMap.get(containerKeyPrefix2).longValue()); - keyPrefixMap = containerDbServiceProvider.getKeyPrefixesForContainer( + keyPrefixMap = reconContainerMetadataManager.getKeyPrefixesForContainer( nextContainerId); assertEquals(1, keyPrefixMap.size()); assertEquals(3, keyPrefixMap.get(containerKeyPrefix3).longValue()); @@ -268,25 +270,25 @@ public void testGetKeyPrefixesForContainerWithKeyPrefix() throws Exception { containerId, keyPrefix2, 0); Map keyPrefixMap = - containerDbServiceProvider.getKeyPrefixesForContainer(containerId, + reconContainerMetadataManager.getKeyPrefixesForContainer(containerId, keyPrefix1); assertEquals(1, keyPrefixMap.size()); assertEquals(2, keyPrefixMap.get(containerKeyPrefix2).longValue()); - keyPrefixMap = containerDbServiceProvider.getKeyPrefixesForContainer( + keyPrefixMap = reconContainerMetadataManager.getKeyPrefixesForContainer( nextContainerId, keyPrefix3); assertEquals(0, keyPrefixMap.size()); // test for negative cases - keyPrefixMap = containerDbServiceProvider.getKeyPrefixesForContainer( + keyPrefixMap = reconContainerMetadataManager.getKeyPrefixesForContainer( containerId, "V3/B1/invalid"); assertEquals(0, keyPrefixMap.size()); - keyPrefixMap = containerDbServiceProvider.getKeyPrefixesForContainer( + keyPrefixMap = reconContainerMetadataManager.getKeyPrefixesForContainer( containerId, keyPrefix3); assertEquals(0, keyPrefixMap.size()); - keyPrefixMap = containerDbServiceProvider.getKeyPrefixesForContainer( + keyPrefixMap = reconContainerMetadataManager.getKeyPrefixesForContainer( 10L, ""); assertEquals(0, keyPrefixMap.size()); } @@ -298,35 +300,35 @@ public void testGetContainersWithPrevContainer() throws Exception { populateKeysInContainers(containerId, nextContainerId); Map containerMap = - containerDbServiceProvider.getContainers(-1, 0L); + reconContainerMetadataManager.getContainers(-1, 0L); assertEquals(2, containerMap.size()); assertEquals(3, containerMap.get(containerId).getNumberOfKeys()); assertEquals(3, containerMap.get(nextContainerId).getNumberOfKeys()); // test if limit works - containerMap = containerDbServiceProvider.getContainers( + containerMap = reconContainerMetadataManager.getContainers( 1, 0L); assertEquals(1, containerMap.size()); assertNull(containerMap.get(nextContainerId)); // test for prev key - containerMap = containerDbServiceProvider.getContainers( + containerMap = reconContainerMetadataManager.getContainers( -1, containerId); assertEquals(1, containerMap.size()); // containerId must be skipped from containerMap result assertNull(containerMap.get(containerId)); - containerMap = containerDbServiceProvider.getContainers( + containerMap = reconContainerMetadataManager.getContainers( -1, nextContainerId); assertEquals(0, containerMap.size()); // test for negative cases - containerMap = containerDbServiceProvider.getContainers( + containerMap = reconContainerMetadataManager.getContainers( -1, 10L); assertEquals(0, containerMap.size()); - containerMap = containerDbServiceProvider.getContainers( + containerMap = reconContainerMetadataManager.getContainers( 0, containerId); assertEquals(0, containerMap.size()); } @@ -338,49 +340,49 @@ public void testDeleteContainerMapping() throws Exception { populateKeysInContainers(containerId, nextContainerId); Map keyPrefixMap = - containerDbServiceProvider.getKeyPrefixesForContainer(containerId); + reconContainerMetadataManager.getKeyPrefixesForContainer(containerId); assertEquals(2, keyPrefixMap.size()); - containerDbServiceProvider.deleteContainerMapping(new ContainerKeyPrefix( + reconContainerMetadataManager.deleteContainerMapping(new ContainerKeyPrefix( containerId, keyPrefix2, 0)); keyPrefixMap = - containerDbServiceProvider.getKeyPrefixesForContainer(containerId); + reconContainerMetadataManager.getKeyPrefixesForContainer(containerId); assertEquals(1, keyPrefixMap.size()); } @Test public void testGetCountForContainers() throws Exception { - assertEquals(0, containerDbServiceProvider.getCountForContainers()); + assertEquals(0, reconContainerMetadataManager.getCountForContainers()); - containerDbServiceProvider.storeContainerCount(5L); + reconContainerMetadataManager.storeContainerCount(5L); - assertEquals(5L, containerDbServiceProvider.getCountForContainers()); - containerDbServiceProvider.incrementContainerCountBy(1L); + assertEquals(5L, reconContainerMetadataManager.getCountForContainers()); + reconContainerMetadataManager.incrementContainerCountBy(1L); - assertEquals(6L, containerDbServiceProvider.getCountForContainers()); + assertEquals(6L, reconContainerMetadataManager.getCountForContainers()); - containerDbServiceProvider.storeContainerCount(10L); - assertEquals(10L, containerDbServiceProvider.getCountForContainers()); + reconContainerMetadataManager.storeContainerCount(10L); + assertEquals(10L, reconContainerMetadataManager.getCountForContainers()); } @Test public void testStoreContainerCount() throws Exception { - containerDbServiceProvider.storeContainerCount(3L); - assertEquals(3L, containerDbServiceProvider.getCountForContainers()); + reconContainerMetadataManager.storeContainerCount(3L); + assertEquals(3L, reconContainerMetadataManager.getCountForContainers()); - containerDbServiceProvider.storeContainerCount(5L); - assertEquals(5L, containerDbServiceProvider.getCountForContainers()); + reconContainerMetadataManager.storeContainerCount(5L); + assertEquals(5L, reconContainerMetadataManager.getCountForContainers()); } @Test public void testIncrementContainerCountBy() throws Exception { - assertEquals(0, containerDbServiceProvider.getCountForContainers()); + assertEquals(0, reconContainerMetadataManager.getCountForContainers()); - containerDbServiceProvider.incrementContainerCountBy(1L); - assertEquals(1L, containerDbServiceProvider.getCountForContainers()); + reconContainerMetadataManager.incrementContainerCountBy(1L); + assertEquals(1L, reconContainerMetadataManager.getCountForContainers()); - containerDbServiceProvider.incrementContainerCountBy(3L); - assertEquals(4L, containerDbServiceProvider.getCountForContainers()); + reconContainerMetadataManager.incrementContainerCountBy(3L); + assertEquals(4L, reconContainerMetadataManager.getCountForContainers()); } } diff --git a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/spi/impl/TestReconContainerDBProvider.java b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/spi/impl/TestReconDBProvider.java similarity index 84% rename from hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/spi/impl/TestReconContainerDBProvider.java rename to hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/spi/impl/TestReconDBProvider.java index ad1feeb68a32..3366843e135f 100644 --- a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/spi/impl/TestReconContainerDBProvider.java +++ b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/spi/impl/TestReconDBProvider.java @@ -25,7 +25,6 @@ import java.io.IOException; import org.apache.hadoop.hdds.conf.OzoneConfiguration; -import org.apache.hadoop.hdds.utils.db.DBStore; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -40,7 +39,7 @@ * Tests the class that provides the instance of the DB Store used by Recon to * store its container - key data. */ -public class TestReconContainerDBProvider { +public class TestReconDBProvider { @Rule public TemporaryFolder tempFolder = new TemporaryFolder(); @@ -57,18 +56,16 @@ protected void configure() { OzoneConfiguration configuration = new OzoneConfiguration(); configuration.set(OZONE_RECON_DB_DIR, dbDir.getAbsolutePath()); bind(OzoneConfiguration.class).toInstance(configuration); - bind(DBStore.class).toProvider(ReconContainerDBProvider.class).in( - Singleton.class); + bind(ReconDBProvider.class).in(Singleton.class); } }); } @Test public void testGet() throws Exception { - ReconContainerDBProvider reconContainerDBProvider = injector.getInstance( - ReconContainerDBProvider.class); - DBStore dbStore = reconContainerDBProvider.get(); - assertNotNull(dbStore); + ReconDBProvider reconDBProvider = injector.getInstance( + ReconDBProvider.class); + assertNotNull(reconDBProvider.getDbStore()); } } \ No newline at end of file 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 new file mode 100644 index 000000000000..3aff907dd40c --- /dev/null +++ b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/spi/impl/TestReconNamespaceSummaryManagerImpl.java @@ -0,0 +1,96 @@ +/* + * 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.spi.impl; + +import org.apache.hadoop.ozone.recon.ReconTestInjector; +import org.apache.hadoop.ozone.recon.api.types.NSSummary; +import org.junit.*; +import org.junit.rules.TemporaryFolder; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +/** + * Test for NSSummary manager. + */ +public class TestReconNamespaceSummaryManagerImpl { + @ClassRule + public static final TemporaryFolder TEMP_FOLDER = new TemporaryFolder(); + private static ReconNamespaceSummaryManagerImpl reconNamespaceSummaryManager; + private static int[] testBucket; + + @BeforeClass + public static void setupOnce() throws Exception { + ReconTestInjector reconTestInjector = + new ReconTestInjector.Builder(TEMP_FOLDER) + .withReconSqlDb() + .withContainerDB() + .build(); + reconNamespaceSummaryManager = reconTestInjector.getInstance( + ReconNamespaceSummaryManagerImpl.class); + testBucket = new int[40]; + for (int i = 0; i < 40; ++i) { + testBucket[i] = i + 1; + } + } + + @Before + public void setUp() throws Exception { + // Clear namespace table before running each test + reconNamespaceSummaryManager.initNSSummaryTable(); + } + + @Test + public void testStoreAndGet() throws Exception { + putThreeNSMetadata(); + NSSummary summary = reconNamespaceSummaryManager.getNSSummary(1L); + NSSummary summary2 = reconNamespaceSummaryManager.getNSSummary(2L); + NSSummary summary3 = reconNamespaceSummaryManager.getNSSummary(3L); + Assert.assertEquals(1, summary.getNumOfFiles()); + Assert.assertEquals(2, summary.getSizeOfFiles()); + Assert.assertEquals(3, summary2.getNumOfFiles()); + Assert.assertEquals(4, summary2.getSizeOfFiles()); + Assert.assertEquals(5, summary3.getNumOfFiles()); + Assert.assertEquals(6, summary3.getSizeOfFiles()); + // non-existent key + Assert.assertNull(reconNamespaceSummaryManager.getNSSummary(0L)); + } + + @Test + public void testInitNSSummaryTable() throws IOException { + putThreeNSMetadata(); + Assert.assertFalse( + reconNamespaceSummaryManager.getNSSummaryTable().isEmpty()); + reconNamespaceSummaryManager.initNSSummaryTable(); + Assert.assertTrue( + reconNamespaceSummaryManager.getNSSummaryTable().isEmpty()); + } + + private void putThreeNSMetadata() throws IOException { + HashMap hmap = new HashMap<>(); + hmap.put(1L, new NSSummary(1, 2, testBucket)); + hmap.put(2L, new NSSummary(3, 4, testBucket)); + hmap.put(3L, new NSSummary(5, 6, testBucket)); + for (Map.Entry entry: hmap.entrySet()) { + reconNamespaceSummaryManager.storeNSSummary( + (long)entry.getKey(), (NSSummary)entry.getValue()); + } + } +} diff --git a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/tasks/TestContainerKeyMapperTask.java b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/tasks/TestContainerKeyMapperTask.java index 0f87e29f7f7f..75584b24b345 100644 --- a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/tasks/TestContainerKeyMapperTask.java +++ b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/tasks/TestContainerKeyMapperTask.java @@ -45,7 +45,7 @@ import org.apache.hadoop.ozone.recon.ReconTestInjector; import org.apache.hadoop.ozone.recon.api.types.ContainerKeyPrefix; import org.apache.hadoop.ozone.recon.recovery.ReconOMMetadataManager; -import org.apache.hadoop.ozone.recon.spi.ContainerDBServiceProvider; +import org.apache.hadoop.ozone.recon.spi.ReconContainerMetadataManager; import org.apache.hadoop.ozone.recon.spi.impl.OzoneManagerServiceProviderImpl; import org.apache.hadoop.hdds.utils.db.Table; import org.junit.Before; @@ -61,7 +61,7 @@ public class TestContainerKeyMapperTask { @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); - private ContainerDBServiceProvider containerDbServiceProvider; + private ReconContainerMetadataManager reconContainerMetadataManager; private OMMetadataManager omMetadataManager; private ReconOMMetadataManager reconOMMetadataManager; private OzoneManagerServiceProviderImpl ozoneManagerServiceProvider; @@ -81,18 +81,18 @@ public void setUp() throws Exception { .withOmServiceProvider(ozoneManagerServiceProvider) .withContainerDB() .build(); - containerDbServiceProvider = - reconTestInjector.getInstance(ContainerDBServiceProvider.class); + reconContainerMetadataManager = + reconTestInjector.getInstance(ReconContainerMetadataManager.class); } @Test public void testReprocessOMDB() throws Exception{ Map keyPrefixesForContainer = - containerDbServiceProvider.getKeyPrefixesForContainer(1); + reconContainerMetadataManager.getKeyPrefixesForContainer(1); assertTrue(keyPrefixesForContainer.isEmpty()); - keyPrefixesForContainer = containerDbServiceProvider + keyPrefixesForContainer = reconContainerMetadataManager .getKeyPrefixesForContainer(2); assertTrue(keyPrefixesForContainer.isEmpty()); @@ -120,11 +120,11 @@ public void testReprocessOMDB() throws Exception{ Collections.singletonList(omKeyLocationInfoGroup)); ContainerKeyMapperTask containerKeyMapperTask = - new ContainerKeyMapperTask(containerDbServiceProvider); + new ContainerKeyMapperTask(reconContainerMetadataManager); containerKeyMapperTask.reprocess(reconOMMetadataManager); keyPrefixesForContainer = - containerDbServiceProvider.getKeyPrefixesForContainer(1); + reconContainerMetadataManager.getKeyPrefixesForContainer(1); assertEquals(1, keyPrefixesForContainer.size()); String omKey = omMetadataManager.getOzoneKey("sampleVol", "bucketOne", "key_one"); @@ -134,7 +134,7 @@ public void testReprocessOMDB() throws Exception{ keyPrefixesForContainer.get(containerKeyPrefix).intValue()); keyPrefixesForContainer = - containerDbServiceProvider.getKeyPrefixesForContainer(2); + reconContainerMetadataManager.getKeyPrefixesForContainer(2); assertEquals(1, keyPrefixesForContainer.size()); containerKeyPrefix = new ContainerKeyPrefix(2, omKey, 0); @@ -142,21 +142,21 @@ public void testReprocessOMDB() throws Exception{ keyPrefixesForContainer.get(containerKeyPrefix).intValue()); // Test if container key counts are updated - assertEquals(1, containerDbServiceProvider.getKeyCountForContainer(1L)); - assertEquals(1, containerDbServiceProvider.getKeyCountForContainer(2L)); - assertEquals(0, containerDbServiceProvider.getKeyCountForContainer(3L)); + assertEquals(1, reconContainerMetadataManager.getKeyCountForContainer(1L)); + assertEquals(1, reconContainerMetadataManager.getKeyCountForContainer(2L)); + assertEquals(0, reconContainerMetadataManager.getKeyCountForContainer(3L)); // Test if container count is updated - assertEquals(2, containerDbServiceProvider.getCountForContainers()); + assertEquals(2, reconContainerMetadataManager.getCountForContainers()); } @Test public void testProcessOMEvents() throws IOException { Map keyPrefixesForContainer = - containerDbServiceProvider.getKeyPrefixesForContainer(1); + reconContainerMetadataManager.getKeyPrefixesForContainer(1); assertTrue(keyPrefixesForContainer.isEmpty()); - keyPrefixesForContainer = containerDbServiceProvider + keyPrefixesForContainer = reconContainerMetadataManager .getKeyPrefixesForContainer(2); assertTrue(keyPrefixesForContainer.isEmpty()); @@ -225,46 +225,46 @@ public void testProcessOMEvents() throws IOException { }}); ContainerKeyMapperTask containerKeyMapperTask = - new ContainerKeyMapperTask(containerDbServiceProvider); + new ContainerKeyMapperTask(reconContainerMetadataManager); containerKeyMapperTask.reprocess(reconOMMetadataManager); - keyPrefixesForContainer = containerDbServiceProvider + keyPrefixesForContainer = reconContainerMetadataManager .getKeyPrefixesForContainer(1); assertEquals(1, keyPrefixesForContainer.size()); - keyPrefixesForContainer = containerDbServiceProvider + keyPrefixesForContainer = reconContainerMetadataManager .getKeyPrefixesForContainer(2); assertTrue(keyPrefixesForContainer.isEmpty()); - keyPrefixesForContainer = containerDbServiceProvider + keyPrefixesForContainer = reconContainerMetadataManager .getKeyPrefixesForContainer(3); assertEquals(1, keyPrefixesForContainer.size()); - assertEquals(1, containerDbServiceProvider.getKeyCountForContainer(1L)); - assertEquals(0, containerDbServiceProvider.getKeyCountForContainer(2L)); - assertEquals(1, containerDbServiceProvider.getKeyCountForContainer(3L)); + assertEquals(1, reconContainerMetadataManager.getKeyCountForContainer(1L)); + assertEquals(0, reconContainerMetadataManager.getKeyCountForContainer(2L)); + assertEquals(1, reconContainerMetadataManager.getKeyCountForContainer(3L)); // Process PUT & DELETE event. containerKeyMapperTask.process(omUpdateEventBatch); - keyPrefixesForContainer = containerDbServiceProvider + keyPrefixesForContainer = reconContainerMetadataManager .getKeyPrefixesForContainer(1); assertEquals(1, keyPrefixesForContainer.size()); - keyPrefixesForContainer = containerDbServiceProvider + keyPrefixesForContainer = reconContainerMetadataManager .getKeyPrefixesForContainer(2); assertEquals(1, keyPrefixesForContainer.size()); - keyPrefixesForContainer = containerDbServiceProvider + keyPrefixesForContainer = reconContainerMetadataManager .getKeyPrefixesForContainer(3); assertTrue(keyPrefixesForContainer.isEmpty()); - assertEquals(1, containerDbServiceProvider.getKeyCountForContainer(1L)); - assertEquals(1, containerDbServiceProvider.getKeyCountForContainer(2L)); - assertEquals(0, containerDbServiceProvider.getKeyCountForContainer(3L)); + assertEquals(1, reconContainerMetadataManager.getKeyCountForContainer(1L)); + assertEquals(1, reconContainerMetadataManager.getKeyCountForContainer(2L)); + assertEquals(0, reconContainerMetadataManager.getKeyCountForContainer(3L)); // Test if container count is updated - assertEquals(3, containerDbServiceProvider.getCountForContainers()); + assertEquals(3, reconContainerMetadataManager.getCountForContainers()); } private OmKeyInfo buildOmKeyInfo(String volume,