Author: pnguyen Date: 2009-11-20 15:16:45 -0800 (Fri, 20 Nov 2009) New Revision: 13985 URL: http://svn.hyperic.org/?view=rev&root=Hyperic+HQ&revision=13985 Modified: branches/HQ_4_2/src/org/hyperic/hq/authz/shared/AuthzConstants.java branches/HQ_4_2/src/org/hyperic/hq/bizapp/server/session/EventsBossEJBImpl.java branches/HQ_4_2/src/org/hyperic/hq/events/Resources.properties branches/HQ_4_2/src/org/hyperic/hq/events/server/session/AlertDAO.java branches/HQ_4_2/src/org/hyperic/hq/events/server/session/AlertDefinitionDAO.java branches/HQ_4_2/src/org/hyperic/hq/events/server/session/AlertDefinitionManagerEJBImpl.java branches/HQ_4_2/src/org/hyperic/hq/events/server/session/AlertManagerEJBImpl.java branches/HQ_4_2/unittest/src/org/hyperic/hq/events/server/session/MockAlertDefinitionManagerEJBImpl.java branches/HQ_4_2/unittest/src/org/hyperic/hq/events/server/session/MockAlertDefinitionManagerLocalHome.java Log: [HQ-1799] To improve performance, get the last unfixed alerts in batch and update the internal enabled flag in batch Modified: branches/HQ_4_2/src/org/hyperic/hq/authz/shared/AuthzConstants.java =================================================================== --- branches/HQ_4_2/src/org/hyperic/hq/authz/shared/AuthzConstants.java 2009-11-20 23:08:35 UTC (rev 13984) +++ branches/HQ_4_2/src/org/hyperic/hq/authz/shared/AuthzConstants.java 2009-11-20 23:16:45 UTC (rev 13985) @@ -191,6 +191,14 @@ public static final String ResourceEdgeContainmentRelation = "containment"; public static final String ResourceEdgeNetworkRelation = "network"; + // List of alert operations + public static final String[] MANAGE_ALERTS_OPS = + new String[] { + platformOpManageAlerts, + serverOpManageAlerts, + serviceOpManageAlerts + }; + public static boolean isOverlord(Integer subject) { return subject.equals(AuthzConstants.overlordId); } Modified: branches/HQ_4_2/src/org/hyperic/hq/bizapp/server/session/EventsBossEJBImpl.java =================================================================== --- branches/HQ_4_2/src/org/hyperic/hq/bizapp/server/session/EventsBossEJBImpl.java 2009-11-20 23:08:35 UTC (rev 13984) +++ branches/HQ_4_2/src/org/hyperic/hq/bizapp/server/session/EventsBossEJBImpl.java 2009-11-20 23:16:45 UTC (rev 13985) @@ -1766,7 +1766,6 @@ PermissionException, SchedulerException { AuthzSubject subject = manager.getSubject(sessionId); - event.setModifiedBy(subject.getName()); return getMaintEvtMgr().schedule(subject, event); } Modified: branches/HQ_4_2/src/org/hyperic/hq/events/Resources.properties =================================================================== --- branches/HQ_4_2/src/org/hyperic/hq/events/Resources.properties 2009-11-20 23:08:35 UTC (rev 13984) +++ branches/HQ_4_2/src/org/hyperic/hq/events/Resources.properties 2009-11-20 23:16:45 UTC (rev 13985) @@ -37,8 +37,8 @@ eventLog.status.debug=Debug maintenance.window=Downtime Window -maintenance.window.state.start=Schedule started. {0} Alerts disabled. Availability measurements for {1} resources disabled. {2} errors occurred. -maintenance.window.state.end=Schedule ended. {0} Alerts enabled. Availability measurements for {1} resources enabled. {2} errors occurred. +maintenance.window.state.start=Started. Scheduled by {3}. {0} Alerts disabled. Availability measurements for {1} resources disabled. {2} errors occurred. +maintenance.window.state.end=Ended. Scheduled by {3}. {0} Alerts enabled. Availability measurements for {1} resources enabled. {2} errors occurred. maintenance.window.state.dead=Schedule skipped. maintenance.window.error.endDate=The end time must be after the start time. maintenance.window.error.illegalState=The downtime schedule is either invalid or has completed. Modified: branches/HQ_4_2/src/org/hyperic/hq/events/server/session/AlertDAO.java =================================================================== --- branches/HQ_4_2/src/org/hyperic/hq/events/server/session/AlertDAO.java 2009-11-20 23:08:35 UTC (rev 13984) +++ branches/HQ_4_2/src/org/hyperic/hq/events/server/session/AlertDAO.java 2009-11-20 23:16:45 UTC (rev 13985) @@ -6,7 +6,7 @@ * normal use of the program, and does *not* fall under the heading of * "derived work". * - * Copyright (C) [2004-2007], Hyperic, Inc. + * Copyright (C) [2004-2009], Hyperic, Inc. * This file is part of HQ. * * HQ is free software; you can redistribute it and/or modify @@ -24,8 +24,11 @@ */ package org.hyperic.hq.events.server.session; +import java.util.Arrays; +import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; import org.hibernate.Query; import org.hibernate.criterion.Order; @@ -33,8 +36,10 @@ import org.hibernate.criterion.Restrictions; import org.hyperic.dao.DAOFactory; import org.hyperic.hibernate.PageInfo; +import org.hyperic.hq.authz.server.session.AuthzSubject; import org.hyperic.hq.authz.server.session.Resource; import org.hyperic.hq.authz.shared.AuthzConstants; +import org.hyperic.hq.authz.shared.EdgePermCheck; import org.hyperic.hq.authz.shared.PermissionManagerFactory; import org.hyperic.hq.dao.HibernateDAO; @@ -113,12 +118,7 @@ int priority, boolean inEsc, boolean notFixed, Integer groupId, Integer alertDefId, PageInfo pageInfo) { - String[] ops = - new String[] { AuthzConstants.platformOpManageAlerts, - AuthzConstants.serverOpManageAlerts, - AuthzConstants.serviceOpManageAlerts }; AlertSortField sort = (AlertSortField)pageInfo.getSort(); - Query q; String sql = PermissionManagerFactory.getInstance() .getAlertsHQL(inEsc, notFixed, groupId, alertDefId, false) @@ -132,7 +132,7 @@ " DESC"; } - q = getSession().createQuery(sql) + Query q = getSession().createQuery(sql) .setLong("begin", begin) .setLong("end", end) .setInteger("priority", priority); @@ -142,7 +142,7 @@ if (sql.indexOf("subj") > 0) { q.setInteger("subj", subj.intValue()) - .setParameterList("ops", ops); + .setParameterList("ops", AuthzConstants.MANAGE_ALERTS_OPS); } return pageInfo.pageResults(q).list(); @@ -152,24 +152,18 @@ int priority, boolean inEsc, boolean notFixed, Integer groupId, Integer alertDefId) - { - String[] ops = - new String[] { AuthzConstants.platformOpManageAlerts, - AuthzConstants.serverOpManageAlerts, - AuthzConstants.serviceOpManageAlerts }; - Query q; - + { String sql = PermissionManagerFactory.getInstance() .getAlertsHQL(inEsc, notFixed, groupId, alertDefId, true); - q = getSession().createQuery(sql) + Query q = getSession().createQuery(sql) .setLong("begin", begin) .setLong("end", end) .setInteger("priority", priority); if (sql.indexOf("subj") > 0) { q.setInteger("subj", subj.intValue()) - .setParameterList("ops", ops); + .setParameterList("ops", AuthzConstants.MANAGE_ALERTS_OPS); } return (Integer) q.uniqueResult(); @@ -256,7 +250,52 @@ return null; } } + + /** + * Return all last fixed alerts for the given resource + * + * @param subject The HQ user + * @param r The root resource + * @param fixed Boolean to indicate whether to get fixed or unfixed alerts + * @return + */ + public Map findLastByResource(AuthzSubject subject, + Resource r, + boolean includeDescendants, + boolean fixed) { + EdgePermCheck wherePermCheck = + getPermissionManager().makePermCheckHql("rez", includeDescendants); + + String hql = + new StringBuilder() + .append("select a ") + .append("from Alert a ") + .append("join a.alertDefinition ad ") + .append("join ad.resource rez ") + .append(wherePermCheck.toString()) + .append("and ad.deleted = false ") + .append("and a.fixed = :fixed ") + .append("order by a.ctime ") + .toString(); + + Query q = createQuery(hql).setBoolean("fixed", fixed); + + List alerts = wherePermCheck + .addQueryParameters(q, subject, r, 0, + Arrays.asList(AuthzConstants.MANAGE_ALERTS_OPS)) + .list(); + + Map lastAlerts = new HashMap(alerts.size()); + for (Iterator it=alerts.iterator(); it.hasNext(); ) { + Alert a = (Alert) it.next(); + // since it is ordered by ctime in ascending order, the + // last alert will eventually be put into the map + lastAlerts.put(a.getAlertDefinition().getId(), a); + } + return lastAlerts; + } + int deleteByAlertDefinition(AlertDefinition def) { String sql = "DELETE FROM Alert WHERE alertDefinition = :alertDef"; Modified: branches/HQ_4_2/src/org/hyperic/hq/events/server/session/AlertDefinitionDAO.java =================================================================== --- branches/HQ_4_2/src/org/hyperic/hq/events/server/session/AlertDefinitionDAO.java 2009-11-20 23:08:35 UTC (rev 13984) +++ branches/HQ_4_2/src/org/hyperic/hq/events/server/session/AlertDefinitionDAO.java 2009-11-20 23:16:45 UTC (rev 13985) @@ -54,11 +54,6 @@ import org.hyperic.hq.events.shared.RegisteredTriggerValue; public class AlertDefinitionDAO extends HibernateDAO { - private static final String[] MANAGE_ALERTS_OPS = new String[] { - AuthzConstants.platformOpManageAlerts, - AuthzConstants.serverOpManageAlerts, - AuthzConstants.serviceOpManageAlerts - }; public AlertDefinitionDAO(DAOFactory f) { super(AlertDefinition.class, f); @@ -201,7 +196,7 @@ return wherePermCheck .addQueryParameters(q, subject, r, 0, - Arrays.asList(MANAGE_ALERTS_OPS)).list(); + Arrays.asList(AuthzConstants.MANAGE_ALERTS_OPS)).list(); } void save(AlertDefinition def) { @@ -357,7 +352,7 @@ if (sql.indexOf("subj") > 0) { q.setInteger("subj", subj.getId().intValue()) - .setParameterList("ops", MANAGE_ALERTS_OPS); + .setParameterList("ops", AuthzConstants.MANAGE_ALERTS_OPS); } return pInfo.pageResults(q).list(); Modified: branches/HQ_4_2/src/org/hyperic/hq/events/server/session/AlertDefinitionManagerEJBImpl.java =================================================================== --- branches/HQ_4_2/src/org/hyperic/hq/events/server/session/AlertDefinitionManagerEJBImpl.java 2009-11-20 23:08:35 UTC (rev 13984) +++ branches/HQ_4_2/src/org/hyperic/hq/events/server/session/AlertDefinitionManagerEJBImpl.java 2009-11-20 23:16:45 UTC (rev 13985) @@ -27,6 +27,7 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.SortedMap; @@ -657,11 +658,44 @@ boolean enable) throws FinderException, PermissionException { - AlertDefinition def = getAlertDefDAO().get(defId); - - return updateAlertDefinitionInternalEnable(subj, def, enable); + return updateAlertDefinitionInternalEnable( + subj, Collections.singletonList(defId), enable); } + + /** + * Enable/Disable an alert definition. For internal use only where the mtime + * does not need to be reset on each update. + * + * @return <code>true</code> if the enable/disable succeeded. + * @ejb:interface-method + */ + public boolean updateAlertDefinitionInternalEnable(AuthzSubject subj, + List ids, + boolean enable) + throws PermissionException { + AlertDefinitionDAO dao = getAlertDefDAO(); + List triggerDefIds = new ArrayList(ids.size()); + + for (Iterator it = ids.iterator(); it.hasNext(); ) { + AlertDefinition def = dao.get((Integer) it.next()); + + if (def != null && def.isEnabled() != enable) { + canManageAlerts(subj, def.getAppdefEntityId()); + def.setEnabledStatus(enable); + triggerDefIds.add(def.getId()); + } + } + + if (!triggerDefIds.isEmpty()) { + // HQ-1799: enable the triggers in batch to improve performance + registeredTriggerManager.setAlertDefinitionTriggersEnabled(triggerDefIds, enable); + return true; + } else { + return false; + } + } + /** * Set the escalation on the alert definition * @@ -927,24 +961,6 @@ return new PageList(vals, vals.size()); } - /** Get list of all child conditions - * @ejb:interface-method - */ - public PageList findChildAlertDefinitions(Integer id) { - AlertDefinition def = getAlertDefDAO().findById(id); - List vals = new ArrayList(); - Collection ads = def.getChildren(); - for (Iterator i=ads.iterator(); i.hasNext(); ) { - AlertDefinition child = (AlertDefinition)i.next(); - // Don't touch the deleted children - if (!child.isDeleted() && child.getResource() != null) { - vals.add(child.getAlertDefinitionValue()); - } - } - - return new PageList(vals, vals.size()); - } - /** * Get the resource-specific alert definition ID by parent ID, allowing for * the query to return a stale copy of the alert definition (for efficiency Modified: branches/HQ_4_2/src/org/hyperic/hq/events/server/session/AlertManagerEJBImpl.java =================================================================== --- branches/HQ_4_2/src/org/hyperic/hq/events/server/session/AlertManagerEJBImpl.java 2009-11-20 23:08:35 UTC (rev 13984) +++ branches/HQ_4_2/src/org/hyperic/hq/events/server/session/AlertManagerEJBImpl.java 2009-11-20 23:16:45 UTC (rev 13985) @@ -6,7 +6,7 @@ * normal use of the program, and does *not* fall under the heading of * "derived work". * - * Copyright (C) [2004-2008], Hyperic, Inc. + * Copyright (C) [2004-2009], Hyperic, Inc. * This file is part of HQ. * * HQ is free software; you can redistribute it and/or modify @@ -31,6 +31,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Set; import org.hyperic.util.stats.ConcurrentStatsCollector; @@ -77,6 +78,7 @@ import org.hyperic.util.pager.Pager; import org.hyperic.util.pager.SortAttribute; import org.hyperic.util.stats.ConcurrentStatsCollector; +import org.hyperic.util.timer.StopWatch; /** * @ejb:bean name="AlertManager" @@ -230,8 +232,7 @@ } /** - * Find the last alert by definition ID - * @throws PermissionException + * Find the last unfixed alert by definition ID * * @ejb:interface-method */ @@ -244,6 +245,33 @@ return null; } } + + /** + * Find the last alerts for the given resource + * + * @ejb:interface-method + */ + public Map findLastByResource(AuthzSubject subj, + Resource r, + boolean includeDescendants, + boolean fixed) { + + StopWatch watch = new StopWatch(); + Map unfixedAlerts = null; + try { + unfixedAlerts = + getAlertDAO().findLastByResource(subj, r, includeDescendants, fixed); + } catch (Exception e) { + unfixedAlerts = Collections.EMPTY_MAP; + _log.error("Error finding the last alerts for resource id=" + r.getId(), e); + } finally { + if (_log.isDebugEnabled()) { + _log.debug("findLastByResource: " + watch); + } + } + + return unfixedAlerts; + } /** * Find the last alert by definition ID Modified: branches/HQ_4_2/unittest/src/org/hyperic/hq/events/server/session/MockAlertDefinitionManagerEJBImpl.java =================================================================== --- branches/HQ_4_2/unittest/src/org/hyperic/hq/events/server/session/MockAlertDefinitionManagerEJBImpl.java 2009-11-20 23:08:35 UTC (rev 13984) +++ branches/HQ_4_2/unittest/src/org/hyperic/hq/events/server/session/MockAlertDefinitionManagerEJBImpl.java 2009-11-20 23:16:45 UTC (rev 13985) @@ -31,7 +31,11 @@ public class MockAlertDefinitionManagerEJBImpl implements AlertDefinitionManagerLocal, Verifiable { - public void cleanupAlertDefinitions(AppdefEntityID aeid) { + public List getAllDeletedAlertDefs() { + return null; + } + + public void cleanupAlertDefs(List alertDefIds) { // TODO Auto-generated method stub } @@ -127,11 +131,6 @@ return null; } - public PageList findChildAlertDefinitions(Integer id) { - // TODO Auto-generated method stub - return null; - } - public List findRelatedAlertDefinitions(AuthzSubject subj, Resource res) { // TODO Auto-generated method stub return null; @@ -245,13 +244,12 @@ return false; } - public boolean updateAlertDefinitionInternalEnableForceNewTxn( - AuthzSubject subj, Integer defId, boolean enable) - throws PermissionException { - // TODO Auto-generated method stub - return false; - } - + public boolean updateAlertDefinitionInternalEnable(AuthzSubject subj, + List ids, boolean enable) throws PermissionException { + // TODO Auto-generated method stub + return false; + } + public void updateAlertDefinitionsActiveStatus(AuthzSubject subj, Integer[] ids, boolean activate) throws PermissionException { // TODO Auto-generated method stub Modified: branches/HQ_4_2/unittest/src/org/hyperic/hq/events/server/session/MockAlertDefinitionManagerLocalHome.java =================================================================== --- branches/HQ_4_2/unittest/src/org/hyperic/hq/events/server/session/MockAlertDefinitionManagerLocalHome.java 2009-11-20 23:08:35 UTC (rev 13984) +++ branches/HQ_4_2/unittest/src/org/hyperic/hq/events/server/session/MockAlertDefinitionManagerLocalHome.java 2009-11-20 23:16:45 UTC (rev 13985) @@ -35,7 +35,11 @@ this.adMan = adMan; } - public void cleanupAlertDefinitions(AppdefEntityID aeid) { + public List getAllDeletedAlertDefs() { + return null; + } + + public void cleanupAlertDefs(List alertDefIds) { // TODO Auto-generated method stub } @@ -127,11 +131,6 @@ return null; } - public PageList findChildAlertDefinitions(Integer id) { - // TODO Auto-generated method stub - return null; - } - public List findRelatedAlertDefinitions(AuthzSubject subj, Resource res) { // TODO Auto-generated method stub return null; @@ -245,12 +244,12 @@ return false; } - public boolean updateAlertDefinitionInternalEnableForceNewTxn(AuthzSubject subj, Integer defId, boolean enable) throws PermissionException - { + public boolean updateAlertDefinitionInternalEnable(AuthzSubject subj, + List ids, boolean enable) throws PermissionException { // TODO Auto-generated method stub return false; } - + public void updateAlertDefinitionsActiveStatus(AuthzSubject subj, Integer[] ids, boolean activate) throws PermissionException { // TODO Auto-generated method stub |