Juan Hernandez has uploaded a new change for review. Change subject: core: Make lock manager a POJO ......................................................................
core: Make lock manager a POJO Currently this is an EJB, but it doesn't need to be. Change-Id: I04c8d42a4712f8bff9e33c61b5498e09bcebec76 Signed-off-by: Juan Hernandez <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/Backend.java R backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/lock/InMemoryLockManager.java M backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/lock/LockManager.java M backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/lock/LockManagerFactory.java R backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/lock/LockManagerMonitorMXBean.java R backend/manager/modules/utils/src/test/java/org/ovirt/engine/core/utils/lock/InMemoryLockManagerTest.java 6 files changed, 51 insertions(+), 30 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/61/13261/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/Backend.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/Backend.java index e09b919..54e861f 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/Backend.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/Backend.java @@ -58,6 +58,8 @@ import org.ovirt.engine.core.utils.ejb.BeanProxyType; import org.ovirt.engine.core.utils.ejb.BeanType; import org.ovirt.engine.core.utils.ejb.EjbUtils; +import org.ovirt.engine.core.utils.lock.LockManager; +import org.ovirt.engine.core.utils.lock.LockManagerFactory; import org.ovirt.engine.core.utils.log.Log; import org.ovirt.engine.core.utils.log.LogFactory; import org.ovirt.engine.core.utils.timer.SchedulerUtilQuartzImpl; @@ -154,6 +156,10 @@ @Override public void Initialize() { log.info("Start initializing " + getClass().getSimpleName()); + + // Initialize the lock manager: + LockManagerFactory.getLockManager().init(); + // When getting a proxy to this bean using JBoss embedded, the initialize method is called for each method // invocation on the proxy, as it is called by setup method which is @PostConstruct - the initialized flag // makes sure that initialization occurs only once per class (which is ok, as this is a @Service) diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lock/InMemoryLockManager.java b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/lock/InMemoryLockManager.java similarity index 91% rename from backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lock/InMemoryLockManager.java rename to backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/lock/InMemoryLockManager.java index dbc3c26..48a6d7e 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lock/InMemoryLockManager.java +++ b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/lock/InMemoryLockManager.java @@ -1,4 +1,4 @@ -package org.ovirt.engine.core.bll.lock; +package org.ovirt.engine.core.utils.lock; import java.lang.management.ManagementFactory; import java.util.ArrayList; @@ -13,32 +13,16 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; -import javax.ejb.ConcurrencyManagement; -import javax.ejb.ConcurrencyManagementType; -import javax.ejb.Local; -import javax.ejb.Singleton; -import javax.ejb.Startup; -import javax.ejb.TransactionAttribute; -import javax.ejb.TransactionAttributeType; import javax.management.MBeanServer; import javax.management.ObjectName; import org.ovirt.engine.core.common.utils.Pair; import org.ovirt.engine.core.utils.log.Log; import org.ovirt.engine.core.utils.log.LogFactory; -import org.ovirt.engine.core.utils.lock.EngineLock; -import org.ovirt.engine.core.utils.lock.LockManager; /** * The following class an implementation of internal locking mechanism */ -@Startup -@Singleton(name = "LockManager") -@ConcurrencyManagement(ConcurrencyManagementType.BEAN) -@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) -@Local(LockManager.class) public class InMemoryLockManager implements LockManager, LockManagerMonitorMXBean { private static final Pair<Boolean, Set<String>> LOCK_INSERT_SUCCESS_RESULT = new Pair<Boolean, Set<String>>(Boolean.TRUE, Collections.<String>emptySet()); @@ -53,8 +37,40 @@ private ObjectName objectName = null; private static Log log = LogFactory.getLog(InMemoryLockManager.class); - @PostConstruct - public void registerInJMX() { + // This flag indicates if the manager has been already initialized, so that + // it is safe to call the init method more than once: + private boolean initialized = false; + + /** + * Initialize the manager if needed. This method can be safely called more + * than once and the actual initialization tasks will be performed only + * once. + */ + public synchronized void init() { + if (!initialized) { + doInit(); + initialized = true; + } + } + + /** + * Perform the actual initialization tasks. + */ + private void doInit() { + // Remember to shutdown the manager when exiting: + Runtime.getRuntime().addShutdownHook( + new Thread("Memory lock manager shutdown") { + public void run() { + unregisterFromJMX(); + } + } + ); + + // Perform the initialization tasks: + registerInJMX(); + } + + private void registerInJMX() { try { objectName = new ObjectName("InMemoryLockManager:type=" + this.getClass().getName()); platformMBeanServer = ManagementFactory.getPlatformMBeanServer(); @@ -64,8 +80,7 @@ } } - @PreDestroy - public void unregisterFromJMX() { + private void unregisterFromJMX() { try { platformMBeanServer.unregisterMBean(this.objectName); } catch (Exception e) { diff --git a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/lock/LockManager.java b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/lock/LockManager.java index 9527af7..f8788c0 100644 --- a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/lock/LockManager.java +++ b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/lock/LockManager.java @@ -11,6 +11,11 @@ public interface LockManager { /** + * Initialize the lock manager. + */ + void init(); + + /** * The following method will try to acquire provided lock * @param lock * @return true - in case of locked was acquired , false with set of appropriate error messages otherwise diff --git a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/lock/LockManagerFactory.java b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/lock/LockManagerFactory.java index 2fddc3d..968f9b7 100644 --- a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/lock/LockManagerFactory.java +++ b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/lock/LockManagerFactory.java @@ -1,12 +1,9 @@ package org.ovirt.engine.core.utils.lock; -import org.ovirt.engine.core.utils.ejb.BeanProxyType; -import org.ovirt.engine.core.utils.ejb.BeanType; -import org.ovirt.engine.core.utils.ejb.EjbUtils; - public class LockManagerFactory { + private static final LockManager instance = new InMemoryLockManager(); public static LockManager getLockManager() { - return EjbUtils.findBean(BeanType.LOCK_MANAGER, BeanProxyType.LOCAL); + return instance; } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lock/LockManagerMonitorMXBean.java b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/lock/LockManagerMonitorMXBean.java similarity index 92% rename from backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lock/LockManagerMonitorMXBean.java rename to backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/lock/LockManagerMonitorMXBean.java index cde8c44..b76da15 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lock/LockManagerMonitorMXBean.java +++ b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/lock/LockManagerMonitorMXBean.java @@ -1,4 +1,4 @@ -package org.ovirt.engine.core.bll.lock; +package org.ovirt.engine.core.utils.lock; import java.util.List; diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/lock/InMemoryLockManagerTest.java b/backend/manager/modules/utils/src/test/java/org/ovirt/engine/core/utils/lock/InMemoryLockManagerTest.java similarity index 97% rename from backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/lock/InMemoryLockManagerTest.java rename to backend/manager/modules/utils/src/test/java/org/ovirt/engine/core/utils/lock/InMemoryLockManagerTest.java index fe18344..ff5d20d 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/lock/InMemoryLockManagerTest.java +++ b/backend/manager/modules/utils/src/test/java/org/ovirt/engine/core/utils/lock/InMemoryLockManagerTest.java @@ -1,4 +1,4 @@ -package org.ovirt.engine.core.bll.lock; +package org.ovirt.engine.core.utils.lock; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -15,8 +15,6 @@ import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.utils.MockEJBStrategyRule; import org.ovirt.engine.core.utils.ejb.BeanType; -import org.ovirt.engine.core.utils.lock.EngineLock; -import org.ovirt.engine.core.utils.lock.LockManagerFactory; public class InMemoryLockManagerTest { -- To view, visit http://gerrit.ovirt.org/13261 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I04c8d42a4712f8bff9e33c61b5498e09bcebec76 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Juan Hernandez <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
