diff options
author | 2024-11-29 13:03:21 +0000 | |
---|---|---|
committer | 2024-12-02 14:21:24 +0000 | |
commit | d4d6f08e86ff4a4aaf849dd2f5227c292ade6247 (patch) | |
tree | 1072ff44a782cbe29c9e0e95fef76e4ef4d34c58 /cps-ncmp-service/src/main | |
parent | 7cd33c3f6784b5df58cb242847719c4faec7eca3 (diff) |
Faster CM-handle searches using Hazelcast optimization
This uses IMap::getAll(setOfKeys) to bulk read trust levels.
This reduces CM-handle search time by a third.
Issue-ID: CPS-2420
Signed-off-by: danielhanrahan <daniel.hanrahan@est.tech>
Change-Id: Ie63b45a76bee146def537b749074ecbb7715e6fc
Diffstat (limited to 'cps-ncmp-service/src/main')
4 files changed, 52 insertions, 29 deletions
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/NetworkCmProxyInventoryFacade.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/NetworkCmProxyInventoryFacade.java index ec440f4905..c05754da91 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/NetworkCmProxyInventoryFacade.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/NetworkCmProxyInventoryFacade.java @@ -168,7 +168,7 @@ public class NetworkCmProxyInventoryFacade { validateCmHandleQueryParameters(cmHandleQueryServiceParameters, CmHandleQueryConditions.ALL_CONDITION_NAMES); final Collection<NcmpServiceCmHandle> ncmpServiceCmHandles = parameterizedCmHandleQueryService.queryCmHandles(cmHandleQueryServiceParameters); - ncmpServiceCmHandles.forEach(this::applyCurrentTrustLevel); + trustLevelManager.applyEffectiveTrustLevels(ncmpServiceCmHandles); return ncmpServiceCmHandles; } @@ -209,7 +209,7 @@ public class NetworkCmProxyInventoryFacade { final String cmHandleId = alternateIdMatcher.getCmHandleId(cmHandleReference); final NcmpServiceCmHandle ncmpServiceCmHandle = YangDataConverter.toNcmpServiceCmHandle( inventoryPersistence.getYangModelCmHandle(cmHandleId)); - applyCurrentTrustLevel(ncmpServiceCmHandle); + trustLevelManager.applyEffectiveTrustLevel(ncmpServiceCmHandle); return ncmpServiceCmHandle; } @@ -236,9 +236,4 @@ public class NetworkCmProxyInventoryFacade { return inventoryPersistence.getYangModelCmHandle(cmHandleId).getCompositeState(); } - private void applyCurrentTrustLevel(final NcmpServiceCmHandle ncmpServiceCmHandle) { - ncmpServiceCmHandle.setCurrentTrustLevel(trustLevelManager - .getEffectiveTrustLevel(ncmpServiceCmHandle.getCmHandleId())); - } - } diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleQueryServiceImpl.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleQueryServiceImpl.java index 1490d69881..4491044d89 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleQueryServiceImpl.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleQueryServiceImpl.java @@ -62,7 +62,7 @@ public class CmHandleQueryServiceImpl implements CmHandleQueryService { private final Map<String, TrustLevel> trustLevelPerDmiPlugin; @Qualifier(TrustLevelCacheConfig.TRUST_LEVEL_PER_CM_HANDLE) - private final Map<String, TrustLevel> trustLevelPerCmHandle; + private final Map<String, TrustLevel> trustLevelPerCmHandleId; private final CpsValidator cpsValidator; @@ -164,7 +164,7 @@ public class CmHandleQueryServiceImpl implements CmHandleQueryService { getCmHandleReferencesMapByDmiPluginIdentifier(dmiPluginIdentifier); for (final Map.Entry<String, String> candidateCmHandleReference : candidateCmHandleReferences.entrySet()) { final TrustLevel candidateCmHandleTrustLevel = - trustLevelPerCmHandle.get(candidateCmHandleReference.getKey()); + trustLevelPerCmHandleId.get(candidateCmHandleReference.getKey()); final TrustLevel effectiveTrustlevel = candidateCmHandleTrustLevel.getEffectiveTrustLevel(dmiTrustLevel); if (targetTrustLevel.equals(effectiveTrustlevel)) { diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/trustlevel/TrustLevelCacheConfig.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/trustlevel/TrustLevelCacheConfig.java index 06ca67e57e..f9ad3ff937 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/trustlevel/TrustLevelCacheConfig.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/trustlevel/TrustLevelCacheConfig.java @@ -21,7 +21,7 @@ package org.onap.cps.ncmp.impl.inventory.trustlevel; import com.hazelcast.config.MapConfig; -import java.util.Map; +import com.hazelcast.map.IMap; import org.onap.cps.ncmp.api.inventory.models.TrustLevel; import org.onap.cps.ncmp.impl.cache.HazelcastCacheConfig; import org.springframework.context.annotation.Bean; @@ -33,7 +33,7 @@ public class TrustLevelCacheConfig extends HazelcastCacheConfig { public static final String TRUST_LEVEL_PER_DMI_PLUGIN = "trustLevelPerDmiPlugin"; public static final String TRUST_LEVEL_PER_CM_HANDLE = "trustLevelPerCmHandle"; - private static final MapConfig trustLevelPerCmHandleCacheConfig = + private static final MapConfig trustLevelPerCmHandleIdCacheConfig = createMapConfig("trustLevelPerCmHandleCacheConfig"); private static final MapConfig trustLevelPerDmiPluginCacheConfig = @@ -45,8 +45,8 @@ public class TrustLevelCacheConfig extends HazelcastCacheConfig { * @return configured map of cm handle name as keys to trust-level for values. */ @Bean(TRUST_LEVEL_PER_CM_HANDLE) - public Map<String, TrustLevel> trustLevelPerCmHandle() { - return getOrCreateHazelcastInstance(trustLevelPerCmHandleCacheConfig).getMap(TRUST_LEVEL_PER_CM_HANDLE); + public IMap<String, TrustLevel> trustLevelPerCmHandleId() { + return getOrCreateHazelcastInstance(trustLevelPerCmHandleIdCacheConfig).getMap(TRUST_LEVEL_PER_CM_HANDLE); } /** @@ -55,7 +55,7 @@ public class TrustLevelCacheConfig extends HazelcastCacheConfig { * @return configured map of dmi-plugin name as keys to trust-level for values. */ @Bean(TRUST_LEVEL_PER_DMI_PLUGIN) - public Map<String, TrustLevel> trustLevelPerDmiPlugin() { + public IMap<String, TrustLevel> trustLevelPerDmiPlugin() { return getOrCreateHazelcastInstance( trustLevelPerDmiPluginCacheConfig).getMap(TRUST_LEVEL_PER_DMI_PLUGIN); } diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/trustlevel/TrustLevelManager.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/trustlevel/TrustLevelManager.java index 9b0cc3a0c0..a10e8ba308 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/trustlevel/TrustLevelManager.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/trustlevel/TrustLevelManager.java @@ -20,11 +20,16 @@ package org.onap.cps.ncmp.impl.inventory.trustlevel; +import com.hazelcast.map.IMap; import java.util.Collection; +import java.util.Collections; import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.onap.cps.ncmp.api.inventory.models.DmiPluginRegistration; +import org.onap.cps.ncmp.api.inventory.models.NcmpServiceCmHandle; import org.onap.cps.ncmp.api.inventory.models.TrustLevel; import org.onap.cps.ncmp.impl.inventory.InventoryPersistence; import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle; @@ -39,10 +44,10 @@ import org.springframework.stereotype.Service; public class TrustLevelManager { @Qualifier(TrustLevelCacheConfig.TRUST_LEVEL_PER_CM_HANDLE) - private final Map<String, TrustLevel> trustLevelPerCmHandle; + private final IMap<String, TrustLevel> trustLevelPerCmHandleId; @Qualifier(TrustLevelCacheConfig.TRUST_LEVEL_PER_DMI_PLUGIN) - private final Map<String, TrustLevel> trustLevelPerDmiPlugin; + private final IMap<String, TrustLevel> trustLevelPerDmiPlugin; private final InventoryPersistence inventoryPersistence; private final CmAvcEventPublisher cmAvcEventPublisher; @@ -72,14 +77,14 @@ public class TrustLevelManager { public void registerCmHandles(final Map<String, TrustLevel> cmHandlesToBeCreated) { for (final Map.Entry<String, TrustLevel> entry : cmHandlesToBeCreated.entrySet()) { final String cmHandleId = entry.getKey(); - if (trustLevelPerCmHandle.containsKey(cmHandleId)) { + if (trustLevelPerCmHandleId.containsKey(cmHandleId)) { log.warn("Cm handle: {} already registered", cmHandleId); } else { TrustLevel initialTrustLevel = entry.getValue(); if (initialTrustLevel == null) { initialTrustLevel = TrustLevel.COMPLETE; } - trustLevelPerCmHandle.put(cmHandleId, initialTrustLevel); + trustLevelPerCmHandleId.put(cmHandleId, initialTrustLevel); if (TrustLevel.NONE.equals(initialTrustLevel)) { cmAvcEventPublisher.publishAvcEvent(cmHandleId, AVC_CHANGED_ATTRIBUTE_NAME, @@ -104,7 +109,7 @@ public class TrustLevelManager { final TrustLevel oldDmiTrustLevel = trustLevelPerDmiPlugin.get(dmiServiceName); trustLevelPerDmiPlugin.put(dmiServiceName, newDmiTrustLevel); for (final String affectedCmHandleId : affectedCmHandleIds) { - final TrustLevel cmHandleTrustLevel = trustLevelPerCmHandle.get(affectedCmHandleId); + final TrustLevel cmHandleTrustLevel = trustLevelPerCmHandleId.get(affectedCmHandleId); final TrustLevel oldEffectiveTrustLevel = cmHandleTrustLevel.getEffectiveTrustLevel(oldDmiTrustLevel); final TrustLevel newEffectiveTrustLevel = cmHandleTrustLevel.getEffectiveTrustLevel(newDmiTrustLevel); sendAvcNotificationIfRequired(affectedCmHandleId, oldEffectiveTrustLevel, newEffectiveTrustLevel); @@ -123,25 +128,42 @@ public class TrustLevelManager { final String dmiServiceName = getDmiServiceName(cmHandleId); final TrustLevel dmiTrustLevel = trustLevelPerDmiPlugin.get(dmiServiceName); - final TrustLevel oldCmHandleTrustLevel = trustLevelPerCmHandle.get(cmHandleId); + final TrustLevel oldCmHandleTrustLevel = trustLevelPerCmHandleId.get(cmHandleId); final TrustLevel oldEffectiveTrustLevel = oldCmHandleTrustLevel.getEffectiveTrustLevel(dmiTrustLevel); final TrustLevel newEffectiveTrustLevel = newCmHandleTrustLevel.getEffectiveTrustLevel(dmiTrustLevel); - trustLevelPerCmHandle.put(cmHandleId, newCmHandleTrustLevel); + trustLevelPerCmHandleId.put(cmHandleId, newCmHandleTrustLevel); sendAvcNotificationIfRequired(cmHandleId, oldEffectiveTrustLevel, newEffectiveTrustLevel); } /** - * Select effective trust level among device and dmi plugin. + * Apply effective trust levels for a collection of cm handles. + * Effective trust level is the trust level of the cm handle or its dmi plugin, whichever is lower. * - * @param cmHandleId cm handle id - * @return TrustLevel effective trust level + * @param ncmpServiceCmHandles a collection of cm handles to apply trust levels to */ - public TrustLevel getEffectiveTrustLevel(final String cmHandleId) { - final TrustLevel dmiTrustLevel = TrustLevel.COMPLETE; // TODO: CPS-2375 - final TrustLevel cmHandleTrustLevel = trustLevelPerCmHandle.getOrDefault(cmHandleId, TrustLevel.NONE); - return dmiTrustLevel.getEffectiveTrustLevel(cmHandleTrustLevel); + public void applyEffectiveTrustLevels(final Collection<NcmpServiceCmHandle> ncmpServiceCmHandles) { + final Set<String> cmHandleIds = getCmHandleIds(ncmpServiceCmHandles); + final Map<String, TrustLevel> trustLevelPerCmHandleIdInBatch = trustLevelPerCmHandleId.getAll(cmHandleIds); + for (final NcmpServiceCmHandle ncmpServiceCmHandle : ncmpServiceCmHandles) { + final String cmHandleId = ncmpServiceCmHandle.getCmHandleId(); + final TrustLevel dmiTrustLevel = TrustLevel.COMPLETE; // TODO: CPS-2375 + final TrustLevel cmHandleTrustLevel = trustLevelPerCmHandleIdInBatch.getOrDefault(cmHandleId, + TrustLevel.NONE); + final TrustLevel effectiveTrustLevel = dmiTrustLevel.getEffectiveTrustLevel(cmHandleTrustLevel); + ncmpServiceCmHandle.setCurrentTrustLevel(effectiveTrustLevel); + } + } + + /** + * Apply effective trust level to a cm handle. + * Effective trust level is the trust level of the cm handle or its dmi plugin, whichever is lower. + * + * @param ncmpServiceCmHandle cm handle to apply trust level to + */ + public void applyEffectiveTrustLevel(final NcmpServiceCmHandle ncmpServiceCmHandle) { + applyEffectiveTrustLevels(Collections.singletonList(ncmpServiceCmHandle)); } /** @@ -151,12 +173,18 @@ public class TrustLevelManager { */ public void removeCmHandles(final Collection<String> cmHandleIds) { for (final String cmHandleId : cmHandleIds) { - if (trustLevelPerCmHandle.remove(cmHandleId) == null) { + if (trustLevelPerCmHandleId.remove(cmHandleId) == null) { log.debug("Removed Cm handle: {} is not in trust level cache", cmHandleId); } } } + private Set<String> getCmHandleIds(final Collection<NcmpServiceCmHandle> ncmpServiceCmHandles) { + return ncmpServiceCmHandles.stream() + .map(NcmpServiceCmHandle::getCmHandleId) + .collect(Collectors.toUnmodifiableSet()); + } + private String getDmiServiceName(final String cmHandleId) { final YangModelCmHandle yangModelCmHandle = inventoryPersistence.getYangModelCmHandle(cmHandleId); return yangModelCmHandle.resolveDmiServiceName(RequiredDmiService.DATA); |