import java.util.Map;
import java.util.Properties;
import java.util.Set;
+import java.util.function.BiConsumer;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
* @throws DbDaoTransactionException if an error occurs
*/
public IntegrityAuditEntity getMyIntegrityAuditEntity() throws DbDaoTransactionException {
- try {
- EntityManager em = emf.createEntityManager();
-
- // Start a transaction
- EntityTransaction et = em.getTransaction();
-
- et.begin();
- // if IntegrityAuditEntity entry exists for resourceName and PU, retrieve it
- Query iaequery = em.createQuery(
- SELECT_STRING);
- iaequery.setParameter("rn", this.resourceName);
- iaequery.setParameter("pu", this.persistenceUnit);
+ return updateIae("getMyIntegrityAuditEntity", this.resourceName, this.persistenceUnit, (em,iae) -> {
- @SuppressWarnings("rawtypes")
- List iaeList = iaequery.getResultList();
- IntegrityAuditEntity iae = null;
-
- if (!iaeList.isEmpty()) {
- // ignores multiple results
- iae = (IntegrityAuditEntity) iaeList.get(0);
+ if (iae != null) {
// refresh the object from DB in case cached data was returned
em.refresh(iae);
logger.info(RESOURCE_MESSAGE + this.resourceName + WITH_PERSISTENCE_MESSAGE + this.persistenceUnit
logger.error("Attempting to setLastUpdated" + " on an entry that does not exist: resource "
+ this.resourceName + WITH_PERSISTENCE_MESSAGE + this.persistenceUnit);
}
-
- // close the transaction
- et.commit();
- // close the EntityManager
- em.close();
-
- return iae;
- } catch (Exception e) {
- String msg = DBDAO_MESSAGE + "setLastUpdated() " + ENCOUNTERED_MESSAGE;
- logger.error(msg + e);
- throw new DbDaoTransactionException(e);
- }
+ });
}
* default
*/
private void register(String altDbUrl) throws DbDaoTransactionException {
- try {
- EntityManager em = emf.createEntityManager();
-
- // Start a transaction
- EntityTransaction et = em.getTransaction();
- et.begin();
-
- // if IntegrityAuditEntity entry exists for resourceName and PU, update it. If not
- // found, create a new entry
- Query iaequery = em.createQuery(
- SELECT_STRING);
- iaequery.setParameter("rn", this.resourceName);
- iaequery.setParameter("pu", this.persistenceUnit);
-
- @SuppressWarnings("rawtypes")
- List iaeList = iaequery.getResultList();
- IntegrityAuditEntity iae;
+ updateIae("register", this.resourceName, this.persistenceUnit, (em,iae) -> {
+ IntegrityAuditEntity iae2 = iae;
// If it already exists, we just want to update the properties and lastUpdated date
- if (!iaeList.isEmpty()) {
- // ignores multiple results
- iae = (IntegrityAuditEntity) iaeList.get(0);
+ if (iae2 != null) {
// refresh the object from DB in case cached data was returned
- em.refresh(iae);
+ em.refresh(iae2);
logger.info(RESOURCE_MESSAGE + this.resourceName + WITH_PERSISTENCE_MESSAGE + this.persistenceUnit
+ " exists and entry be updated");
} else {
// designated values
logger.info("Adding resource " + resourceName + WITH_PERSISTENCE_MESSAGE + this.persistenceUnit
+ " to IntegrityAuditEntity table");
- iae = new IntegrityAuditEntity();
- iae.setResourceName(this.resourceName);
- iae.setPersistenceUnit(this.persistenceUnit);
- iae.setDesignated(false);
+ iae2 = new IntegrityAuditEntity();
+ iae2.setResourceName(this.resourceName);
+ iae2.setPersistenceUnit(this.persistenceUnit);
+ iae2.setDesignated(false);
}
- // update/set properties in entry
- iae.setSite(this.siteName);
- iae.setNodeType(this.nodeType);
- iae.setJdbcDriver(this.dbDriver);
- iae.setJdbcPassword(properties.getProperty(IntegrityAuditProperties.DB_PWD).trim());
- iae.setJdbcUrl(altDbUrl == null ? this.dbUrl : altDbUrl);
- iae.setJdbcUser(dbUser);
-
- em.persist(iae);
- // flush to the DB
- em.flush();
- // commit transaction
- et.commit();
- em.close();
- } catch (Exception e) {
- String msg = DBDAO_MESSAGE + "register() " + "encountered a problem in execution: ";
- logger.error(msg + e);
- throw new DbDaoTransactionException(e);
- }
+ register2(altDbUrl, em, iae2);
+ });
}
+ private void register2(String altDbUrl, EntityManager em, IntegrityAuditEntity iae) {
+ // update/set properties in entry
+ iae.setSite(this.siteName);
+ iae.setNodeType(this.nodeType);
+ iae.setJdbcDriver(this.dbDriver);
+ iae.setJdbcPassword(properties.getProperty(IntegrityAuditProperties.DB_PWD).trim());
+ iae.setJdbcUrl(altDbUrl == null ? this.dbUrl : altDbUrl);
+ iae.setJdbcUser(dbUser);
+
+ em.persist(iae);
+ // flush to the DB
+ em.flush();
+ }
+
public void setDesignated(boolean designated) throws DbDaoTransactionException {
setDesignated(this.resourceName, this.persistenceUnit, designated);
}
throws DbDaoTransactionException {
logger.debug("setDesignated: enter, resourceName: " + resourceName + ", persistenceUnit: " + persistenceUnit
+ ", designated: " + desig);
+
+ updateIae("setDesignated", resourceName, persistenceUnit, (em,iae) -> {
+
+ if (iae != null) {
+ // refresh the object from DB in case cached data was returned
+ em.refresh(iae);
+ logger.info(RESOURCE_MESSAGE + resourceName + WITH_PERSISTENCE_MESSAGE + persistenceUnit
+ + " exists and designated be updated");
+ iae.setDesignated(desig);
+
+ em.persist(iae);
+ // flush to the DB
+ em.flush();
+ } else {
+ // If it does not exist, log an error
+ logger.error("Attempting to setDesignated(" + desig + ") on an entry that does not exist:"
+ + " resource " + resourceName + WITH_PERSISTENCE_MESSAGE + persistenceUnit);
+ }
+ });
+
+ }
+
+ /**
+ * Queries for an audit entity and then updates it using an "updater" function.
+ *
+ * @param methodName name of the method that invoked this
+ * @param resourceName the resource name
+ * @param persistenceUnit the persistence unit
+ * @param updater function to update the entity; the argument will be the entity to be
+ * updated, or {@code null} if the entity is not found
+ * @return the entity that was found, or {@code null} if the entity is not found
+ * @throws DbDaoTransactionException if an error occurs
+ */
+ private IntegrityAuditEntity updateIae(String methodName, String resourceName, String persistenceUnit,
+ BiConsumer<EntityManager,IntegrityAuditEntity> updater) throws DbDaoTransactionException {
try {
EntityManager em = emf.createEntityManager();
// if IntegrityAuditEntity entry exists for resourceName and PU, update it. If not
// found, create a new entry
- Query iaequery = em.createQuery(
- SELECT_STRING);
+ Query iaequery = em.createQuery(SELECT_STRING);
iaequery.setParameter("rn", resourceName);
iaequery.setParameter("pu", persistenceUnit);
if (!iaeList.isEmpty()) {
// ignores multiple results
iae = (IntegrityAuditEntity) iaeList.get(0);
- // refresh the object from DB in case cached data was returned
- em.refresh(iae);
- logger.info(RESOURCE_MESSAGE + resourceName + WITH_PERSISTENCE_MESSAGE + persistenceUnit
- + " exists and designated be updated");
- iae.setDesignated(desig);
- em.persist(iae);
- // flush to the DB
- em.flush();
} else {
- // If it does not exist, log an error
- logger.error("Attempting to setDesignated(" + desig + ") on an entry that does not exist:"
- + " resource " + resourceName + WITH_PERSISTENCE_MESSAGE + persistenceUnit);
+ // If it does not exist
+ iae = null;
}
+ updater.accept(em, iae);
+
// close the transaction
et.commit();
// close the EntityManager
em.close();
+
+ return iae;
+
} catch (Exception e) {
- String msg = DBDAO_MESSAGE + "setDesignated() " + ENCOUNTERED_MESSAGE;
+ String msg = DBDAO_MESSAGE + methodName + "() " + ENCOUNTERED_MESSAGE;
logger.error(msg + e);
throw new DbDaoTransactionException(e);
}
public void setLastUpdated() throws DbDaoTransactionException {
logger.debug("setLastUpdated: enter, resourceName: " + this.resourceName + ", persistenceUnit: "
+ this.persistenceUnit);
- try {
- EntityManager em = emf.createEntityManager();
- // Start a transaction
- EntityTransaction et = em.getTransaction();
+ updateIae("setLastUpdated", this.resourceName, this.persistenceUnit, (em,iae) -> {
- et.begin();
-
- // if IntegrityAuditEntity entry exists for resourceName and PU, update it. If not
- // found, create a new entry
- Query iaequery = em.createQuery(
- SELECT_STRING);
- iaequery.setParameter("rn", this.resourceName);
- iaequery.setParameter("pu", this.persistenceUnit);
-
- @SuppressWarnings("rawtypes")
- List iaeList = iaequery.getResultList();
- IntegrityAuditEntity iae;
-
- if (!iaeList.isEmpty()) {
- // ignores multiple results
- iae = (IntegrityAuditEntity) iaeList.get(0);
+ if (iae != null) {
// refresh the object from DB in case cached data was returned
em.refresh(iae);
logger.info(RESOURCE_MESSAGE + this.resourceName + WITH_PERSISTENCE_MESSAGE + this.persistenceUnit
logger.error("Attempting to setLastUpdated" + " on an entry that does not exist:" + " resource "
+ this.resourceName + WITH_PERSISTENCE_MESSAGE + this.persistenceUnit);
}
-
- // close the transaction
- et.commit();
- // close the EntityManager
- em.close();
- } catch (Exception e) {
- String msg = DBDAO_MESSAGE + "setLastUpdated() " + ENCOUNTERED_MESSAGE;
- logger.error(msg + e);
- throw new DbDaoTransactionException(e);
- }
-
+ });
}
/**
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;
validateProperties(properties);
// construct jmx url
- String jmxUrl = getJmxUrl();
+ String jmxUrl = getJmxUrlFromProps();
//
// Create the entity manager factory
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();
* 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);
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;
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) {
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";
+ }
}
/**
*
* @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;
}
import java.util.List;
import java.util.Observable;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Consumer;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.FlushModeType;
public StateManagement(final EntityManagerFactory entityManagerFactory, final String resourceName)
throws StateManagementException {
emf = entityManagerFactory;
- if (logger.isDebugEnabled()) {
- logger.debug("StateManagement: constructor, resourceName: {}", resourceName);
- }
-
- final EntityManager em = emf.createEntityManager();
- try (EntityMgrCloser emc = new EntityMgrCloser(em); MyTransaction et = new MyTransaction(em)) {
-
- this.resourceName = resourceName;
- if (logger.isDebugEnabled()) {
- logger.debug("resourceName = {}", this.resourceName);
- }
-
-
- try {
- // Create a StateManagementEntity object
- if (logger.isDebugEnabled()) {
- logger.debug(FIND_MESSAGE, this.resourceName);
- }
- final StateManagementEntity sm = findStateManagementEntity(em, this.resourceName);
+ logger.debug("StateManagement: constructor, resourceName: {}", resourceName);
- // persist the administrative state
- if (logger.isDebugEnabled()) {
- logger.debug("Persist adminstrative state, resourceName = {}", this.resourceName);
- }
- em.persist(sm);
- et.commit();
+ this.resourceName = resourceName;
- // Load the StateTransition hash table
- st = new StateTransition();
+ setState("StateManagement", this.resourceName, sm -> null);
- if (logger.isDebugEnabled()) {
- logger.debug("StateManagement: constructor end, resourceName: {}", this.resourceName);
- }
- } catch (final Exception ex) {
- logger.error("StateManagement: constructor caught unexpected exception: ", ex);
- throw new StateManagementException("StateManagement: Exception: " + ex.toString(), ex);
- }
- }
+ // Load the StateTransition hash table
+ st = new StateTransition();
}
/**
* and the owning application will set the StandbyStatus.
*/
public void initializeState() throws StateManagementException {
+ setState("initializeState", this.resourceName, sm -> {
+ sm.setAdminState(sm.getAdminState()); // preserve the Admin state
+ sm.setOpState(StateManagement.ENABLED);
+ sm.setAvailStatus(StateManagement.NULL_VALUE);
+ sm.setStandbyStatus(StateManagement.NULL_VALUE);
+ return ADMIN_STATE;
+ });
+ }
+
+ /**
+ * Sets the management entity state.
+ *
+ * @param methodName name of the method that invoked this
+ * @param resourceName resource name of the desired entity
+ * @param updateState function to update the state; returns a string indicating which item
+ * was updated, {@code null} if no change was made
+ * @throws StateManagementException if an error occurs
+ */
+ private void setState(String methodName, String resourceName, ExFunction<StateManagementEntity,String> updateState)
+ throws StateManagementException {
+
synchronized (SYNCLOCK) {
- if (logger.isDebugEnabled()) {
- logger.debug("\nStateManagement: SYNCLOCK initializeState() operation for resourceName = {}\n",
- this.resourceName);
- logger.debug("StateManagement: initializeState() operation started, resourceName = {}",
- this.resourceName);
- }
+ logger.debug("\nStateManagement: SYNCLOCK {}() operation for resourceName = {}\n", methodName,
+ resourceName);
+ logger.debug("StateManagement: {}() operation started, resourceName = {}", methodName, resourceName);
+
final EntityManager em = emf.createEntityManager();
try (EntityMgrCloser emc = new EntityMgrCloser(em); MyTransaction et = new MyTransaction(em)) {
- if (logger.isDebugEnabled()) {
- logger.debug(FIND_MESSAGE, this.resourceName);
- }
- final StateManagementEntity sm = findStateManagementEntity(em, this.resourceName);
- // set state
- sm.setAdminState(sm.getAdminState()); // preserve the Admin state
- sm.setOpState(StateManagement.ENABLED);
- sm.setAvailStatus(StateManagement.NULL_VALUE);
- sm.setStandbyStatus(StateManagement.NULL_VALUE);
+ logger.debug(FIND_MESSAGE, resourceName);
+
+ final StateManagementEntity sm = findStateManagementEntity(em, resourceName);
+ String changed = updateState.update(sm);
em.persist(sm);
et.commit();
- setChanged();
- notifyObservers(ADMIN_STATE);
- if (logger.isDebugEnabled()) {
- logger.debug("StateManagement: initializeState() operation completed, resourceName = {}",
- this.resourceName);
+ if (changed != null) {
+ setChanged();
+ notifyObservers(changed);
}
+
+ logger.debug("StateManagement: {}() operation completed, resourceName = {}",
+ methodName, resourceName);
} catch (final Exception ex) {
- logger.error("StateManagement.initializeState() caught unexpected exception: ", ex);
- throw new StateManagementException("StateManagement.initializeState() Exception: " + ex);
+ logger.error("StateManagement.{}() caught unexpected exception: ", methodName, ex);
+ throw new StateManagementException("StateManagement." + methodName + "() Exception: " + ex);
}
}
}
+ private void setStateUsingTable(String actionName, String resourceName, String changeName)
+ throws StateManagementException {
+
+ setState(actionName, resourceName, sm -> {
+ final StateElement stateElement = st.getEndingState(sm.getAdminState(), sm.getOpState(),
+ sm.getAvailStatus(), sm.getStandbyStatus(), actionName);
+
+ sm.setAdminState(stateElement.getEndingAdminState());
+ sm.setOpState(stateElement.getEndingOpState());
+ sm.setAvailStatus(stateElement.getEndingAvailStatus());
+ sm.setStandbyStatus(stateElement.getEndingStandbyStatus());
+
+ return changeName;
+ });
+ }
+
/**
* lock() changes the administrative state to locked.
*
* @throws StateManagementException if an error occurs
*/
public void lock() throws StateManagementException {
- synchronized (SYNCLOCK) {
- if (logger.isDebugEnabled()) {
- logger.debug("\nStateManagement: SYNCLOCK lock() operation for resourceName = {}\n", this.resourceName);
- logger.debug("StateManagement: lock() operation started, resourceName = {}", this.resourceName);
- }
- final EntityManager em = emf.createEntityManager();
-
- try (EntityMgrCloser emc = new EntityMgrCloser(em); MyTransaction et = new MyTransaction(em)) {
-
- if (logger.isDebugEnabled()) {
- logger.debug(FIND_MESSAGE, this.resourceName);
- }
- final StateManagementEntity sm = findStateManagementEntity(em, this.resourceName);
-
- final StateElement stateElement = st.getEndingState(sm.getAdminState(), sm.getOpState(),
- sm.getAvailStatus(), sm.getStandbyStatus(), LOCK);
-
- sm.setAdminState(stateElement.getEndingAdminState());
- sm.setOpState(stateElement.getEndingOpState());
- sm.setAvailStatus(stateElement.getEndingAvailStatus());
- sm.setStandbyStatus(stateElement.getEndingStandbyStatus());
-
- em.persist(sm);
- et.commit();
- setChanged();
- notifyObservers(ADMIN_STATE);
-
- if (logger.isDebugEnabled()) {
- logger.debug("StateManagement: lock() operation completed, resourceName = {}", this.resourceName);
- }
- } catch (final Exception ex) {
- logger.error("StateManagement.lock() caught unexpected exception: ", ex);
- throw new StateManagementException("StateManagement.lock() Exception: " + ex.toString());
- }
- }
+ setStateUsingTable(LOCK, this.resourceName, ADMIN_STATE);
}
/**
* @throws StateManagementException if an error occurs
*/
public void unlock() throws StateManagementException {
- synchronized (SYNCLOCK) {
- if (logger.isDebugEnabled()) {
- logger.debug("\nStateManagement: SYNCLOCK unlock() operation for resourceName = {}\n",
- this.resourceName);
- logger.debug("StateManagement: unlock() operation started, resourceName = {}", this.resourceName);
- }
- final EntityManager em = emf.createEntityManager();
-
- try (EntityMgrCloser emc = new EntityMgrCloser(em); MyTransaction et = new MyTransaction(em)) {
-
- if (logger.isDebugEnabled()) {
- logger.debug(FIND_MESSAGE, this.resourceName);
- }
- final StateManagementEntity sm = findStateManagementEntity(em, this.resourceName);
- final StateElement stateElement = st.getEndingState(sm.getAdminState(), sm.getOpState(),
- sm.getAvailStatus(), sm.getStandbyStatus(), UNLOCK);
- // set transition state
- sm.setAdminState(stateElement.getEndingAdminState());
- sm.setOpState(stateElement.getEndingOpState());
- sm.setAvailStatus(stateElement.getEndingAvailStatus());
- sm.setStandbyStatus(stateElement.getEndingStandbyStatus());
-
- em.persist(sm);
- et.commit();
- setChanged();
- notifyObservers(ADMIN_STATE);
-
- if (logger.isDebugEnabled()) {
- logger.debug("StateManagement: unlock() operation completed, resourceName = {}", this.resourceName);
- }
- } catch (final Exception ex) {
- logger.error("StateManagement.unlock() caught unexpected exception: ", ex);
- throw new StateManagementException("StateManagement.unlock() Exception: " + ex);
- }
- }
+ setStateUsingTable(UNLOCK, this.resourceName, ADMIN_STATE);
}
/**
* @throws StateManagementException if an error occurs
*/
public void enableNotFailed() throws StateManagementException {
- synchronized (SYNCLOCK) {
- if (logger.isDebugEnabled()) {
- logger.debug("\nStateManagement: SYNCLOCK enabledNotFailed() operation for resourceName = {}\n",
- this.resourceName);
- logger.debug("StateManagement: enableNotFailed() operation started, resourceName = {}",
- this.resourceName);
- }
- final EntityManager em = emf.createEntityManager();
-
- try (EntityMgrCloser emc = new EntityMgrCloser(em); MyTransaction et = new MyTransaction(em)) {
-
- if (logger.isDebugEnabled()) {
- logger.debug(FIND_MESSAGE, this.resourceName);
- }
- final StateManagementEntity sm = findStateManagementEntity(em, this.resourceName);
- final StateElement stateElement = st.getEndingState(sm.getAdminState(), sm.getOpState(),
- sm.getAvailStatus(), sm.getStandbyStatus(), ENABLE_NOT_FAILED);
- // set transition state
- sm.setAdminState(stateElement.getEndingAdminState());
- sm.setOpState(stateElement.getEndingOpState());
- sm.setAvailStatus(stateElement.getEndingAvailStatus());
- sm.setStandbyStatus(stateElement.getEndingStandbyStatus());
-
- em.persist(sm);
- et.commit();
-
- setChanged();
- notifyObservers(OPERATION_STATE);
-
- if (logger.isDebugEnabled()) {
- logger.debug("StateManagement enableNotFailed() operation completed, resourceName = {}",
- this.resourceName);
- }
- } catch (final Exception ex) {
- logger.error("StateManagement.enableNotFailed() caught unexpected exception: ", ex);
- throw new StateManagementException("StateManagement.enableNotFailed() Exception: " + ex);
- }
- }
+ setStateUsingTable(ENABLE_NOT_FAILED, this.resourceName, OPERATION_STATE);
}
/**
* @throws StateManagementException if an error occurs
*/
public void disableFailed() throws StateManagementException {
- synchronized (SYNCLOCK) {
- if (logger.isDebugEnabled()) {
- logger.debug("\nStateManagement: SYNCLOCK disabledFailed() operation for resourceName = {}\n",
- this.resourceName);
- logger.debug("StateManagement: disableFailed() operation started, resourceName = {}",
- this.resourceName);
- }
- final EntityManager em = emf.createEntityManager();
-
- try (EntityMgrCloser emc = new EntityMgrCloser(em); MyTransaction et = new MyTransaction(em)) {
-
- if (logger.isDebugEnabled()) {
- logger.debug(FIND_MESSAGE, this.resourceName);
- }
- final StateManagementEntity sm = findStateManagementEntity(em, this.resourceName);
- final StateElement stateElement = st.getEndingState(sm.getAdminState(), sm.getOpState(),
- sm.getAvailStatus(), sm.getStandbyStatus(), DISABLE_FAILED);
- // set transition state
- sm.setAdminState(stateElement.getEndingAdminState());
- sm.setOpState(stateElement.getEndingOpState());
- sm.setAvailStatus(stateElement.getEndingAvailStatus());
- sm.setStandbyStatus(stateElement.getEndingStandbyStatus());
-
- em.persist(sm);
- et.commit();
- setChanged();
- notifyObservers(OPERATION_STATE);
-
- if (logger.isDebugEnabled()) {
- logger.debug("StateManagement: disableFailed() operation completed, resourceName = {}",
- this.resourceName);
- }
- } catch (final Exception ex) {
- logger.error("StateManagement.disableFailed() caught unexpected exception: ", ex);
- throw new StateManagementException("StateManagement.disableFailed() Exception: " + ex);
- }
- }
+ setStateUsingTable(DISABLE_FAILED, this.resourceName, OPERATION_STATE);
}
/**
* @throws StateManagementException if an error occurs
*/
public void disableFailed(final String otherResourceName) throws StateManagementException {
- synchronized (SYNCLOCK) {
- if (otherResourceName == null) {
- logger.error("\nStateManagement: SYNCLOCK disableFailed(otherResourceName) operation: resourceName is "
- + "NULL.\n");
- return;
- }
- if (logger.isDebugEnabled()) {
- logger.debug("\nStateManagement: SYNCLOCK disabledFailed(otherResourceName) operation for resourceName "
- + "= {}\n", otherResourceName);
- logger.debug("StateManagement: disableFailed(otherResourceName) operation started, resourceName = {}",
- otherResourceName);
- }
- final EntityManager em = emf.createEntityManager();
-
- try (EntityMgrCloser emc = new EntityMgrCloser(em); MyTransaction et = new MyTransaction(em)) {
-
- if (logger.isDebugEnabled()) {
- logger.debug(FIND_MESSAGE, otherResourceName);
- }
- final StateManagementEntity sm = findStateManagementEntity(em, otherResourceName);
- final StateElement stateElement = st.getEndingState(sm.getAdminState(), sm.getOpState(),
- sm.getAvailStatus(), sm.getStandbyStatus(), DISABLE_FAILED);
- // set transition state
- sm.setAdminState(stateElement.getEndingAdminState());
- sm.setOpState(stateElement.getEndingOpState());
- sm.setAvailStatus(stateElement.getEndingAvailStatus());
- sm.setStandbyStatus(stateElement.getEndingStandbyStatus());
-
- em.persist(sm);
- et.commit();
- setChanged();
- notifyObservers(OPERATION_STATE);
-
- if (logger.isDebugEnabled()) {
- logger.debug(
- "StateManagement: disableFailed(otherResourceName) operation completed, resourceName = {}",
- otherResourceName);
- }
- } catch (final Exception ex) {
- logger.error("StateManagement.disableFailed(otherResourceName) caught unexpected exception: ", ex);
- throw new StateManagementException("StateManagement.disableFailed(otherResourceName) Exception: " + ex);
- }
+ if (otherResourceName == null) {
+ logger.error(
+ "\nStateManagement: SYNCLOCK disableFailed(otherResourceName) operation: resourceName is NULL.\n");
+ return;
}
+
+ setStateUsingTable(DISABLE_FAILED, otherResourceName, OPERATION_STATE);
}
/**
* @throws StateManagementException if an error occurs
*/
public void disableDependency() throws StateManagementException {
- synchronized (SYNCLOCK) {
- if (logger.isDebugEnabled()) {
- logger.debug("\nStateManagement: SYNCLOCK disableDependency() operation for resourceName = {}\n",
- this.resourceName);
- logger.debug("StateManagement: disableDependency() operation started, resourceName = {}",
- this.resourceName);
- }
- final EntityManager em = emf.createEntityManager();
-
- try (EntityMgrCloser emc = new EntityMgrCloser(em); MyTransaction et = new MyTransaction(em)) {
-
- if (logger.isDebugEnabled()) {
- logger.debug(FIND_MESSAGE, this.resourceName);
- }
- final StateManagementEntity sm = findStateManagementEntity(em, this.resourceName);
- final StateElement stateElement = st.getEndingState(sm.getAdminState(), sm.getOpState(),
- sm.getAvailStatus(), sm.getStandbyStatus(), DISABLE_DEPENDENCY);
- // set transition state
- sm.setAdminState(stateElement.getEndingAdminState());
- sm.setOpState(stateElement.getEndingOpState());
- sm.setAvailStatus(stateElement.getEndingAvailStatus());
- sm.setStandbyStatus(stateElement.getEndingStandbyStatus());
-
- em.persist(sm);
- et.commit();
- setChanged();
- notifyObservers(OPERATION_STATE);
-
- if (logger.isDebugEnabled()) {
- logger.debug("StateManagement: disableDependency() operation completed, resourceName = {}",
- this.resourceName);
- }
- } catch (final Exception ex) {
- logger.error("StateManagement.disableDependency() caught unexpected exception: ", ex);
- throw new StateManagementException("StateManagement.disableDependency() Exception: " + ex);
- }
- }
+ setStateUsingTable(DISABLE_DEPENDENCY, this.resourceName, OPERATION_STATE);
}
/**
* @throws StateManagementException if an error occurs
*/
public void enableNoDependency() throws StateManagementException {
- synchronized (SYNCLOCK) {
- if (logger.isDebugEnabled()) {
- logger.debug("\nStateManagement: SYNCLOCK enableNoDependency() operation for resourceName = {}\n",
- this.resourceName);
- logger.debug("StateManagement: enableNoDependency() operation started, resourceName = {}",
- this.resourceName);
- }
- final EntityManager em = emf.createEntityManager();
-
- try (EntityMgrCloser emc = new EntityMgrCloser(em); MyTransaction et = new MyTransaction(em)) {
-
- if (logger.isDebugEnabled()) {
- logger.debug(FIND_MESSAGE, this.resourceName);
- }
- final StateManagementEntity sm = findStateManagementEntity(em, this.resourceName);
- final StateElement stateElement = st.getEndingState(sm.getAdminState(), sm.getOpState(),
- sm.getAvailStatus(), sm.getStandbyStatus(), ENABLE_NO_DEPENDENCY);
- // set transition state
- sm.setAdminState(stateElement.getEndingAdminState());
- sm.setOpState(stateElement.getEndingOpState());
- sm.setAvailStatus(stateElement.getEndingAvailStatus());
- sm.setStandbyStatus(stateElement.getEndingStandbyStatus());
-
- em.persist(sm);
- et.commit();
- setChanged();
- notifyObservers(OPERATION_STATE);
-
- if (logger.isDebugEnabled()) {
- logger.debug("StateManagement: enableNoDependency() operation completed, resourceName = {}",
- this.resourceName);
- }
- } catch (final Exception ex) {
- logger.error("StateManagement.enableNoDependency() caught unexpected exception: ", ex);
- throw new StateManagementException("StateManagement.enableNoDependency() Exception: " + ex);
- }
- }
+ setStateUsingTable(ENABLE_NO_DEPENDENCY, this.resourceName, OPERATION_STATE);
}
/**
* @throws IntegrityMonitorException if the status fails to change
*/
public void promote() throws IntegrityMonitorException {
- synchronized (SYNCLOCK) {
- if (logger.isDebugEnabled()) {
- logger.debug("\nStateManagement: SYNCLOCK promote() operation for resourceName = {}\n",
- this.resourceName);
- logger.debug("StateManagement: promote() operation started, resourceName = {}", this.resourceName);
- }
+ AtomicReference<String> newStatus = new AtomicReference<>();
- StateManagementEntity sm;
+ setState(PROMOTE, resourceName, sm -> {
+ final StateElement stateElement = st.getEndingState(sm.getAdminState(), sm.getOpState(),
+ sm.getAvailStatus(), sm.getStandbyStatus(), PROMOTE);
- final EntityManager em = emf.createEntityManager();
+ sm.setAdminState(stateElement.getEndingAdminState());
+ sm.setOpState(stateElement.getEndingOpState());
+ sm.setAvailStatus(stateElement.getEndingAvailStatus());
+ sm.setStandbyStatus(stateElement.getEndingStandbyStatus());
- try (EntityMgrCloser emc = new EntityMgrCloser(em); MyTransaction et = new MyTransaction(em)) {
-
- if (logger.isDebugEnabled()) {
- logger.debug(FIND_MESSAGE, this.resourceName);
- }
- sm = findStateManagementEntity(em, this.resourceName);
- final StateElement stateElement = st.getEndingState(sm.getAdminState(), sm.getOpState(),
- sm.getAvailStatus(), sm.getStandbyStatus(), PROMOTE);
- // set transition state
- sm.setAdminState(stateElement.getEndingAdminState());
- sm.setOpState(stateElement.getEndingOpState());
- sm.setAvailStatus(stateElement.getEndingAvailStatus());
- sm.setStandbyStatus(stateElement.getEndingStandbyStatus());
+ newStatus.set(sm.getStandbyStatus());
- em.persist(sm);
- et.commit();
- setChanged();
- notifyObservers(STANDBY_STATUS);
- } catch (final Exception ex) {
- logger.error("StateManagement.promote() caught unexpected exception: ", ex);
- throw new StateManagementException("StateManagement.promote() Exception: " + ex);
- }
+ return STANDBY_STATUS;
+ });
- if (logger.isDebugEnabled()) {
- logger.debug("StateManagement: promote() operation completed, resourceName = {}", this.resourceName);
- }
- if (sm.getStandbyStatus().equals(StateManagement.COLD_STANDBY)) {
- final String msg =
- "Failure to promote " + this.resourceName + " StandbyStatus = " + StateManagement.COLD_STANDBY;
- throw new StandbyStatusException(msg);
- }
+ if (StateManagement.COLD_STANDBY.equals(newStatus.get())) {
+ final String msg =
+ "Failure to promote " + this.resourceName + " StandbyStatus = " + StateManagement.COLD_STANDBY;
+ throw new StandbyStatusException(msg);
}
}
* @throws StateManagementException if an error occurs
*/
public void demote() throws StateManagementException {
- synchronized (SYNCLOCK) {
- if (logger.isDebugEnabled()) {
- logger.debug("\nStateManagement: SYNCLOCK demote() operation for resourceName = {}\n",
- this.resourceName);
- logger.debug("StateManagement: demote() operation started, resourceName = {}",
- this.resourceName);
- }
- final EntityManager em = emf.createEntityManager();
-
- try (EntityMgrCloser emc = new EntityMgrCloser(em); MyTransaction et = new MyTransaction(em)) {
-
- if (logger.isDebugEnabled()) {
- logger.debug(FIND_MESSAGE, this.resourceName);
- }
- final StateManagementEntity sm = findStateManagementEntity(em, this.resourceName);
- final StateElement stateElement = st.getEndingState(sm.getAdminState(), sm.getOpState(),
- sm.getAvailStatus(), sm.getStandbyStatus(), DEMOTE);
- // set transition state
- sm.setAdminState(stateElement.getEndingAdminState());
- sm.setOpState(stateElement.getEndingOpState());
- sm.setAvailStatus(stateElement.getEndingAvailStatus());
- sm.setStandbyStatus(stateElement.getEndingStandbyStatus());
-
- em.persist(sm);
- et.commit();
- setChanged();
- notifyObservers(STANDBY_STATUS);
-
- if (logger.isDebugEnabled()) {
- logger.debug("StateManagement: demote() operation completed, resourceName = {}", this.resourceName);
- }
- } catch (final Exception ex) {
- logger.error("StateManagement.demote() caught unexpected exception: ", ex);
- throw new StateManagementException("StateManagement.demote() Exception: " + ex);
- }
- }
+ setStateUsingTable(DEMOTE, this.resourceName, STANDBY_STATUS);
}
/**
* @throws StateManagementException if an error occurs
*/
public void demote(final String otherResourceName) throws StateManagementException {
- synchronized (SYNCLOCK) {
- if (otherResourceName == null) {
- logger.error(
- "\nStateManagement: SYNCLOCK demote(otherResourceName) operation: resourceName is NULL.\n");
- return;
- }
- if (logger.isDebugEnabled()) {
- logger.debug("\nStateManagement: SYNCLOCK demote(otherResourceName) operation for resourceName = {}\n",
- otherResourceName);
- }
- final EntityManager em = emf.createEntityManager();
-
- try (EntityMgrCloser emc = new EntityMgrCloser(em); MyTransaction et = new MyTransaction(em)) {
-
- if (logger.isDebugEnabled()) {
- logger.debug("StateManagement: SYNCLOCK demote(otherResourceName) findStateManagementEntity for {}",
- otherResourceName);
- }
- final StateManagementEntity sm = findStateManagementEntity(em, otherResourceName);
- final StateElement stateElement = st.getEndingState(sm.getAdminState(), sm.getOpState(),
- sm.getAvailStatus(), sm.getStandbyStatus(), DEMOTE);
- // set transition state
- sm.setAdminState(stateElement.getEndingAdminState());
- sm.setOpState(stateElement.getEndingOpState());
- sm.setAvailStatus(stateElement.getEndingAvailStatus());
- sm.setStandbyStatus(stateElement.getEndingStandbyStatus());
-
- em.persist(sm);
- et.commit();
- // We don't notify observers because this is assumed to be a remote resource
-
- if (logger.isDebugEnabled()) {
- logger.debug("StateManagement: demote(otherResourceName) operation completed, resourceName = {}",
- otherResourceName);
- }
- } catch (final Exception ex) {
- logger.error("StateManagement.demote(otherResourceName) caught unexpected exception: ", ex);
- throw new StateManagementException("StateManagement.demote(otherResourceName) Exception: " + ex);
- }
+ if (otherResourceName == null) {
+ logger.error(
+ "\nStateManagement: SYNCLOCK demote(otherResourceName) operation: resourceName is NULL.\n");
+ return;
}
+
+ setStateUsingTable(DEMOTE, otherResourceName, null);
}
/**
* @return the administration state
*/
public String getAdminState() {
- if (logger.isDebugEnabled()) {
- logger.debug("StateManagement(6/1/16): getAdminState for resourceName {}", this.resourceName);
- }
+ getEntityState("getAdminState", this.resourceName,
+ sm -> this.adminState = sm.getAdminState(),
+ () -> this.adminState = null);
+ return this.adminState;
+ }
+
+ private void getEntityState(String methodName, String resourceName, Consumer<StateManagementEntity> function,
+ Runnable notFound) {
+
+ logger.debug("StateManagement(6/1/16): {} for resourceName {}", methodName, resourceName);
final EntityManager em = emf.createEntityManager();
try (final EntityMgrCloser emc = new EntityMgrCloser(em)) {
final StateManagementEntity stateManagementEntity = resourceList.get(0);
// refresh the object from DB in case cached data was returned
em.refresh(stateManagementEntity);
- this.adminState = stateManagementEntity.getAdminState();
+ function.accept(stateManagementEntity);
} else {
- this.adminState = null;
+ notFound.run();
}
} catch (final Exception ex) {
- logger.error("StateManagement: getAdminState exception: {}", ex.toString(), ex);
+ logger.error("StateManagement: {} exception: {}", methodName, ex.toString(), ex);
}
- return this.adminState;
}
/**
* @return the operational state
*/
public String getOpState() {
- if (logger.isDebugEnabled()) {
- logger.debug("StateManagement(6/1/16): getOpState for resourceName {}", this.resourceName);
- }
-
- final EntityManager em = emf.createEntityManager();
- try (EntityMgrCloser emc = new EntityMgrCloser(em)) {
- final TypedQuery<StateManagementEntity> query =
- em.createQuery(GET_STATE_MANAGEMENT_ENTITY_QUERY, StateManagementEntity.class);
-
- query.setParameter(RESOURCE_NAME, this.resourceName);
-
- // Just test that we are retrieving the right object
- final List<StateManagementEntity> resourceList =
- query.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
- if (!resourceList.isEmpty()) {
- // exist
- final StateManagementEntity stateManagementEntity = resourceList.get(0);
- // refresh the object from DB in case cached data was returned
- em.refresh(stateManagementEntity);
- this.opState = stateManagementEntity.getOpState();
- } else {
- this.opState = null;
- }
- } catch (final Exception ex) {
- logger.error("StateManagement: getOpState exception: {}", ex.toString(), ex);
- }
-
+ getEntityState("getOpState", this.resourceName,
+ sm -> this.opState = sm.getOpState(),
+ () -> this.opState = null);
return this.opState;
}
* @return the availability status
*/
public String getAvailStatus() {
- if (logger.isDebugEnabled()) {
- logger.debug("StateManagement(6/1/16): getAvailStatus for resourceName {}", this.resourceName);
- }
-
- final EntityManager em = emf.createEntityManager();
- try (EntityMgrCloser emc = new EntityMgrCloser(em)) {
- final TypedQuery<StateManagementEntity> query =
- em.createQuery(GET_STATE_MANAGEMENT_ENTITY_QUERY, StateManagementEntity.class);
-
- query.setParameter(RESOURCE_NAME, this.resourceName);
-
- // Just test that we are retrieving the right object
- final List<StateManagementEntity> resourceList =
- query.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
- if (!resourceList.isEmpty()) {
- // exist
- final StateManagementEntity stateManagementEntity = resourceList.get(0);
- // refresh the object from DB in case cached data was returned
- em.refresh(stateManagementEntity);
- this.availStatus = stateManagementEntity.getAvailStatus();
- } else {
- this.availStatus = null;
- }
- } catch (final Exception ex) {
- logger.error("StateManagement: getAvailStatus exception: {}", ex.toString(), ex);
- }
-
+ getEntityState("getAvailStatus", this.resourceName,
+ sm -> this.availStatus = sm.getAvailStatus(),
+ () -> this.availStatus = null);
return this.availStatus;
}
* @return the standby status
*/
public String getStandbyStatus() {
- if (logger.isDebugEnabled()) {
- logger.debug("StateManagement(6/1/16): getStandbyStatus for resourceName {}", this.resourceName);
- }
-
- final EntityManager em = emf.createEntityManager();
- try (EntityMgrCloser emc = new EntityMgrCloser(em)) {
- final TypedQuery<StateManagementEntity> query =
- em.createQuery(GET_STATE_MANAGEMENT_ENTITY_QUERY, StateManagementEntity.class);
-
- query.setParameter(RESOURCE_NAME, this.resourceName);
-
- // Just test that we are retrieving the right object
- final List<StateManagementEntity> resourceList =
- query.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
- if (!resourceList.isEmpty()) {
- // exist
- final StateManagementEntity stateManagementEntity = resourceList.get(0);
- // refresh the object from DB in case cached data was returned
- em.refresh(stateManagementEntity);
- this.standbyStatus = stateManagementEntity.getStandbyStatus();
- } else {
- this.standbyStatus = null;
- }
- } catch (final Exception ex) {
- logger.error("StateManagement: getStandbyStatus exception: {}", ex.toString(), ex);
- }
-
+ getEntityState("getStandbyStatus", this.resourceName,
+ sm -> this.standbyStatus = sm.getStandbyStatus(),
+ () -> this.standbyStatus = null);
return this.standbyStatus;
}
* @return the standby status
*/
public String getStandbyStatus(final String otherResourceName) {
+ AtomicReference<String> tempStandbyStatus = new AtomicReference<>();
- if (logger.isDebugEnabled()) {
- logger.debug("StateManagement: getStandbyStatus: Entering, resourceName='{}'", otherResourceName);
- }
+ getEntityState("getStandbyStatus", otherResourceName,
+ sm -> tempStandbyStatus.set(sm.getStandbyStatus()),
+ () -> logger.error("getStandbyStatus: resourceName ={} not found in statemanagemententity table",
+ otherResourceName));
- String tempStandbyStatus = null;
+ logger.debug("getStandbyStatus: Returning standbyStatus={}", tempStandbyStatus.get());
- // The transaction is required for the LockModeType
- final EntityManager em = emf.createEntityManager();
-
- try (EntityMgrCloser emc = new EntityMgrCloser(em); MyTransaction et = new MyTransaction(em)) {
-
- final TypedQuery<StateManagementEntity> stateManagementListQuery =
- em.createQuery(GET_STATE_MANAGEMENT_ENTITY_QUERY, StateManagementEntity.class);
- stateManagementListQuery.setParameter(RESOURCE_NAME, otherResourceName);
- final List<StateManagementEntity> stateManagementList = stateManagementListQuery
- .setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
- if (!stateManagementList.isEmpty()) {
- final StateManagementEntity stateManagementEntity = stateManagementList.get(0);
- // refresh the object from DB in case cached data was returned
- em.refresh(stateManagementEntity);
- tempStandbyStatus = stateManagementEntity.getStandbyStatus();
- if (logger.isDebugEnabled()) {
- logger.debug("getStandbyStatus: resourceName ={} has standbyStatus={}", otherResourceName,
- tempStandbyStatus);
- }
- } else {
- logger.error("getStandbyStatus: resourceName ={} not found in statemanagemententity table",
- otherResourceName);
- }
-
- et.commit();
- } catch (final Exception e) {
- logger.error(
- "getStandbyStatus: Caught Exception attempting to get statemanagemententity record, message='{}'",
- e.getMessage(), e);
- }
- if (logger.isDebugEnabled()) {
- logger.debug("getStandbyStatus: Returning standbyStatus={}", tempStandbyStatus);
- }
-
- return tempStandbyStatus;
+ return tempStandbyStatus.get();
}
/**
*/
private static StateManagementEntity findStateManagementEntity(final EntityManager em,
final String otherResourceName) {
- if (logger.isDebugEnabled()) {
- logger.debug("StateManagementEntity: findStateManagementEntity: Entry");
- }
+ logger.debug("StateManagementEntity: findStateManagementEntity: Entry");
try {
final TypedQuery<StateManagementEntity> query =
em.createQuery(GET_STATE_MANAGEMENT_ENTITY_QUERY, StateManagementEntity.class);
*/
public void deleteAllStateManagementEntities() {
- if (logger.isDebugEnabled()) {
- logger.debug("StateManagement: deleteAllStateManagementEntities: Entering");
- }
+ logger.debug("StateManagement: deleteAllStateManagementEntities: Entering");
/*
* Start transaction
em.createQuery("SELECT p FROM StateManagementEntity p", StateManagementEntity.class);
final List<StateManagementEntity> stateManagementEntityList = stateManagementEntityListQuery
.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
- if (logger.isDebugEnabled()) {
- logger.debug("deleteAllStateManagementEntities: Deleting {} StateManagementEntity records",
- stateManagementEntityList.size());
- }
+ logger.debug("deleteAllStateManagementEntities: Deleting {} StateManagementEntity records",
+ stateManagementEntityList.size());
for (final StateManagementEntity stateManagementEntity : stateManagementEntityList) {
- if (logger.isDebugEnabled()) {
- logger.debug(
- "deleteAllStateManagementEntities: Deleting statemanagemententity with resourceName={} and"
- + " standbyStatus={}",
- stateManagementEntity.getResourceName(), stateManagementEntity.getStandbyStatus());
- }
+ logger.debug("deleteAllStateManagementEntities: Deleting statemanagemententity with resourceName={} and"
+ + " standbyStatus={}", stateManagementEntity.getResourceName(),
+ stateManagementEntity.getStandbyStatus());
em.remove(stateManagementEntity);
}
} catch (final Exception ex) {
logger.error("StateManagement.deleteAllStateManagementEntities() caught Exception: ", ex);
}
- if (logger.isDebugEnabled()) {
- logger.debug("deleteAllStateManagementEntities: Exiting");
- }
+ logger.debug("deleteAllStateManagementEntities: Exiting");
+ }
+
+ @FunctionalInterface
+ private static interface ExFunction<T,R> {
+ public R update(T object) throws IntegrityMonitorException;
}
private static class MyTransaction extends EntityTransCloser {