Search in sources :

Example 6 with ContainerKeyPrefix

use of org.apache.hadoop.ozone.recon.api.types.ContainerKeyPrefix in project ozone by apache.

the class TestReconCodecs method testContainerKeyPrefixCodec.

@Test
public void testContainerKeyPrefixCodec() throws IOException {
    ContainerKeyPrefix containerKeyPrefix = new ContainerKeyPrefix(System.currentTimeMillis(), "TestKeyPrefix", 0);
    Codec<ContainerKeyPrefix> codec = new ContainerKeyPrefixCodec();
    byte[] persistedFormat = codec.toPersistedFormat(containerKeyPrefix);
    Assert.assertTrue(persistedFormat != null);
    ContainerKeyPrefix fromPersistedFormat = codec.fromPersistedFormat(persistedFormat);
    Assert.assertEquals(containerKeyPrefix, fromPersistedFormat);
}
Also used : ContainerKeyPrefix(org.apache.hadoop.ozone.recon.api.types.ContainerKeyPrefix) ContainerKeyPrefixCodec(org.apache.hadoop.ozone.recon.spi.impl.ContainerKeyPrefixCodec) Test(org.junit.Test)

Example 7 with ContainerKeyPrefix

use of org.apache.hadoop.ozone.recon.api.types.ContainerKeyPrefix in project ozone by apache.

the class ReconContainerMetadataManagerImpl method getKeyPrefixesForContainer.

/**
 * Use the DB's prefix seek iterator to start the scan from the given
 * container ID and prev key prefix. The prev key prefix is skipped from
 * the result.
 *
 * @param containerId the given containerId.
 * @param prevKeyPrefix the given key prefix to start the scan from.
 * @return Map of (Key-Prefix,Count of Keys).
 */
@Override
public Map<ContainerKeyPrefix, Integer> getKeyPrefixesForContainer(long containerId, String prevKeyPrefix) throws IOException {
    Map<ContainerKeyPrefix, Integer> prefixes = new LinkedHashMap<>();
    TableIterator<ContainerKeyPrefix, ? extends KeyValue<ContainerKeyPrefix, Integer>> containerIterator = containerKeyTable.iterator();
    ContainerKeyPrefix seekKey;
    boolean skipPrevKey = false;
    if (StringUtils.isNotBlank(prevKeyPrefix)) {
        skipPrevKey = true;
        seekKey = new ContainerKeyPrefix(containerId, prevKeyPrefix);
    } else {
        seekKey = new ContainerKeyPrefix(containerId);
    }
    KeyValue<ContainerKeyPrefix, Integer> seekKeyValue = containerIterator.seek(seekKey);
    // returned
    if (seekKeyValue == null || (StringUtils.isNotBlank(prevKeyPrefix) && !seekKeyValue.getKey().getKeyPrefix().equals(prevKeyPrefix))) {
        return prefixes;
    }
    while (containerIterator.hasNext()) {
        KeyValue<ContainerKeyPrefix, Integer> keyValue = containerIterator.next();
        ContainerKeyPrefix containerKeyPrefix = keyValue.getKey();
        // skip the prev key if prev key is present
        if (skipPrevKey && containerKeyPrefix.getKeyPrefix().equals(prevKeyPrefix)) {
            continue;
        }
        // prefix.
        if (containerKeyPrefix.getContainerId() == containerId) {
            if (StringUtils.isNotEmpty(containerKeyPrefix.getKeyPrefix())) {
                prefixes.put(new ContainerKeyPrefix(containerId, containerKeyPrefix.getKeyPrefix(), containerKeyPrefix.getKeyVersion()), keyValue.getValue());
            } else {
                LOG.warn("Null key prefix returned for containerId = {} ", containerId);
            }
        } else {
            // Break when the first mismatch occurs.
            break;
        }
    }
    return prefixes;
}
Also used : ContainerKeyPrefix(org.apache.hadoop.ozone.recon.api.types.ContainerKeyPrefix) LinkedHashMap(java.util.LinkedHashMap)

Example 8 with ContainerKeyPrefix

