From 685f2090fa1f7f23254b7f959276b64b604d67e3 Mon Sep 17 00:00:00 2001 From: Michael Vorburger Date: Thu, 24 Nov 2016 21:08:38 +0100 Subject: [PATCH] idmanager remove usage of @deprecated CacheUtil Specifically, this also solves a problem in the InterfaceManagerConfigurationTest (InterfaceManagerTest) related to stale content surviving between tests in this cache, due to static (that problem could have been "resolved" via CacheUtil.destroyCache() as well, but this is much cleaner). Because the IdManagerCacheCli cannot use the CacheUtil with static methods anymore now, we introduce a simple IdManagerMonitor interface, have IdManager implement that to expose the ConcurrentMap localPool, just as Map so as to not leak the IdLocalPool out of the implementation. With a little bit of blueprint XML wiring magic, the IdManagerCacheCli can lookup that IdManagerMonitor from the OSGi service registry, and do the same as it did before. FTR: I've manually non-regression tested this, and verified that genius/karaf with this change still comes up without errors, and that the "idmanager:show" command does not blow up when used. Change-Id: I47b92ece98fae0bce4390472c18f6833b43e7843 Signed-off-by: Michael Vorburger --- .../idmanager/api/IdManagerMonitor.java | 28 +++++++++++ .../genius/idmanager/IdManager.java | 20 ++++++-- .../genius/idmanager/IdUtils.java | 1 - .../org/opendaylight/blueprint/idmanager.xml | 2 + .../idmanager/shell/IdManagerCacheCli.java | 48 +++++++++---------- .../OSGI-INF/blueprint/blueprint.xml | 9 +++- 6 files changed, 76 insertions(+), 32 deletions(-) create mode 100644 idmanager/idmanager-api/src/main/java/org/opendaylight/genius/idmanager/api/IdManagerMonitor.java diff --git a/idmanager/idmanager-api/src/main/java/org/opendaylight/genius/idmanager/api/IdManagerMonitor.java b/idmanager/idmanager-api/src/main/java/org/opendaylight/genius/idmanager/api/IdManagerMonitor.java new file mode 100644 index 000000000..17a89ab2c --- /dev/null +++ b/idmanager/idmanager-api/src/main/java/org/opendaylight/genius/idmanager/api/IdManagerMonitor.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2016 Red Hat, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.genius.idmanager.api; + +import java.util.Map; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService; + +/** + * Monitoring for {@link IdManagerService}. + * + * @author Michael Vorburger + */ +public interface IdManagerMonitor { + + /** + * Obtain description of ID pool/s. Suitable for usage e.g. by a CLI tool. + * + * @return Map with poolName as key, and a String describing the pool + * (e.g. with information about availableIds & releasedIds) + */ + Map getLocalPoolsDetails(); + +} diff --git a/idmanager/idmanager-impl/src/main/java/org/opendaylight/genius/idmanager/IdManager.java b/idmanager/idmanager-impl/src/main/java/org/opendaylight/genius/idmanager/IdManager.java index 6337a09a6..8f79490c2 100644 --- a/idmanager/idmanager-impl/src/main/java/org/opendaylight/genius/idmanager/IdManager.java +++ b/idmanager/idmanager-impl/src/main/java/org/opendaylight/genius/idmanager/IdManager.java @@ -9,16 +9,20 @@ package org.opendaylight.genius.idmanager; import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.CONFIGURATION; + import com.google.common.base.Optional; import com.google.common.util.concurrent.CheckedFuture; import com.google.common.util.concurrent.Futures; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.NoSuchElementException; import java.util.Timer; import java.util.TimerTask; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @@ -33,13 +37,13 @@ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; import org.opendaylight.genius.datastoreutils.DataStoreJobCoordinator; import org.opendaylight.genius.idmanager.ReleasedIdHolder.DelayedIdEntry; +import org.opendaylight.genius.idmanager.api.IdManagerMonitor; import org.opendaylight.genius.idmanager.jobs.CleanUpJob; import org.opendaylight.genius.idmanager.jobs.IdHolderSyncJob; import org.opendaylight.genius.idmanager.jobs.LocalPoolCreateJob; import org.opendaylight.genius.idmanager.jobs.LocalPoolDeleteJob; import org.opendaylight.genius.idmanager.jobs.UpdateIdEntryJob; import org.opendaylight.genius.mdsalutil.MDSALUtil; -import org.opendaylight.genius.utils.cache.CacheUtil; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdOutputBuilder; @@ -70,7 +74,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Singleton -public class IdManager implements IdManagerService { +public class IdManager implements IdManagerService, IdManagerMonitor { private static final Logger LOG = LoggerFactory.getLogger(IdManager.class); private static final long DEFAULT_IDLE_TIME = 24 * 60 * 60; @@ -87,12 +91,17 @@ public class IdManager implements IdManagerService { this.broker = db; this.lockManager = lockManager; this.idUtils = idUtils; - - CacheUtil.createCache(IdUtils.ID_POOL_CACHE); - localPool = (ConcurrentMap) CacheUtil.getCache(IdUtils.ID_POOL_CACHE); + this.localPool = new ConcurrentHashMap<>(); populateCache(); } + @Override + public Map getLocalPoolsDetails() { + Map map = new HashMap<>(); + localPool.entrySet().stream().forEach(entry -> map.put(entry.getKey(), entry.getValue().toString())); + return map; + } + @PostConstruct public void start() { LOG.info("{} start", getClass().getSimpleName()); @@ -655,4 +664,5 @@ public class IdManager implements IdManagerService { } localPool.put(parentPoolName, localPoolCache); } + } diff --git a/idmanager/idmanager-impl/src/main/java/org/opendaylight/genius/idmanager/IdUtils.java b/idmanager/idmanager-impl/src/main/java/org/opendaylight/genius/idmanager/IdUtils.java index a9df6fd9c..f16981164 100644 --- a/idmanager/idmanager-impl/src/main/java/org/opendaylight/genius/idmanager/IdUtils.java +++ b/idmanager/idmanager-impl/src/main/java/org/opendaylight/genius/idmanager/IdUtils.java @@ -58,7 +58,6 @@ public class IdUtils { private static final long DEFAULT_AVAILABLE_ID_COUNT = 0; private static final int DEFAULT_BLOCK_SIZE_DIFF = 10; public static final int RETRY_COUNT = 6; - public static final String ID_POOL_CACHE = "ID_POOL_CACHE"; private final ConcurrentHashMap poolUpdatedMap = new ConcurrentHashMap<>(); diff --git a/idmanager/idmanager-impl/src/main/resources/org/opendaylight/blueprint/idmanager.xml b/idmanager/idmanager-impl/src/main/resources/org/opendaylight/blueprint/idmanager.xml index 3c30352c7..3ebed44b2 100644 --- a/idmanager/idmanager-impl/src/main/resources/org/opendaylight/blueprint/idmanager.xml +++ b/idmanager/idmanager-impl/src/main/resources/org/opendaylight/blueprint/idmanager.xml @@ -19,4 +19,6 @@ and is available at http://www.eclipse.org/legal/epl-v10.html + + diff --git a/idmanager/idmanager-shell/src/main/java/org/opendaylight/genius/idmanager/shell/IdManagerCacheCli.java b/idmanager/idmanager-shell/src/main/java/org/opendaylight/genius/idmanager/shell/IdManagerCacheCli.java index f44f42e3a..0d42b4cae 100644 --- a/idmanager/idmanager-shell/src/main/java/org/opendaylight/genius/idmanager/shell/IdManagerCacheCli.java +++ b/idmanager/idmanager-shell/src/main/java/org/opendaylight/genius/idmanager/shell/IdManagerCacheCli.java @@ -8,13 +8,11 @@ package org.opendaylight.genius.idmanager.shell; -import java.util.concurrent.ConcurrentMap; - +import java.util.Map; import org.apache.karaf.shell.commands.Command; import org.apache.karaf.shell.commands.Option; import org.apache.karaf.shell.console.OsgiCommandSupport; -import org.opendaylight.genius.idmanager.IdUtils; -import org.opendaylight.genius.utils.cache.CacheUtil; +import org.opendaylight.genius.idmanager.api.IdManagerMonitor; @Command(scope = "idmanager", name = "show", description = "display local pool id cache") public class IdManagerCacheCli extends OsgiCommandSupport { @@ -24,38 +22,40 @@ public class IdManagerCacheCli extends OsgiCommandSupport { required = false, multiValued = false) String poolName; - @Override - protected Object doExecute() throws Exception { - showIdPoolCache(); - return null; + private IdManagerMonitor idManagerMonitor; + + public void setIdManagerMonitor(IdManagerMonitor idManagerMonitor) { + this.idManagerMonitor = idManagerMonitor; } - private void showIdPoolCache() { - ConcurrentMap cache = (ConcurrentMap) CacheUtil.getCache(IdUtils.ID_POOL_CACHE); - if (cache == null) { - session.getConsole().println("No caches available"); - return; + @Override + protected Object doExecute() throws Exception { + if (idManagerMonitor == null) { + session.getConsole().println("No IdManagerMonitor service available"); + return null; } + Map cache = idManagerMonitor.getLocalPoolsDetails(); session.getConsole().println("No of pools in cluster " + cache.keySet().size()); session.getConsole().println(DEMARCATION); if (poolName == null) { - for (String idPoolName : cache.keySet()) { + cache.keySet().stream().forEach(idPoolName -> { print(idPoolName, cache.get(idPoolName)); session.getConsole().println(DEMARCATION); session.getConsole().println(DEMARCATION); + }); + } else { + Object idPool = cache.get(poolName); + if (idPool == null) { + session.getConsole().println("Local Id pool not found for " + poolName); + } else { + print(poolName, idPool); } - return; } - Object idPool = cache.get(poolName); - if (idPool == null) { - session.getConsole().println("Local Id pool not found for " + poolName); - return; - } - print(poolName, idPool); + return null; } private void print(String idPoolName, Object idPool) { - session.getConsole().println("Pool name : " + idPoolName); - session.getConsole().println("IdPool " + idPool); + session.getConsole().println("Pool name: " + idPoolName); + session.getConsole().println("IdPool: " + idPool); } -} \ No newline at end of file +} diff --git a/idmanager/idmanager-shell/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/idmanager/idmanager-shell/src/main/resources/OSGI-INF/blueprint/blueprint.xml index 220f2f3c3..49dce2d50 100644 --- a/idmanager/idmanager-shell/src/main/resources/OSGI-INF/blueprint/blueprint.xml +++ b/idmanager/idmanager-shell/src/main/resources/OSGI-INF/blueprint/blueprint.xml @@ -6,9 +6,14 @@ --> + + + - + + + - \ No newline at end of file + -- 2.36.6