diff options
Diffstat (limited to 'integrity-monitor/src/main/java/org/onap/policy/common/im/IntegrityMonitor.java')
-rw-r--r-- | integrity-monitor/src/main/java/org/onap/policy/common/im/IntegrityMonitor.java | 371 |
1 files changed, 177 insertions, 194 deletions
diff --git a/integrity-monitor/src/main/java/org/onap/policy/common/im/IntegrityMonitor.java b/integrity-monitor/src/main/java/org/onap/policy/common/im/IntegrityMonitor.java index 68334e83..9a553dc8 100644 --- a/integrity-monitor/src/main/java/org/onap/policy/common/im/IntegrityMonitor.java +++ b/integrity-monitor/src/main/java/org/onap/policy/common/im/IntegrityMonitor.java @@ -29,7 +29,9 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Properties; +import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; +import java.util.function.Supplier; import javax.management.JMX; import javax.management.MBeanServerConnection; import javax.persistence.EntityManager; @@ -221,7 +223,7 @@ public class IntegrityMonitor { validateProperties(properties); // construct jmx url - String jmxUrl = getJmxUrl(); + String jmxUrl = getJmxUrlFromProps(); // // Create the entity manager factory @@ -433,7 +435,7 @@ public class IntegrityMonitor { logger.debug("deleteInstance() exit"); } - private static String getJmxUrl() throws IntegrityMonitorException { + private static String getJmxUrlFromProps() throws IntegrityMonitorException { // get the jmx remote port and construct the JMX URL Properties systemProps = System.getProperties(); @@ -520,53 +522,40 @@ public class IntegrityMonitor { * message is set then the evaluateSanity will return an error. * * @param dep the dependency + * @return {@code null} if success, an error message otherwise */ public String stateCheck(String dep) { logger.debug("checking state of dependent resource: {}", dep); - String errorMsg = null; - ForwardProgressEntity forwardProgressEntity = null; - StateManagementEntity stateManagementEntity = null; + AtomicReference<ForwardProgressEntity> forwardProgressEntity = new AtomicReference<>(); + AtomicReference<StateManagementEntity> stateManagementEntity = new AtomicReference<>(); - // Start a transaction - EntityTransaction et = em.getTransaction(); - et.begin(); + String errorMsg = + withinTransaction(dep + ": ForwardProgressEntity DB operation failed with exception: ", () -> { + Query query = em.createQuery( + "Select p from ForwardProgressEntity p where p.resourceName=:resource"); + query.setParameter(LC_RESOURCE_STRING, dep); - try { - Query query = em.createQuery("Select p from ForwardProgressEntity p where p.resourceName=:resource"); - query.setParameter(LC_RESOURCE_STRING, dep); + @SuppressWarnings("rawtypes") + List fpList = query.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT) + .getResultList(); - @SuppressWarnings("rawtypes") - List fpList = query.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList(); + if (!fpList.isEmpty()) { + // exists + forwardProgressEntity.set((ForwardProgressEntity) fpList.get(0)); + // refresh the object from DB in case cached data was + // returned + em.refresh(forwardProgressEntity.get()); + logger.debug("Found entry in ForwardProgressEntity table for dependent Resource={}", dep); + return null; - if (!fpList.isEmpty()) { - // exists - forwardProgressEntity = (ForwardProgressEntity) fpList.get(0); - // refresh the object from DB in case cached data was returned - em.refresh(forwardProgressEntity); - logger.debug("Found entry in ForwardProgressEntity table for dependent Resource={}", dep); - } else { - errorMsg = dep + ": resource not found in ForwardProgressEntity database table"; - logger.error("{}", errorMsg); - } - synchronized (imFlushLock) { - et.commit(); - } - } catch (Exception ex) { - // log an error - errorMsg = dep + ": ForwardProgressEntity DB operation failed with exception: "; - logger.error("{}", errorMsg, ex); - synchronized (imFlushLock) { - if (et.isActive()) { - et.rollback(); + } else { + return dep + ": resource not found in ForwardProgressEntity database table"; } - } - } + }); if (errorMsg == null) { - // Start a transaction - et = em.getTransaction(); - et.begin(); - try { + errorMsg = withinTransaction(dep + ": StateManagementEntity DB read failed with exception: ", () -> { + // query if StateManagement entry exists for dependent resource Query query = em.createQuery("Select p from StateManagementEntity p where p.resourceName=:resource"); query.setParameter(LC_RESOURCE_STRING, dep); @@ -575,39 +564,26 @@ public class IntegrityMonitor { List smList = query.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList(); if (!smList.isEmpty()) { // exist - stateManagementEntity = (StateManagementEntity) smList.get(0); + stateManagementEntity.set((StateManagementEntity) smList.get(0)); // refresh the object from DB in case cached data was // returned - em.refresh(stateManagementEntity); + em.refresh(stateManagementEntity.get()); logger.debug("Found entry in StateManagementEntity table for dependent Resource={}", dep); + return null; } else { - errorMsg = dep + ": resource not found in state management entity database table"; - logger.error("{}", errorMsg); - } - - synchronized (imFlushLock) { - et.commit(); + return dep + ": resource not found in state management entity database table"; } - } catch (Exception e) { - // log an error - errorMsg = dep + ": StateManagementEntity DB read failed with exception: "; - logger.error("{}", errorMsg, e); - synchronized (imFlushLock) { - if (et.isActive()) { - et.rollback(); - } - } - } + }); } // verify that the ForwardProgress is current (check last_updated) if (errorMsg == null) { - checkForwardProgress(dep, forwardProgressEntity, stateManagementEntity); + checkForwardProgress(dep, forwardProgressEntity.get(), stateManagementEntity.get()); } // check operation, admin and standby states of dependent resource if (errorMsg == null) { - errorMsg = checkDependentStates(dep, stateManagementEntity); + errorMsg = checkDependentStates(dep, stateManagementEntity.get()); } String returnMsg = "IntegrityMonitor.stateCheck(): returned error_msg: " + errorMsg; @@ -615,6 +591,44 @@ public class IntegrityMonitor { return errorMsg; } + /** + * Runs an action within a transaction. + * + * @param exMsg message to log and return if an exception occurs + * @param action action to apply; returns non-null if an error occurs + * @return {@code null} if success, or an error message otherwise + */ + private String withinTransaction(String exMsg, Supplier<String> action) { + String errorMsg = null; + + // Start a transaction + EntityTransaction et = em.getTransaction(); + et.begin(); + + try { + errorMsg = action.get(); + if (errorMsg != null) { + logger.error("{}", errorMsg); + } + + synchronized (imFlushLock) { + et.commit(); + } + + } catch (RuntimeException ex) { + // log an error + errorMsg = exMsg; + logger.error("{}", errorMsg, ex); + synchronized (imFlushLock) { + if (et.isActive()) { + et.rollback(); + } + } + } + + return errorMsg; + } + private void checkForwardProgress(String dep, ForwardProgressEntity forwardProgressEntity, StateManagementEntity stateManagementEntity) { if (forwardProgressEntity != null && stateManagementEntity != null) { @@ -672,58 +686,39 @@ public class IntegrityMonitor { private String fpCheck(String dep) { logger.debug("checking forward progress count of dependent resource: {}", dep); - String errorMsg = null; - - // check FPC count - a changing FPC count indicates the resource JVM is - // running - - // Start a transaction - EntityTransaction et = em.getTransaction(); - et.begin(); - try { - Query fquery = em.createQuery(QUERY_STRING); - fquery.setParameter("rn", dep); + return withinTransaction(dep + ": ForwardProgressEntity DB read failed with exception: ", () -> fpCheck2(dep)); + } - @SuppressWarnings("rawtypes") - List fpList = fquery.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList(); - ForwardProgressEntity fpx; - if (!fpList.isEmpty()) { - // ignores multiple results - fpx = (ForwardProgressEntity) fpList.get(0); - // refresh the object from DB in case cached data was returned - em.refresh(fpx); - if (logger.isDebugEnabled()) { - logger.debug("Dependent resource {} - fpc= {}, lastUpdated={}", dep, fpx.getFpcCount(), - fpx.getLastUpdated()); - } - long currTime = MonitorTime.getInstance().getMillis(); - // if dependent resource FPC has not been updated, consider it - // an error - if ((currTime - fpx.getLastUpdated().getTime()) > maxFpcUpdateIntervalMs) { - errorMsg = dep + ": FP count has not been updated in the last " + maxFpcUpdateIntervalMs + "ms"; - logger.error("{}", errorMsg); - disableEntity(dep); - } - } else { - // resource entry not found in FPC table - errorMsg = dep + ": resource not found in ForwardProgressEntity table in the DB"; - logger.error("{}", errorMsg); - } - synchronized (imFlushLock) { - et.commit(); + private String fpCheck2(String dep) { + Query fquery = em.createQuery(QUERY_STRING); + fquery.setParameter("rn", dep); + + @SuppressWarnings("rawtypes") + List fpList = fquery.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList(); + ForwardProgressEntity fpx; + if (!fpList.isEmpty()) { + // ignores multiple results + fpx = (ForwardProgressEntity) fpList.get(0); + // refresh the object from DB in case cached data was returned + em.refresh(fpx); + if (logger.isDebugEnabled()) { + logger.debug("Dependent resource {} - fpc= {}, lastUpdated={}", dep, fpx.getFpcCount(), + fpx.getLastUpdated()); } - } catch (Exception e) { - // log an error and continue - errorMsg = dep + ": ForwardProgressEntity DB read failed with exception: "; - logger.error("{}", errorMsg, e); - synchronized (imFlushLock) { - if (et.isActive()) { - et.rollback(); - } + long currTime = MonitorTime.getInstance().getMillis(); + // if dependent resource FPC has not been updated, consider it + // an error + if ((currTime - fpx.getLastUpdated().getTime()) > maxFpcUpdateIntervalMs) { + disableEntity(dep); + return dep + ": FP count has not been updated in the last " + maxFpcUpdateIntervalMs + "ms"; } - } - return errorMsg; + return null; + + } else { + // resource entry not found in FPC table + return dep + ": resource not found in ForwardProgressEntity table in the DB"; + } } /** @@ -731,113 +726,101 @@ public class IntegrityMonitor { * * @return list of all forward progress entities */ + @SuppressWarnings("unchecked") public List<ForwardProgressEntity> getAllForwardProgressEntity() { logger.debug("getAllForwardProgressEntity: entry"); + ArrayList<ForwardProgressEntity> fpList = new ArrayList<>(); - // Start a transaction - EntityTransaction et = em.getTransaction(); - et.begin(); - try { + + withinTransaction("getAllForwardProgessEntity DB read failed with exception: ", () -> { Query fquery = em.createQuery("Select e from ForwardProgressEntity e"); - @SuppressWarnings("rawtypes") - List myList = fquery.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList(); - synchronized (imFlushLock) { - et.commit(); - } - logger.debug("getAllForwardProgressEntity: myList.size(): {}", myList.size()); - for (int i = 0; i < myList.size(); i++) { - if (logger.isDebugEnabled()) { - logger.debug("getAllForwardProgressEntity: myList.get({}).getResourceName(): {}", i, - ((ForwardProgressEntity) myList.get(i)).getResourceName()); - } - fpList.add((ForwardProgressEntity) myList.get(i)); - } - synchronized (imFlushLock) { - if (et.isActive()) { - et.commit(); - } - } - } catch (Exception e) { - // log an error and continue - String msg = "getAllForwardProgessEntity DB read failed with exception: "; - logger.error("{}", msg, e); - synchronized (imFlushLock) { - if (et.isActive()) { - et.rollback(); - } - } + fquery.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList() + .forEach(obj -> fpList.add((ForwardProgressEntity) obj)); + return null; + }); + + if (!logger.isDebugEnabled()) { + return fpList; + } + + logger.debug("getAllForwardProgressEntity: fpList.size(): {}", fpList.size()); + int index = 0; + for (ForwardProgressEntity fpe : fpList) { + logger.debug("getAllForwardProgressEntity: fpList.get({}).getResourceName(): {}", index++, + fpe.getResourceName()); } + return fpList; } private String jmxCheck(String dep) { logger.debug("checking health of dependent by calling test() via JMX on resource: {}", dep); - String errorMsg = null; - // get the JMX URL from the database - String jmxUrl = null; - // Start a transaction - EntityTransaction et = em.getTransaction(); - et.begin(); - try { - // query if ResourceRegistration entry exists for resourceName - Query rquery = em.createQuery("Select r from ResourceRegistrationEntity r where r.resourceName=:rn"); - rquery.setParameter("rn", dep); + AtomicReference<String> jmxUrl = new AtomicReference<>(); - @SuppressWarnings("rawtypes") - List rrList = rquery.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList(); - ResourceRegistrationEntity rrx = null; + String errorMsg = + withinTransaction(dep + ": ResourceRegistrationEntity DB read failed with exception: ", + () -> getJmxUrlFromDb(dep, jmxUrl)); - if (!rrList.isEmpty()) { - // ignores multiple results - rrx = (ResourceRegistrationEntity) rrList.get(0); - // refresh the object from DB in case cached data was returned - em.refresh(rrx); - jmxUrl = rrx.getResourceUrl(); - if (logger.isDebugEnabled()) { - logger.debug("Dependent Resource={}, url={}, createdDate={}", dep, jmxUrl, rrx.getCreatedDate()); - } - } else { - errorMsg = dep + ": resource not found in ResourceRegistrationEntity table in the DB"; - logger.error("{}", errorMsg); - } + if (jmxUrl.get() != null) { + errorMsg = jmxCheck2(dep, jmxUrl.get(), errorMsg); + } - synchronized (imFlushLock) { - et.commit(); - } - } catch (Exception e) { - errorMsg = dep + ": ResourceRegistrationEntity DB read failed with exception: "; - logger.error("{}", errorMsg, e); - synchronized (imFlushLock) { - if (et.isActive()) { - et.rollback(); - } + return errorMsg; + } + + private String getJmxUrlFromDb(String dep, AtomicReference<String> jmxUrl) { + // query if ResourceRegistration entry exists for resourceName + Query rquery = em.createQuery( + "Select r from ResourceRegistrationEntity r where r.resourceName=:rn"); + rquery.setParameter("rn", dep); + + @SuppressWarnings("rawtypes") + List rrList = rquery.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT) + .getResultList(); + ResourceRegistrationEntity rrx = null; + + if (!rrList.isEmpty()) { + // ignores multiple results + rrx = (ResourceRegistrationEntity) rrList.get(0); + // refresh the object from DB in case cached data was + // returned + em.refresh(rrx); + jmxUrl.set(rrx.getResourceUrl()); + if (logger.isDebugEnabled()) { + logger.debug("Dependent Resource={}, url={}, createdDate={}", dep, jmxUrl.get(), + rrx.getCreatedDate()); } + + return null; + + } else { + return dep + ": resource not found in ResourceRegistrationEntity table in the DB"; } + } - if (jmxUrl != null) { - JmxAgentConnection jmxAgentConnection = null; - try { - jmxAgentConnection = new JmxAgentConnection(jmxUrl); - MBeanServerConnection mbeanServer = jmxAgentConnection.getMBeanConnection(); - ComponentAdminMBean admin = - JMX.newMXBeanProxy(mbeanServer, ComponentAdmin.getObjectName(dep), ComponentAdminMBean.class); - - // invoke the test method via the jmx proxy - admin.test(); - logger.debug("Dependent resource {} sanity test passed", dep); - } catch (Exception e) { - errorMsg = dep + ": resource sanity test failed with exception: "; - logger.error("{}", errorMsg, e); - } finally { - // close the JMX connector - if (jmxAgentConnection != null) { - jmxAgentConnection.disconnect(); - } + private String jmxCheck2(String dep, String jmxUrl, String errorMsg) { + JmxAgentConnection jmxAgentConnection = null; + try { + jmxAgentConnection = new JmxAgentConnection(jmxUrl); + MBeanServerConnection mbeanServer = jmxAgentConnection.getMBeanConnection(); + ComponentAdminMBean admin = + JMX.newMXBeanProxy(mbeanServer, ComponentAdmin.getObjectName(dep), ComponentAdminMBean.class); + + // invoke the test method via the jmx proxy + admin.test(); + logger.debug("Dependent resource {} sanity test passed", dep); + } catch (Exception e) { + String errorMsg2 = dep + ": resource sanity test failed with exception: "; + logger.error("{}", errorMsg2, e); + return errorMsg2; + } finally { + // close the JMX connector + if (jmxAgentConnection != null) { + jmxAgentConnection.disconnect(); } } - return errorMsg; } |