use of org.apache.hadoop.ozone.recon.api.types.ContainerKeyPrefix in project ozone by apache.

the class ContainerKeyMapperTask method writeOMKeyToContainerDB.

/**
 * Write an OM key to container DB and update containerID -> no. of keys
 * count.
 *
 * @param key key String
 * @param omKeyInfo omKeyInfo value
 * @throws IOException if unable to write to recon DB.
 */
private void writeOMKeyToContainerDB(String key, OmKeyInfo omKeyInfo) throws IOException {
    long containerCountToIncrement = 0;
    for (OmKeyLocationInfoGroup omKeyLocationInfoGroup : omKeyInfo.getKeyLocationVersions()) {
        long keyVersion = omKeyLocationInfoGroup.getVersion();
        for (OmKeyLocationInfo omKeyLocationInfo : omKeyLocationInfoGroup.getLocationList()) {
            long containerId = omKeyLocationInfo.getContainerID();
            ContainerKeyPrefix containerKeyPrefix = new ContainerKeyPrefix(containerId, key, keyVersion);
            if (reconContainerMetadataManager.getCountForContainerKeyPrefix(containerKeyPrefix) == 0) {
                // Save on writes. No need to save same container-key prefix
                // mapping again.
                reconContainerMetadataManager.storeContainerKeyMapping(containerKeyPrefix, 1);
                // increment the count of containers if it does not exist
                if (!reconContainerMetadataManager.doesContainerExists(containerId)) {
                    containerCountToIncrement++;
                }
                // update the count of keys for the given 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.
                reconContainerMetadataManager.storeContainerKeyCount(containerId, ++keyCount);
            }
        }
    }
    if (containerCountToIncrement > 0) {
        reconContainerMetadataManager.incrementContainerCountBy(containerCountToIncrement);
    }
}
Also used : OmKeyLocationInfoGroup(org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfoGroup) ContainerKeyPrefix(org.apache.hadoop.ozone.recon.api.types.ContainerKeyPrefix) OmKeyLocationInfo(org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfo)

Example 9 with ContainerKeyPrefix

use of org.apache.hadoop.ozone.recon.api.types.ContainerKeyPrefix in project ozone by apache.

the class ContainerEndpoint method getKeysForContainer.

/**
 * Return @{@link org.apache.hadoop.ozone.recon.api.types.KeyMetadata} for
 * all keys that belong to the container identified by the id param
 * starting from the given "prev-key" query param for the given "limit".
 * The given prevKeyPrefix is skipped from the results returned.
 *
 * @param containerID the given containerID.
 * @param limit max no. of keys to get.
 * @param prevKeyPrefix the key prefix after which results are returned.
 * @return {@link Response}
 */
