Bug 7409: Implement forcely-cancelling mechenism for jobs that have been staying in queue for too long

1) introduced a global configuration variable job.cancel.threshold.minutes
2) Default value for the job.cancel.threshold.minutes is 60 minutes, if a job has been staying in processing state for over 60 minutes, system will forcely remove it from the queue to allow others to run
This commit is contained in:
Kelven Yang 2011-01-05 15:43:51 -08:00
parent 6cade1aa1d
commit ea88089fd2
9 changed files with 179 additions and 112 deletions

View File

@ -46,6 +46,7 @@ import com.cloud.async.dao.AsyncJobDao;
import com.cloud.cluster.ClusterManager;
import com.cloud.cluster.ClusterManagerListener;
import com.cloud.cluster.ManagementServerHostVO;
import com.cloud.configuration.Config;
import com.cloud.configuration.dao.ConfigurationDao;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.exception.PermissionDeniedException;
@ -82,6 +83,7 @@ public class AsyncJobManagerImpl implements AsyncJobManager, ClusterManagerListe
private AccountDao _accountDao;
private AsyncJobDao _jobDao;
private long _jobExpireSeconds = 86400; // 1 day
private long _jobCancelThresholdSeconds = 3600; // 1 hour
private ApiDispatcher _dispatcher;
private final ScheduledExecutorService _heartbeatScheduler =
@ -549,6 +551,18 @@ public class AsyncJobManagerImpl implements AsyncJobManager, ClusterManagerListe
}
}
// forcely cancel blocking queue items if they've been staying there for too long
List<SyncQueueItemVO> blockItems = _queueMgr.getBlockedQueueItems(_jobCancelThresholdSeconds*1000, false);
if(blockItems != null && blockItems.size() > 0) {
for(SyncQueueItemVO item : blockItems) {
if(item.getContentType().equalsIgnoreCase("AsyncJob"))
completeAsyncJob(item.getContentId(), 2, 0, "Job is cancelled as it has been blocking others for too long");
// purge the item and resume queue processing
_queueMgr.purgeItem(item.getId());
}
}
s_logger.trace("End cleanup expired async-jobs");
} catch(Throwable e) {
s_logger.error("Unexpected exception when trying to execute queue item, ", e);
@ -596,10 +610,13 @@ public class AsyncJobManagerImpl implements AsyncJobManager, ClusterManagerListe
throw new ConfigurationException("Unable to get the configuration dao.");
}
Map<String, String> configs = configDao.getConfiguration("management-server", params);
int expireMinutes = NumbersUtil.parseInt(configs.get("job.expire.minutes"), 24*60);
int expireMinutes = NumbersUtil.parseInt(
configDao.getValue(Config.JobExpireMinutes.key()), 24*60);
_jobExpireSeconds = (long)expireMinutes*60;
_jobCancelThresholdSeconds = NumbersUtil.parseInt(
configDao.getValue(Config.JobCancelThresholdMinutes.key()), 60);
_jobCancelThresholdSeconds *= 60;
_accountDao = locator.getDao(AccountDao.class);
if (_accountDao == null) {

View File

@ -29,5 +29,6 @@ public interface SyncQueueManager extends Manager {
public void purgeItem(long queueItemId);
public List<SyncQueueItemVO> getActiveQueueItems(Long msid, boolean exclusive);
public List<SyncQueueItemVO> getBlockedQueueItems(long thresholdMs, boolean exclusive);
public void resetQueueProcess(long msid);
}

View File

@ -33,8 +33,6 @@ import com.cloud.async.dao.SyncQueueItemDao;
import com.cloud.utils.DateUtil;
import com.cloud.utils.component.ComponentLocator;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
import com.cloud.utils.exception.CloudRuntimeException;
@ -204,6 +202,11 @@ public class SyncQueueManagerImpl implements SyncQueueManager {
return _syncQueueItemDao.getActiveQueueItems(msid, exclusive);
}
@Override
public List<SyncQueueItemVO> getBlockedQueueItems(long thresholdMs, boolean exclusive) {
return _syncQueueItemDao.getBlockedQueueItems(thresholdMs, exclusive);
}
@Override
public void resetQueueProcess(long msid) {
_syncQueueDao.resetQueueProcessing(msid);

View File

@ -18,13 +18,14 @@
package com.cloud.async.dao;
import java.util.List;
import java.util.List;
import com.cloud.async.SyncQueueItemVO;
import com.cloud.utils.db.GenericDao;
public interface SyncQueueItemDao extends GenericDao<SyncQueueItemVO, Long> {
public SyncQueueItemVO getNextQueueItem(long queueId);
public List<SyncQueueItemVO> getNextQueueItems(int maxItems);
public List<SyncQueueItemVO> getActiveQueueItems(Long msid, boolean exclusive);
public List<SyncQueueItemVO> getActiveQueueItems(Long msid, boolean exclusive);
public List<SyncQueueItemVO> getBlockedQueueItems(long thresholdMs, boolean exclusive);
}

View File

@ -22,6 +22,7 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
@ -30,16 +31,20 @@ import javax.ejb.Local;
import org.apache.log4j.Logger;
import com.cloud.async.SyncQueueItemVO;
import com.cloud.async.SyncQueueVO;
import com.cloud.utils.DateUtil;
import com.cloud.utils.db.Filter;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.JoinBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
@Local(value = { SyncQueueItemDao.class })
public class SyncQueueItemDaoImpl extends GenericDaoBase<SyncQueueItemVO, Long> implements SyncQueueItemDao {
private static final Logger s_logger = Logger.getLogger(SyncQueueItemDaoImpl.class);
private static final Logger s_logger = Logger.getLogger(SyncQueueItemDaoImpl.class);
private final SyncQueueDao _syncQueueDao = new SyncQueueDaoImpl();
@Override
public SyncQueueItemVO getNextQueueItem(long queueId) {
@ -109,5 +114,30 @@ public class SyncQueueItemDaoImpl extends GenericDaoBase<SyncQueueItemVO, Long>
if(exclusive)
return lockRows(sc, filter, true);
return listBy(sc, filter);
}
}
@Override
public List<SyncQueueItemVO> getBlockedQueueItems(long thresholdMs, boolean exclusive) {
Date cutTime = DateUtil.currentGMTTime();
cutTime = new Date(cutTime.getTime() - thresholdMs);
SearchBuilder<SyncQueueVO> sbQueue = _syncQueueDao.createSearchBuilder();
sbQueue.and("lastProcessTime", sbQueue.entity().getLastProcessTime(), SearchCriteria.Op.NNULL);
sbQueue.and("lastProcessTime2", sbQueue.entity().getLastProcessTime(), SearchCriteria.Op.LT);
SearchBuilder<SyncQueueItemVO> sbItem = createSearchBuilder();
sbItem.join("queueItemJoinQueue", sbQueue, sbQueue.entity().getId(), sbItem.entity().getQueueId(), JoinBuilder.JoinType.INNER);
sbItem.and("lastProcessMsid", sbItem.entity().getLastProcessMsid(), SearchCriteria.Op.NNULL);
sbItem.and("lastProcessNumber", sbItem.entity().getLastProcessNumber(), SearchCriteria.Op.NNULL);
sbQueue.done();
sbItem.done();
SearchCriteria<SyncQueueItemVO> sc = sbItem.create();
sc.setJoinParameters("queueItemJoinQueue", "lastProcessTime2", cutTime);
if(exclusive)
return lockRows(sc, null, true);
return listBy(sc, null);
}
}

View File

@ -112,6 +112,7 @@ public enum Config {
// Advanced
JobExpireMinutes("Advanced", ManagementServer.class, String.class, "job.expire.minutes", "1440", "Time (in minutes) for async-jobs to be kept in system", null),
JobCancelThresholdMinutes("Advanced", ManagementServer.class, String.class, "job.cancel.threshold.minutes", "60", "Time (in minutes) for async-jobs to be forcely cancelled if it has been in process for long", null),
AccountCleanupInterval("Advanced", ManagementServer.class, Integer.class, "account.cleanup.interval", "86400", "The interval in seconds between cleanup for removed accounts", null),
AllowPublicUserTemplates("Advanced", ManagementServer.class, Integer.class, "allow.public.user.templates", "true", "If false, users will not be able to create public templates.", null),

View File

@ -24,160 +24,160 @@
-->
<components.xml>
<management-server class="com.vmops.server.ManagementServerImpl">
<dao name="domain router" class="com.vmops.vm.dao.DomainRouterDaoImpl"/>
<dao name="host" class="com.vmops.host.dao.HostDaoImpl"/>
<dao name="VM Instance" class="com.vmops.vm.dao.VMInstanceDaoImpl"/>
<dao name="User VM" class="com.vmops.vm.dao.UserVmDaoImpl"/>
<dao name="ServiceOffering" class="com.vmops.service.dao.ServiceOfferingDaoImpl">
<dao name="domain router" class="com.cloud.vm.dao.DomainRouterDaoImpl"/>
<dao name="host" class="com.cloud.host.dao.HostDaoImpl"/>
<dao name="VM Instance" class="com.cloud.vm.dao.VMInstanceDaoImpl"/>
<dao name="User VM" class="com.cloud.vm.dao.UserVmDaoImpl"/>
<dao name="ServiceOffering" class="com.cloud.service.dao.ServiceOfferingDaoImpl">
<param name="cache.size">50</param>
<param name="cache.time.to.live">-1</param>
</dao>
<dao name="DiskOffering" class="com.vmops.storage.dao.DiskOfferingDaoImpl"/>
<dao name="VMDisk" class="com.vmops.storage.dao.VmDiskDaoImpl"/>
<dao name="host zone" class="com.vmops.dc.dao.DataCenterDaoImpl">
<dao name="DiskOffering" class="com.cloud.storage.dao.DiskOfferingDaoImpl"/>
<dao name="VMDisk" class="com.cloud.storage.dao.VmDiskDaoImpl"/>
<dao name="host zone" class="com.cloud.dc.dao.DataCenterDaoImpl">
<param name="cache.size">50</param>
<param name="cache.time.to.live">-1</param>
</dao>
<dao name="host pod" class="com.vmops.dc.dao.HostPodDaoImpl">
<dao name="host pod" class="com.cloud.dc.dao.HostPodDaoImpl">
<param name="cache.size">50</param>
<param name="cache.time.to.live">-1</param>
</dao>
<dao name="vlan" class="com.vmops.dc.dao.VlanDaoImpl">
<dao name="vlan" class="com.cloud.dc.dao.VlanDaoImpl">
</dao>
<dao name="Volume" class="com.vmops.storage.dao.VolumeDaoImpl"/>
<dao name="Events" class="com.vmops.event.dao.EventDaoImpl"/>
<dao name="VM Template" class="com.vmops.storage.dao.VMTemplateDaoImpl">
<dao name="Volume" class="com.cloud.storage.dao.VolumeDaoImpl"/>
<dao name="Events" class="com.cloud.event.dao.EventDaoImpl"/>
<dao name="VM Template" class="com.cloud.storage.dao.VMTemplateDaoImpl">
<param name="cache.size">50</param>
<param name="cache.time.to.live">-1</param>
<param name="routing.uniquename">routing</param>
</dao>
<dao name="User" class="com.vmops.user.dao.UserDaoImpl">
<dao name="User" class="com.cloud.user.dao.UserDaoImpl">
<param name="cache.size">5000</param>
<param name="cache.time.to.live">300</param>
</dao>
<dao name="UserStats" class="com.vmops.user.dao.UserStatisticsDaoImpl"/>
<dao name="Disk Template" class="com.vmops.storage.dao.DiskTemplateDaoImpl">
<dao name="UserStats" class="com.cloud.user.dao.UserStatisticsDaoImpl"/>
<dao name="Disk Template" class="com.cloud.storage.dao.DiskTemplateDaoImpl">
<param name="cache.size">50</param>
<param name="cache.time.to.live">-1</param>
</dao>
<dao name="Firewall Rules" class="com.vmops.network.dao.FirewallRulesDaoImpl"/>
<dao name="Security Group" class="com.vmops.network.dao.SecurityGroupDaoImpl"/>
<dao name="Load Balancer" class="com.vmops.network.dao.LoadBalancerDaoImpl"/>
<dao name="Network Rule Config" class="com.vmops.network.dao.NetworkRuleConfigDaoImpl"/>
<dao name="Security Group Mapping" class="com.vmops.network.dao.SecurityGroupVMMapDaoImpl"/>
<dao name="Load Balancer Mapping" class="com.vmops.network.dao.LoadBalancerVMMapDaoImpl"/>
<dao name="IP Addresses" class="com.vmops.network.dao.IPAddressDaoImpl"/>
<dao name="Datacenter IP Addresses" class="com.vmops.dc.dao.DataCenterIpAddressDaoImpl"/>
<dao name="Pricing" class="com.vmops.pricing.dao.PricingDaoImpl"/>
<dao name="Usage" class="com.vmops.usage.dao.UsageDaoImpl"/>
<dao name="UsageJob" class="com.vmops.usage.dao.UsageJobDaoImpl"/>
<dao name="Alert" class="com.vmops.alert.dao.AlertDaoImpl"/>
<dao name="Capacity" class="com.vmops.capacity.dao.CapacityDaoImpl"/>
<dao name="Domain" class="com.vmops.domain.dao.DomainDaoImpl"/>
<dao name="Account" class="com.vmops.user.dao.AccountDaoImpl"/>
<dao name="Limit" class="com.vmops.configuration.dao.LimitDaoImpl"/>
<dao name="UserAccount" class="com.vmops.user.dao.UserAccountDaoImpl"/>
<dao name="Usage IPAddress" class="com.vmops.usage.dao.UsageIPAddressDaoImpl"/>
<dao name="VM Template Host" class="com.vmops.storage.dao.VMTemplateHostDaoImpl"/>
<dao name="Upload" class="com.vmops.storage.dao.UploadDaoImpl"/>
<dao name="VM Template Pool" class="com.vmops.storage.dao.VMTemplatePoolDaoImpl"/>
<dao name="Launch Permission" class="com.vmops.storage.dao.LaunchPermissionDaoImpl"/>
<dao name="Configuration" class="com.vmops.configuration.dao.ConfigurationDaoImpl"/>
<dao name="HA" class="com.vmops.ha.dao.HighAvailabilityDaoImpl"/>
<dao name="Console Proxy" class="com.vmops.vm.dao.ConsoleProxyDaoImpl"/>
<dao name="Upgrade" class="com.vmops.maint.dao.AgentUpgradeDaoImpl"/>
<dao name="Management Server Host" class="com.vmops.cluster.dao.ManagementServerHostDaoImpl"/>
<dao name="Snapshot" class="com.vmops.storage.dao.SnapshotDaoImpl"/>
<dao name="ScheduledVMBackup" class="com.vmops.user.dao.ScheduledVMBackupDaoImpl"/>
<dao name="AsyncJobDao" class="com.vmops.async.dao.AsyncJobDaoImpl"/>
<dao name="SyncQueueDao" class="com.vmops.async.dao.SyncQueueDaoImpl"/>
<dao name="SyncQueueItemDao" class="com.vmops.async.dao.SyncQueueItemDaoImpl"/>
<dao name="GuestOSDao" class="com.vmops.storage.dao.GuestOSDaoImpl"/>
<dao name="Firewall Rules" class="com.cloud.network.dao.FirewallRulesDaoImpl"/>
<dao name="Security Group" class="com.cloud.network.dao.SecurityGroupDaoImpl"/>
<dao name="Load Balancer" class="com.cloud.network.dao.LoadBalancerDaoImpl"/>
<dao name="Network Rule Config" class="com.cloud.network.dao.NetworkRuleConfigDaoImpl"/>
<dao name="Security Group Mapping" class="com.cloud.network.dao.SecurityGroupVMMapDaoImpl"/>
<dao name="Load Balancer Mapping" class="com.cloud.network.dao.LoadBalancerVMMapDaoImpl"/>
<dao name="IP Addresses" class="com.cloud.network.dao.IPAddressDaoImpl"/>
<dao name="Datacenter IP Addresses" class="com.cloud.dc.dao.DataCenterIpAddressDaoImpl"/>
<dao name="Pricing" class="com.cloud.pricing.dao.PricingDaoImpl"/>
<dao name="Usage" class="com.cloud.usage.dao.UsageDaoImpl"/>
<dao name="UsageJob" class="com.cloud.usage.dao.UsageJobDaoImpl"/>
<dao name="Alert" class="com.cloud.alert.dao.AlertDaoImpl"/>
<dao name="Capacity" class="com.cloud.capacity.dao.CapacityDaoImpl"/>
<dao name="Domain" class="com.cloud.domain.dao.DomainDaoImpl"/>
<dao name="Account" class="com.cloud.user.dao.AccountDaoImpl"/>
<dao name="Limit" class="com.cloud.configuration.dao.LimitDaoImpl"/>
<dao name="UserAccount" class="com.cloud.user.dao.UserAccountDaoImpl"/>
<dao name="Usage IPAddress" class="com.cloud.usage.dao.UsageIPAddressDaoImpl"/>
<dao name="VM Template Host" class="com.cloud.storage.dao.VMTemplateHostDaoImpl"/>
<dao name="Upload" class="com.cloud.storage.dao.UploadDaoImpl"/>
<dao name="VM Template Pool" class="com.cloud.storage.dao.VMTemplatePoolDaoImpl"/>
<dao name="Launch Permission" class="com.cloud.storage.dao.LaunchPermissionDaoImpl"/>
<dao name="Configuration" class="com.cloud.configuration.dao.ConfigurationDaoImpl"/>
<dao name="HA" class="com.cloud.ha.dao.HighAvailabilityDaoImpl"/>
<dao name="Console Proxy" class="com.cloud.vm.dao.ConsoleProxyDaoImpl"/>
<dao name="Upgrade" class="com.cloud.maint.dao.AgentUpgradeDaoImpl"/>
<dao name="Management Server Host" class="com.cloud.cluster.dao.ManagementServerHostDaoImpl"/>
<dao name="Snapshot" class="com.cloud.storage.dao.SnapshotDaoImpl"/>
<dao name="ScheduledVMBackup" class="com.cloud.user.dao.ScheduledVMBackupDaoImpl"/>
<dao name="AsyncJobDao" class="com.cloud.async.dao.AsyncJobDaoImpl"/>
<dao name="SyncQueueDao" class="com.cloud.async.dao.SyncQueueDaoImpl"/>
<dao name="SyncQueueItemDao" class="com.cloud.async.dao.SyncQueueItemDaoImpl"/>
<dao name="GuestOSDao" class="com.cloud.storage.dao.GuestOSDaoImpl"/>
<dao name="StoragePoolDao" class="com.vmops.storage.dao.StoragePoolDaoImpl"/>
<dao name="StoragePoolHostDao" class="com.vmops.storage.dao.StoragePoolHostDaoImpl"/>
<dao name="HostDetails" class="com.vmops.host.dao.DetailsDaoImpl"/>
<dao name="StoragePoolDao" class="com.cloud.storage.dao.StoragePoolDaoImpl"/>
<dao name="StoragePoolHostDao" class="com.cloud.storage.dao.StoragePoolHostDaoImpl"/>
<dao name="HostDetails" class="com.cloud.host.dao.DetailsDaoImpl"/>
<adapters key="com.vmops.agent.manager.allocator.HostAllocator">
<adapter name="FirstFitRouting" class="com.vmops.agent.manager.allocator.impl.FirstFitRoutingAllocator"/>
<adapter name="FirstFit" class="com.vmops.agent.manager.allocator.impl.FirstFitAllocator"/>
<adapters key="com.cloud.agent.manager.allocator.HostAllocator">
<adapter name="FirstFitRouting" class="com.cloud.agent.manager.allocator.impl.FirstFitRoutingAllocator"/>
<adapter name="FirstFit" class="com.cloud.agent.manager.allocator.impl.FirstFitAllocator"/>
</adapters>
<adapters key="com.vmops.agent.manager.allocator.StorageAllocator">
<adapter name="Storage" class="com.vmops.agent.manager.allocator.impl.FirstFitStorageAllocator">
<adapters key="com.cloud.agent.manager.allocator.StorageAllocator">
<adapter name="Storage" class="com.cloud.agent.manager.allocator.impl.FirstFitStorageAllocator">
<param name="storage.overprovisioning.factor">2</param>
</adapter>
<adapter name="Storage" class="com.vmops.agent.manager.allocator.impl.RandomStoragePoolAllocator">
<adapter name="Storage" class="com.cloud.agent.manager.allocator.impl.RandomStoragePoolAllocator">
<param name="storage.overprovisioning.factor">2</param>
</adapter>
</adapters>
<adapters key="com.vmops.agent.manager.allocator.PodAllocator">
<adapter name="User First" class="com.vmops.agent.manager.allocator.impl.UserConcentratedAllocator"/>
<adapters key="com.cloud.agent.manager.allocator.PodAllocator">
<adapter name="User First" class="com.cloud.agent.manager.allocator.impl.UserConcentratedAllocator"/>
</adapters>
<adapters key="com.vmops.consoleproxy.ConsoleProxyAllocator">
<adapter name="Balance" class="com.vmops.consoleproxy.ConsoleProxyBalanceAllocator"/>
<adapters key="com.cloud.consoleproxy.ConsoleProxyAllocator">
<adapter name="Balance" class="com.cloud.consoleproxy.ConsoleProxyBalanceAllocator"/>
</adapters>
<adapters key="com.vmops.server.auth.UserAuthenticator">
<adapter name="MD5" class="com.vmops.server.auth.MD5UserAuthenticator"/>
<adapters key="com.cloud.server.auth.UserAuthenticator">
<adapter name="MD5" class="com.cloud.server.auth.MD5UserAuthenticator"/>
</adapters>
<adapters key="com.vmops.ha.Investigator">
<adapter name="SimpleInvestigator" class="com.vmops.ha.CheckOnAgentInvestigator"/>
<adapter name="PingInvestigator" class="com.vmops.ha.InvestigatorImpl"/>
<adapters key="com.cloud.ha.Investigator">
<adapter name="SimpleInvestigator" class="com.cloud.ha.CheckOnAgentInvestigator"/>
<adapter name="PingInvestigator" class="com.cloud.ha.InvestigatorImpl"/>
</adapters>
<adapters key="com.vmops.ha.FenceBuilder">
<adapter name="StorageFenceBuilder" class="com.vmops.ha.StorageFence"/>
<adapters key="com.cloud.ha.FenceBuilder">
<adapter name="StorageFenceBuilder" class="com.cloud.ha.StorageFence"/>
</adapters>
<adapters key="com.vmops.cluster.ClusterServiceAdapter">
<adapter name="ClusterService" class="com.vmops.cluster.ClusterServiceServletAdapter"/>
<adapters key="com.cloud.cluster.ClusterServiceAdapter">
<adapter name="ClusterService" class="com.cloud.cluster.ClusterServiceServletAdapter"/>
</adapters>
<adapters key="com.vmops.resource.Discoverer">
<adapter name="XenServer" class="com.vmops.resource.xen.XenServerDiscoverer"/>
<adapter name="SecondaryStorage" class="com.vmops.storage.secondary.SecondaryStorageDiscoverer"/>
<adapter name="DummyHostServer" class="com.vmops.resource.DummyHostDiscoverer"/>
<adapters key="com.cloud.resource.Discoverer">
<adapter name="XenServer" class="com.cloud.resource.xen.XenServerDiscoverer"/>
<adapter name="SecondaryStorage" class="com.cloud.storage.secondary.SecondaryStorageDiscoverer"/>
<adapter name="DummyHostServer" class="com.cloud.resource.DummyHostDiscoverer"/>
</adapters>
<manager name="account manager" class="com.vmops.user.AccountManagerImpl">
<manager name="account manager" class="com.cloud.user.AccountManagerImpl">
</manager>
<manager name="agent manager" class="com.vmops.agent.manager.ClusteredAgentManagerImpl">
<manager name="agent manager" class="com.cloud.agent.manager.ClusteredAgentManagerImpl">
</manager>
<manager name="configuration manager" class="com.vmops.configuration.ConfigurationManagerImpl">
<manager name="configuration manager" class="com.cloud.configuration.ConfigurationManagerImpl">
<param name="premium">true</param>
</manager>
<manager name="network manager" class="com.vmops.network.NetworkManagerImpl">
<manager name="network manager" class="com.cloud.network.NetworkManagerImpl">
</manager>
<manager name="download manager" class="com.vmops.storage.download.DownloadMonitorImpl">
<manager name="download manager" class="com.cloud.storage.download.DownloadMonitorImpl">
</manager>
<manager name="upload manager" class="com.cloud.storage.upload.UploadMonitorImpl">
</manager>
<manager name="console proxy manager" class="com.vmops.consoleproxy.ConsoleProxyManagerImpl">
<manager name="console proxy manager" class="com.cloud.consoleproxy.ConsoleProxyManagerImpl">
</manager>
<manager name="vm manager" class="com.vmops.vm.UserVmManagerImpl"/>
<manager name="upgrade manager" class="com.vmops.maint.UpgradeManagerImpl">
<manager name="vm manager" class="com.cloud.vm.UserVmManagerImpl"/>
<manager name="upgrade manager" class="com.cloud.maint.UpgradeManagerImpl">
</manager>
<manager name="StorageManager" class="com.vmops.storage.StorageManagerImpl">
<manager name="StorageManager" class="com.cloud.storage.StorageManagerImpl">
</manager>
<manager name="HA Manager" class="com.vmops.ha.HighAvailabilityManagerExtImpl">
<manager name="HA Manager" class="com.cloud.ha.HighAvailabilityManagerExtImpl">
</manager>
<manager name="Cluster Manager" class="com.vmops.cluster.ClusterManagerImpl">
<manager name="Cluster Manager" class="com.cloud.cluster.ClusterManagerImpl">
</manager>
<manager name="SyncQueueManager" class="com.vmops.async.SyncQueueManagerImpl">
<manager name="SyncQueueManager" class="com.cloud.async.SyncQueueManagerImpl">
</manager>
<manager name="AsyncJobManager" class="com.vmops.async.AsyncJobManagerImpl">
<manager name="AsyncJobManager" class="com.cloud.async.AsyncJobManagerImpl">
</manager>
<manager name="AsyncJobExecutorContext" class="com.vmops.async.AsyncJobExecutorContextImpl">
<manager name="AsyncJobExecutorContext" class="com.cloud.async.AsyncJobExecutorContextImpl">
</manager>
<manager name="Alert Manager" class="com.vmops.alert.AlertManagerImpl">
<manager name="Alert Manager" class="com.cloud.alert.AlertManagerImpl">
</manager>
<manager name="Template Manager" class="com.vmops.template.TemplateManagerImpl">
<manager name="Template Manager" class="com.cloud.template.TemplateManagerImpl">
</manager>
<adapters key="com.vmops.alert.AlertAdapter">
<adapter name="ClusterAlert" class="com.vmops.alert.ClusterAlertAdapter"/>
<adapter name="ConsoleProxyAlert" class="com.vmops.alert.ConsoleProxyAlertAdapter"/>
<adapters key="com.cloud.alert.AlertAdapter">
<adapter name="ClusterAlert" class="com.cloud.alert.ClusterAlertAdapter"/>
<adapter name="ConsoleProxyAlert" class="com.cloud.alert.ConsoleProxyAlertAdapter"/>
</adapters>
</management-server>

View File

@ -20,8 +20,6 @@ package com.cloud.async;
import java.util.List;
import junit.framework.Assert;
import org.apache.log4j.Logger;
import com.cloud.utils.component.ComponentLocator;
@ -34,7 +32,7 @@ public class TestSyncQueueManager extends ComponentTestCase {
private volatile int count = 0;
private volatile long expectingCurrent = 1;
public void leftOverItems() {
SyncQueueManager mgr = ComponentLocator.getCurrentLocator().getManager(
SyncQueueManager.class);
@ -198,5 +196,21 @@ public class TestSyncQueueManager extends ComponentTestCase {
for(int q = 1; q <= queues; q++)
for(int i = 0; i < totalRuns; i++)
mgr.queue("vm_instance", q, "Async-job", i+1);
}
}
public void testSyncQueue() {
final SyncQueueManager mgr = ComponentLocator.getCurrentLocator().getManager(
SyncQueueManager.class);
mgr.queue("vm_instance", 1, "Async-job", 1);
mgr.queue("vm_instance", 1, "Async-job", 2);
mgr.queue("vm_instance", 1, "Async-job", 3);
mgr.dequeueFromAny(100L, 1);
List<SyncQueueItemVO> l = mgr.getBlockedQueueItems(100000, false);
for(SyncQueueItemVO item : l) {
System.out.println("Blocked item. " + item.getContentType() + "-" + item.getContentId());
mgr.purgeItem(item.getId());
}
}
}

View File

@ -1,8 +1,8 @@
<components.xml>
<management-server class="com.vmops.async.TestSyncQueueManager">
<dao name="sync queue dao" class="com.vmops.async.dao.SyncQueueDaoImpl"/>
<dao name="sync queue item dao" class="com.vmops.async.dao.SyncQueueItemDaoImpl"/>
<manager name="sync queue manager" class="com.vmops.async.SyncQueueManagerImpl">
<management-server class="com.cloud.async.TestSyncQueueManager">
<dao name="sync queue dao" class="com.cloud.async.dao.SyncQueueDaoImpl"/>
<dao name="sync queue item dao" class="com.cloud.async.dao.SyncQueueItemDaoImpl"/>
<manager name="sync queue manager" class="com.cloud.async.SyncQueueManagerImpl">
</manager>
</management-server>
</components.xml>