@GET
@Path("/{id}/keys")
public Response getKeysForContainer(@PathParam("id") Long containerID, @DefaultValue(DEFAULT_FETCH_COUNT) @QueryParam(RECON_QUERY_LIMIT) int limit, @DefaultValue(StringUtils.EMPTY) @QueryParam(RECON_QUERY_PREVKEY) String prevKeyPrefix) {
    Map<String, KeyMetadata> keyMetadataMap = new LinkedHashMap<>();
    long totalCount;
    try {
        Map<ContainerKeyPrefix, Integer> containerKeyPrefixMap = reconContainerMetadataManager.getKeyPrefixesForContainer(containerID, prevKeyPrefix);
        // Get set of Container-Key mappings for given containerId.
        for (ContainerKeyPrefix containerKeyPrefix : containerKeyPrefixMap.keySet()) {
            // Directly calling get() on the Key table instead of iterating since
            // only full keys are supported now. When we change to using a prefix
            // of the key, this needs to change to prefix seek.
            OmKeyInfo omKeyInfo = omMetadataManager.getKeyTable(getBucketLayout()).getSkipCache(containerKeyPrefix.getKeyPrefix());
            if (null != omKeyInfo) {
                // Filter keys by version.
                List<OmKeyLocationInfoGroup> matchedKeys = omKeyInfo.getKeyLocationVersions().stream().filter(k -> (k.getVersion() == containerKeyPrefix.getKeyVersion())).collect(Collectors.toList());
                List<ContainerBlockMetadata> blockIds = getBlocks(matchedKeys, containerID);
                String ozoneKey = omMetadataManager.getOzoneKey(omKeyInfo.getVolumeName(), omKeyInfo.getBucketName(), omKeyInfo.getKeyName());
                if (keyMetadataMap.containsKey(ozoneKey)) {
                    keyMetadataMap.get(ozoneKey).getVersions().add(containerKeyPrefix.getKeyVersion());
                    keyMetadataMap.get(ozoneKey).getBlockIds().put(containerKeyPrefix.getKeyVersion(), blockIds);
                } else {
                    // break the for loop if limit has been reached
                    if (keyMetadataMap.size() == limit) {
                        break;
                    }
                    KeyMetadata keyMetadata = new KeyMetadata();
                    keyMetadata.setBucket(omKeyInfo.getBucketName());
                    keyMetadata.setVolume(omKeyInfo.getVolumeName());
                    keyMetadata.setKey(omKeyInfo.getKeyName());
                    keyMetadata.setCreationTime(Instant.ofEpochMilli(omKeyInfo.getCreationTime()));
                    keyMetadata.setModificationTime(Instant.ofEpochMilli(omKeyInfo.getModificationTime()));
                    keyMetadata.setDataSize(omKeyInfo.getDataSize());
                    keyMetadata.getVersions().add(containerKeyPrefix.getKeyVersion());
                    keyMetadataMap.put(ozoneKey, keyMetadata);
                    keyMetadata.getBlockIds().put(containerKeyPrefix.getKeyVersion(), blockIds);
                }
            }
        }
        totalCount = reconContainerMetadataManager.getKeyCountForContainer(containerID);
    } catch (IOException ioEx) {
        throw new WebApplicationException(ioEx, Response.Status.INTERNAL_SERVER_ERROR);
    }
    KeysResponse keysResponse = new KeysResponse(totalCount, keyMetadataMap.values());
    return Response.ok(keysResponse).build();
}
Also used : DEFAULT_BATCH_NUMBER(org.apache.hadoop.ozone.recon.ReconConstants.DEFAULT_BATCH_NUMBER) Produces(javax.ws.rs.Produces) MissingContainersResponse(org.apache.hadoop.ozone.recon.api.types.MissingContainersResponse) Path(javax.ws.rs.Path) KeysResponse(org.apache.hadoop.ozone.recon.api.types.KeysResponse) StringUtils(org.apache.commons.lang3.StringUtils) ContainerBlockMetadata(org.apache.hadoop.ozone.recon.api.types.KeyMetadata.ContainerBlockMetadata) MediaType(javax.ws.rs.core.MediaType) QueryParam(javax.ws.rs.QueryParam) BucketLayout(org.apache.hadoop.ozone.om.helpers.BucketLayout) ReconContainerMetadataManager(org.apache.hadoop.ozone.recon.spi.ReconContainerMetadataManager) Map(java.util.Map) DefaultValue(javax.ws.rs.DefaultValue) ContainersResponse(org.apache.hadoop.ozone.recon.api.types.ContainersResponse) UnHealthyContainerStates(org.hadoop.ozone.recon.schema.ContainerSchemaDefinition.UnHealthyContainerStates) UnhealthyContainers(org.hadoop.ozone.recon.schema.tables.pojos.UnhealthyContainers) ReconContainerManager(org.apache.hadoop.ozone.recon.scm.ReconContainerManager) ContainerHealthSchemaManager(org.apache.hadoop.ozone.recon.persistence.ContainerHealthSchemaManager) UUID(java.util.UUID) Instant(java.time.Instant) RECON_QUERY_BATCH_PARAM(org.apache.hadoop.ozone.recon.ReconConstants.RECON_QUERY_BATCH_PARAM) Collectors(java.util.stream.Collectors) ReconOMMetadataManager(org.apache.hadoop.ozone.recon.recovery.ReconOMMetadataManager) List(java.util.List) UnhealthyContainersSummary(org.apache.hadoop.ozone.recon.api.types.UnhealthyContainersSummary) Response(javax.ws.rs.core.Response) UnhealthyContainerMetadata(org.apache.hadoop.ozone.recon.api.types.UnhealthyContainerMetadata) WebApplicationException(javax.ws.rs.WebApplicationException) ContainerInfo(org.apache.hadoop.hdds.scm.container.ContainerInfo) PathParam(javax.ws.rs.PathParam) GET(javax.ws.rs.GET) KeyMetadata(org.apache.hadoop.ozone.recon.api.types.KeyMetadata) ArrayList(java.util.ArrayList) OzoneStorageContainerManager(org.apache.hadoop.hdds.scm.server.OzoneStorageContainerManager) LinkedHashMap(java.util.LinkedHashMap) Inject(javax.inject.Inject) ContainerHistory(org.apache.hadoop.ozone.recon.persistence.ContainerHistory) RECON_QUERY_PREVKEY(org.apache.hadoop.ozone.recon.ReconConstants.RECON_QUERY_PREVKEY) OmKeyInfo(org.apache.hadoop.ozone.om.helpers.OmKeyInfo) OmKeyLocationInfo(org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfo) MissingContainerMetadata(org.apache.hadoop.ozone.recon.api.types.MissingContainerMetadata) RECON_QUERY_LIMIT(org.apache.hadoop.ozone.recon.ReconConstants.RECON_QUERY_LIMIT) PREV_CONTAINER_ID_DEFAULT_VALUE(org.apache.hadoop.ozone.recon.ReconConstants.PREV_CONTAINER_ID_DEFAULT_VALUE) ContainerKeyPrefix(org.apache.hadoop.ozone.recon.api.types.ContainerKeyPrefix) IOException(java.io.IOException) ContainerID(org.apache.hadoop.hdds.scm.container.ContainerID) ContainerMetadata(org.apache.hadoop.ozone.recon.api.types.ContainerMetadata) UnhealthyContainersResponse(org.apache.hadoop.ozone.recon.api.types.UnhealthyContainersResponse) DEFAULT_FETCH_COUNT(org.apache.hadoop.ozone.recon.ReconConstants.DEFAULT_FETCH_COUNT) OmKeyLocationInfoGroup(org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfoGroup) WebApplicationException(javax.ws.rs.WebApplicationException) ContainerBlockMetadata(org.apache.hadoop.ozone.recon.api.types.KeyMetadata.ContainerBlockMetadata) IOException(java.io.IOException) LinkedHashMap(java.util.LinkedHashMap) OmKeyLocationInfoGroup(org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfoGroup) KeyMetadata(org.apache.hadoop.ozone.recon.api.types.KeyMetadata) ContainerKeyPrefix(org.apache.hadoop.ozone.recon.api.types.ContainerKeyPrefix) OmKeyInfo(org.apache.hadoop.ozone.om.helpers.OmKeyInfo) KeysResponse(org.apache.hadoop.ozone.recon.api.types.KeysResponse) Path(javax.ws.rs.Path) GET(javax.ws.rs.GET)

Example 10 with ContainerKeyPrefix

use of org.apache.hadoop.ozone.recon.api.types.ContainerKeyPrefix in project ozone by apache.

the class TestContainerKeyMapperTask method testReprocessOMDB.

@Test
public void testReprocessOMDB() throws Exception {
    Map<ContainerKeyPrefix, Integer> keyPrefixesForContainer = reconContainerMetadataManager.getKeyPrefixesForContainer(1);
    assertTrue(keyPrefixesForContainer.isEmpty());
    keyPrefixesForContainer = reconContainerMetadataManager.getKeyPrefixesForContainer(2);
    assertTrue(keyPrefixesForContainer.isEmpty());
    Pipeline pipeline = getRandomPipeline();
    List<OmKeyLocationInfo> omKeyLocationInfoList = new ArrayList<>();
    BlockID blockID1 = new BlockID(1, 1);
    OmKeyLocationInfo omKeyLocationInfo1 = getOmKeyLocationInfo(blockID1, pipeline);
    BlockID blockID2 = new BlockID(2, 1);
    OmKeyLocationInfo omKeyLocationInfo2 = getOmKeyLocationInfo(blockID2, pipeline);
    omKeyLocationInfoList.add(omKeyLocationInfo1);
    omKeyLocationInfoList.add(omKeyLocationInfo2);
    OmKeyLocationInfoGroup omKeyLocationInfoGroup = new OmKeyLocationInfoGroup(0, omKeyLocationInfoList);
    writeDataToOm(reconOMMetadataManager, "key_one", "bucketOne", "sampleVol", Collections.singletonList(omKeyLocationInfoGroup));
    ContainerKeyMapperTask containerKeyMapperTask = new ContainerKeyMapperTask(reconContainerMetadataManager);
    containerKeyMapperTask.reprocess(reconOMMetadataManager);
    keyPrefixesForContainer = reconContainerMetadataManager.getKeyPrefixesForContainer(1);
    assertEquals(1, keyPrefixesForContainer.size());
    String omKey = omMetadataManager.getOzoneKey("sampleVol", "bucketOne", "key_one");
    ContainerKeyPrefix containerKeyPrefix = new ContainerKeyPrefix(1, omKey, 0);
    assertEquals(1, keyPrefixesForContainer.get(containerKeyPrefix).intValue());
    keyPrefixesForContainer = reconContainerMetadataManager.getKeyPrefixesForContainer(2);
    assertEquals(1, keyPrefixesForContainer.size());
    containerKeyPrefix = new ContainerKeyPrefix(2, omKey, 0);
    assertEquals(1, keyPrefixesForContainer.get(containerKeyPrefix).intValue());
    // Test if container key counts are updated
    assertEquals(1, reconContainerMetadataManager.getKeyCountForContainer(1L));
    assertEquals(1, reconContainerMetadataManager.getKeyCountForContainer(2L));
    assertEquals(0, reconContainerMetadataManager.getKeyCountForContainer(3L));
    // Test if container count is updated
    assertEquals(2, reconContainerMetadataManager.getCountForContainers());
}
Also used : OmKeyLocationInfoGroup(org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfoGroup) ContainerKeyPrefix(org.apache.hadoop.ozone.recon.api.types.ContainerKeyPrefix) ArrayList(java.util.ArrayList) BlockID(org.apache.hadoop.hdds.client.BlockID) OmKeyLocationInfo(org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfo) OMMetadataManagerTestUtils.getOmKeyLocationInfo(org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.getOmKeyLocationInfo) OMMetadataManagerTestUtils.getRandomPipeline(org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.getRandomPipeline) Pipeline(org.apache.hadoop.hdds.scm.pipeline.Pipeline) Test(org.junit.Test)

Aggregations

ContainerKeyPrefix (org.apache.hadoop.ozone.recon.api.types.ContainerKeyPrefix)16 Test (org.junit.Test)10 OmKeyLocationInfo (org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfo)4 OmKeyLocationInfoGroup (org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfoGroup)4 ArrayList (java.util.ArrayList)3 LinkedHashMap (java.util.LinkedHashMap)3 Map (java.util.Map)3 HashMap (java.util.HashMap)2 BlockID (org.apache.hadoop.hdds.client.BlockID)2 Pipeline (org.apache.hadoop.hdds.scm.pipeline.Pipeline)2 Table (org.apache.hadoop.hdds.utils.db.Table)2 OmKeyInfo (org.apache.hadoop.ozone.om.helpers.OmKeyInfo)2 OMMetadataManagerTestUtils.getOmKeyLocationInfo (org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.getOmKeyLocationInfo)2 OMMetadataManagerTestUtils.getRandomPipeline (org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.getRandomPipeline)2 ContainerMetadata (org.apache.hadoop.ozone.recon.api.types.ContainerMetadata)2 IOException (java.io.IOException)1 Instant (java.time.Instant)1 HashSet (java.util.HashSet)1 List (java.util.List)1 UUID (java.util.UUID)1