diff --git a/api/src/com/cloud/agent/api/BackupSnapshotCommand.java b/api/src/com/cloud/agent/api/BackupSnapshotCommand.java index afff7368c70..3d3591f628c 100644 --- a/api/src/com/cloud/agent/api/BackupSnapshotCommand.java +++ b/api/src/com/cloud/agent/api/BackupSnapshotCommand.java @@ -64,7 +64,8 @@ public class BackupSnapshotCommand extends SnapshotCommand { String prevSnapshotUuid, String prevBackupUuid, boolean isVolumeInactive, - String vmName) + String vmName, + int wait) { super(primaryStoragePoolNameLabel, secondaryStoragePoolURL, snapshotUuid, snapshotName, dcId, accountId, volumeId); this.snapshotId = snapshotId; @@ -74,6 +75,7 @@ public class BackupSnapshotCommand extends SnapshotCommand { this.vmName = vmName; this.pool = new StorageFilerTO(pool); setVolumePath(volumePath); + setWait(wait); } public String getPrevSnapshotUuid() { diff --git a/api/src/com/cloud/agent/api/CheckHealthCommand.java b/api/src/com/cloud/agent/api/CheckHealthCommand.java index f78d7cb49aa..937775e603f 100644 --- a/api/src/com/cloud/agent/api/CheckHealthCommand.java +++ b/api/src/com/cloud/agent/api/CheckHealthCommand.java @@ -20,8 +20,11 @@ package com.cloud.agent.api; public class CheckHealthCommand extends Command { - public CheckHealthCommand() {} - + public CheckHealthCommand() { + setWait(50); + } + + @Override public boolean executeInSequence() { return false; diff --git a/api/src/com/cloud/agent/api/CheckOnHostCommand.java b/api/src/com/cloud/agent/api/CheckOnHostCommand.java index 2bbb564acd4..5bb5d2a203d 100644 --- a/api/src/com/cloud/agent/api/CheckOnHostCommand.java +++ b/api/src/com/cloud/agent/api/CheckOnHostCommand.java @@ -29,6 +29,7 @@ public class CheckOnHostCommand extends Command { public CheckOnHostCommand(Host host) { this.host = new HostTO(host); + setWait(20); } public HostTO getHost() { diff --git a/api/src/com/cloud/agent/api/CheckVirtualMachineCommand.java b/api/src/com/cloud/agent/api/CheckVirtualMachineCommand.java index 3eea2979b4b..346328cc69f 100644 --- a/api/src/com/cloud/agent/api/CheckVirtualMachineCommand.java +++ b/api/src/com/cloud/agent/api/CheckVirtualMachineCommand.java @@ -27,6 +27,7 @@ public class CheckVirtualMachineCommand extends Command { public CheckVirtualMachineCommand(String vmName) { this.vmName = vmName; + setWait(20); } public String getVmName() { diff --git a/api/src/com/cloud/agent/api/Command.java b/api/src/com/cloud/agent/api/Command.java index 120ed6c7cb6..2263d90fd39 100755 --- a/api/src/com/cloud/agent/api/Command.java +++ b/api/src/com/cloud/agent/api/Command.java @@ -28,13 +28,23 @@ import com.cloud.agent.api.LogLevel.Log4jLevel; * all of the methods that needs to be implemented by the children classes. * */ -public abstract class Command { +public abstract class Command { // allow command to carry over hypervisor or other environment related context info @LogLevel(Log4jLevel.Trace) protected Map contextMap = new HashMap(); + private int wait; //in second protected Command() { + this.wait = 0; + } + + public int getWait() { + return wait; + } + + public void setWait(int wait) { + this.wait = wait; } @Override diff --git a/api/src/com/cloud/agent/api/CreatePrivateTemplateFromSnapshotCommand.java b/api/src/com/cloud/agent/api/CreatePrivateTemplateFromSnapshotCommand.java index 13581099af9..eb3cf8dcae0 100644 --- a/api/src/com/cloud/agent/api/CreatePrivateTemplateFromSnapshotCommand.java +++ b/api/src/com/cloud/agent/api/CreatePrivateTemplateFromSnapshotCommand.java @@ -52,12 +52,14 @@ public class CreatePrivateTemplateFromSnapshotCommand extends SnapshotCommand { String backedUpSnapshotName, String origTemplateInstallPath, Long newTemplateId, - String templateName) + String templateName, + int wait) { super(primaryStoragePoolNameLabel, secondaryStoragePoolURL, backedUpSnapshotUuid, backedUpSnapshotName, dcId, accountId, volumeId); this.origTemplateInstallPath = origTemplateInstallPath; this.newTemplateId = newTemplateId; this.templateName = templateName; + setWait(wait); } /** diff --git a/api/src/com/cloud/agent/api/CreatePrivateTemplateFromVolumeCommand.java b/api/src/com/cloud/agent/api/CreatePrivateTemplateFromVolumeCommand.java index 60f34e285b6..20e26607bbf 100644 --- a/api/src/com/cloud/agent/api/CreatePrivateTemplateFromVolumeCommand.java +++ b/api/src/com/cloud/agent/api/CreatePrivateTemplateFromVolumeCommand.java @@ -31,14 +31,15 @@ public class CreatePrivateTemplateFromVolumeCommand extends SnapshotCommand { public CreatePrivateTemplateFromVolumeCommand() {} - public CreatePrivateTemplateFromVolumeCommand(String secondaryStorageURL, long templateId, long accountId, String userSpecifiedName, String uniqueName, String volumePath, String vmName) { + public CreatePrivateTemplateFromVolumeCommand(String secondaryStorageURL, long templateId, long accountId, String userSpecifiedName, String uniqueName, String volumePath, String vmName, int wait) { _secondaryStorageURL = secondaryStorageURL; _templateId = templateId; _accountId = accountId; _userSpecifiedName = userSpecifiedName; _uniqueName = uniqueName; _volumePath = volumePath; - _vmName = vmName; + _vmName = vmName; + setWait(wait); } @Override diff --git a/api/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java b/api/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java index b6a2197d8d1..a9c81486f2a 100644 --- a/api/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java +++ b/api/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java @@ -50,9 +50,10 @@ public class CreateVolumeFromSnapshotCommand extends SnapshotCommand { Long accountId, Long volumeId, String backedUpSnapshotUuid, - String backedUpSnapshotName) + String backedUpSnapshotName, + int wait) { super(primaryStoragePoolNameLabel, secondaryStoragePoolURL, backedUpSnapshotUuid, backedUpSnapshotName, dcId, accountId, volumeId); + setWait(wait); } - } \ No newline at end of file diff --git a/api/src/com/cloud/agent/api/PingTestCommand.java b/api/src/com/cloud/agent/api/PingTestCommand.java index 98970315b07..308f47700fc 100644 --- a/api/src/com/cloud/agent/api/PingTestCommand.java +++ b/api/src/com/cloud/agent/api/PingTestCommand.java @@ -27,12 +27,14 @@ public class PingTestCommand extends Command { public PingTestCommand() {} public PingTestCommand(String computingHostIp) { - _computingHostIp = computingHostIp; + _computingHostIp = computingHostIp; + setWait(20); } public PingTestCommand(String routerIp, String privateIp) { _routerIp = routerIp; - _privateIp = privateIp; + _privateIp = privateIp; + setWait(20); } public String getComputingHostIp() { diff --git a/api/src/com/cloud/agent/api/storage/CopyVolumeCommand.java b/api/src/com/cloud/agent/api/storage/CopyVolumeCommand.java index 3e367230795..cbe5ff03d11 100644 --- a/api/src/com/cloud/agent/api/storage/CopyVolumeCommand.java +++ b/api/src/com/cloud/agent/api/storage/CopyVolumeCommand.java @@ -34,15 +34,16 @@ public class CopyVolumeCommand extends Command { public CopyVolumeCommand() { } - public CopyVolumeCommand(long volumeId, String volumePath, StoragePool pool, String secondaryStorageURL, boolean toSecondaryStorage) { + public CopyVolumeCommand(long volumeId, String volumePath, StoragePool pool, String secondaryStorageURL, boolean toSecondaryStorage, int wait) { this.volumeId = volumeId; this.volumePath = volumePath; this.pool = new StorageFilerTO(pool); this.secondaryStorageURL = secondaryStorageURL; this.toSecondaryStorage = toSecondaryStorage; + setWait(wait); } - @Override + @Override public boolean executeInSequence() { return true; } diff --git a/api/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java b/api/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java index 4f514a249a6..58de20e196d 100644 --- a/api/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java +++ b/api/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java @@ -32,15 +32,16 @@ public class PrimaryStorageDownloadCommand extends AbstractDownloadCommand { String secondaryStorageUrl; String primaryStorageUrl; - protected PrimaryStorageDownloadCommand() { + protected PrimaryStorageDownloadCommand() { } - public PrimaryStorageDownloadCommand(String name, String url, ImageFormat format, long accountId, long poolId, String poolUuid) { + public PrimaryStorageDownloadCommand(String name, String url, ImageFormat format, long accountId, long poolId, String poolUuid, int wait) { super(name, url, format, accountId); this.poolId = poolId; this.poolUuid = poolUuid; + setWait(wait); } - + public String getPoolUuid() { return poolUuid; } diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index 1bc43eb41c6..2e4e93296d3 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -2168,9 +2168,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe } } - String copy_vhd_to_secondarystorage(Connection conn, String mountpoint, String vdiuuid, String sruuid) { + private String copy_vhd_to_secondarystorage(Connection conn, String mountpoint, String vdiuuid, String sruuid, int wait) { String results = callHostPluginAsync(conn, "vmopspremium", "copy_vhd_to_secondarystorage", - 2 * 60 * 60 * 1000, "mountpoint", mountpoint, "vdiuuid", vdiuuid, "sruuid", sruuid); + wait, "mountpoint", mountpoint, "vdiuuid", vdiuuid, "sruuid", sruuid); if (results == null || results.isEmpty()) { String msg = "copy_vhd_to_secondarystorage return null"; @@ -2189,7 +2189,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe String upgradeSnapshot(Connection conn, String templatePath, String snapshotPath) { String results = callHostPluginAsync(conn, "vmopspremium", "upgrade_snapshot", - 2 * 60 * 60 * 1000, "templatePath", templatePath, "snapshotPath", snapshotPath); + 2 * 60 * 60, "templatePath", templatePath, "snapshotPath", snapshotPath); if (results == null || results.isEmpty()) { String msg = "upgrade_snapshot return null"; @@ -2206,9 +2206,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe } } - String createTemplateFromSnapshot(Connection conn, String templatePath, String snapshotPath) { + String createTemplateFromSnapshot(Connection conn, String templatePath, String snapshotPath, int wait) { String results = callHostPluginAsync(conn, "vmopspremium", "create_privatetemplate_from_snapshot", - 2 * 60 * 60 * 1000, "templatePath", templatePath, "snapshotPath", snapshotPath); + wait, "templatePath", templatePath, "snapshotPath", snapshotPath); if (results == null || results.isEmpty()) { String msg = "create_privatetemplate_from_snapshot return null"; @@ -2225,9 +2225,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe } } - String copy_vhd_from_secondarystorage(Connection conn, String mountpoint, String sruuid) { + String copy_vhd_from_secondarystorage(Connection conn, String mountpoint, String sruuid, int wait) { String results = callHostPluginAsync(conn, "vmopspremium", "copy_vhd_from_secondarystorage", - 2 * 60 * 60 * 1000, "mountpoint", mountpoint, "sruuid", sruuid); + wait, "mountpoint", mountpoint, "sruuid", sruuid); if (results == null || results.isEmpty()) { String msg = "copy_vhd_from_secondarystorage return null"; @@ -2247,6 +2247,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe public PrimaryStorageDownloadAnswer execute(final PrimaryStorageDownloadCommand cmd) { String tmplturl = cmd.getUrl(); String poolName = cmd.getPoolUuid(); + int wait = cmd.getWait(); try { URI uri = new URI(tmplturl); String tmplpath = uri.getHost() + ":" + uri.getPath(); @@ -2262,7 +2263,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe } String pUuid = poolsr.getUuid(conn); boolean isISCSI = IsISCSI(poolsr.getType(conn)); - String uuid = copy_vhd_from_secondarystorage(conn, tmplpath, pUuid); + String uuid = copy_vhd_from_secondarystorage(conn, tmplpath, pUuid, wait); VDI tmpl = getVDIbyUuid(conn, uuid); VDI snapshotvdi = tmpl.snapshot(conn, new HashMap()); String snapshotUuid = snapshotvdi.getUuid(conn); @@ -3024,12 +3025,15 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe } } - protected VDI cloudVDIcopy(Connection conn, VDI vdi, SR sr) throws XenAPIException, XmlRpcException { + protected VDI cloudVDIcopy(Connection conn, VDI vdi, SR sr, int wait) throws XenAPIException, XmlRpcException { Task task = null; + if ( wait == 0 ) { + wait = 2 * 60 * 60; + } try { task = vdi.copyAsync(conn, sr); // poll every 1 seconds , timeout after 2 hours - waitForTask(conn, task, 1000, 2 * 60 * 60 * 1000); + waitForTask(conn, task, 1000, wait * 1000); checkForSuccess(conn, task); VDI dvdi = Types.toVDI(task, conn); return dvdi; @@ -3047,7 +3051,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe boolean swiftDownload(Connection conn, SwiftTO swift, String rfilename, String lfilename) { String result = null; try { - result = callHostPluginAsync(conn, "swift", "swift", 60 * 60 * 1000, + result = callHostPluginAsync(conn, "swift", "swift", 60 * 60, "op", "download", "hostname", swift.getHostName(), "account", swift.getAccount(), "username", swift.getUserName(), "token", swift.getToken(), "rfilename", rfilename, "lfilename", lfilename); @@ -3063,7 +3067,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe boolean swiftUpload(Connection conn, SwiftTO swift, String rfilename, String lfilename) { String result = null; try { - result = callHostPluginAsync(conn, "swift", "swift", 60 * 60 * 1000, + result = callHostPluginAsync(conn, "swift", "swift", 60 * 60, "op", "upload", "hostname", swift.getHostName(), "account", swift.getAccount(), "username", swift.getUserName(), "token", swift.getToken(), "rfilename", rfilename, "lfilename", lfilename); @@ -3097,7 +3101,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe protected String backupSnapshot(Connection conn, String primaryStorageSRUuid, Long dcId, Long accountId, - Long volumeId, String secondaryStorageMountPath, String snapshotUuid, String prevBackupUuid, Boolean isISCSI) { + Long volumeId, String secondaryStorageMountPath, String snapshotUuid, String prevBackupUuid, Boolean isISCSI, int wait) { String backupSnapshotUuid = null; if (prevBackupUuid == null) { @@ -3106,7 +3110,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe // Each argument is put in a separate line for readability. // Using more lines does not harm the environment. - String results = callHostPluginAsync(conn, "vmopsSnapshot", "backupSnapshot", 60 * 60 * 1000, + String results = callHostPluginAsync(conn, "vmopsSnapshot", "backupSnapshot", wait, "primaryStorageSRUuid", primaryStorageSRUuid, "dcId", dcId.toString(), "accountId", accountId .toString(), "volumeId", volumeId.toString(), "secondaryStorageMountPath", secondaryStorageMountPath, "snapshotUuid", snapshotUuid, "prevBackupUuid", prevBackupUuid, "isISCSI", @@ -3137,7 +3141,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe return backupSnapshotUuid; } - protected String callHostPluginAsync(Connection conn, String plugin, String cmd, int timeout, String... params) { + protected String callHostPluginAsync(Connection conn, String plugin, String cmd, int wait, String... params) { + int timeout = wait * 1000; Map args = new HashMap(); Task task = null; try { @@ -5462,6 +5467,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe StorageFilerTO poolTO = cmd.getPool(); String secondaryStorageURL = cmd.getSecondaryStorageURL(); boolean toSecondaryStorage = cmd.toSecondaryStorage(); + int wait = cmd.getWait(); try { URI uri = new URI(secondaryStorageURL); String remoteVolumesMountPath = uri.getHost() + ":" + uri.getPath() + "/volumes/"; @@ -5484,20 +5490,20 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe // Look up the volume on the source primary storage pool VDI srcVolume = getVDIbyUuid(conn, volumeUUID); // Copy the volume to secondary storage - VDI destVolume = cloudVDIcopy(conn, srcVolume, secondaryStorage); + VDI destVolume = cloudVDIcopy(conn, srcVolume, secondaryStorage, wait); String destVolumeUUID = destVolume.getUuid(conn); return new CopyVolumeAnswer(cmd, true, null, null, destVolumeUUID); } finally { removeSR(conn, secondaryStorage); } } else { - String uuid = copy_vhd_to_secondarystorage(conn, mountpoint, volumeUUID, srUuid); + String uuid = copy_vhd_to_secondarystorage(conn, mountpoint, volumeUUID, srUuid, wait); return new CopyVolumeAnswer(cmd, true, null, null, uuid); } } else { try { String volumePath = mountpoint + "/" + volumeUUID + ".vhd"; - String uuid = copy_vhd_from_secondarystorage(conn, volumePath, srUuid); + String uuid = copy_vhd_from_secondarystorage(conn, volumePath, srUuid, wait ); return new CopyVolumeAnswer(cmd, true, null, srUuid, uuid); } finally { deleteSecondaryStorageFolder(conn, remoteVolumesMountPath, volumeFolder); @@ -5792,7 +5798,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe Long accountId = cmd.getAccountId(); String userSpecifiedName = cmd.getTemplateName(); Long templateId = cmd.getTemplateId(); - + int wait = cmd.getWait(); String details = null; SR tmpltSR = null; boolean result = false; @@ -5813,7 +5819,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe tmpltSR = createNfsSRbyURI(conn, tmpltURI, false); // copy volume to template SR - VDI tmpltVDI = cloudVDIcopy(conn, volume, tmpltSR); + VDI tmpltVDI = cloudVDIcopy(conn, volume, tmpltSR, wait); // scan makes XenServer pick up VDI physicalSize tmpltSR.scan(conn); if (userSpecifiedName != null) { @@ -5882,6 +5888,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe String backedUpSnapshotUuid = cmd.getSnapshotUuid(); Long newTemplateId = cmd.getNewTemplateId(); String userSpecifiedName = cmd.getTemplateName(); + int wait = cmd.getWait(); // By default, assume failure String details = null; boolean result = false; @@ -5897,7 +5904,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe String templatePath = secondaryStorageMountPath + "/" + installPath; // create snapshot SR String snapshotPath = secondaryStorageMountPath + "/snapshots/" + accountId + "/" + volumeId + "/" + backedUpSnapshotUuid + ".vhd"; - String results = createTemplateFromSnapshot(conn, templatePath, snapshotPath); + String results = createTemplateFromSnapshot(conn, templatePath, snapshotPath, wait); String[] tmp = results.split("#"); String tmpltUuid = tmp[1]; long physicalSize = Long.parseLong(tmp[2]); @@ -5958,6 +5965,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe String snapshotUuid = cmd.getSnapshotUuid(); // not null: Precondition. String prevBackupUuid = cmd.getPrevBackupUuid(); String prevSnapshotUuid = cmd.getPrevSnapshotUuid(); + int wait = cmd.getWait(); // By default assume failure String details = null; boolean success = false; @@ -6000,7 +6008,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe SR snapshotSr = null; try { snapshotSr = createNfsSRbyURI(conn, new URI(snapshotMountpoint), false); - VDI backedVdi = cloudVDIcopy(conn, snapshotVdi, snapshotSr); + VDI backedVdi = cloudVDIcopy(conn, snapshotVdi, snapshotSr, wait); snapshotBackupUuid = backedVdi.getUuid(conn); if( cmd.getSwift() != null ) { try { @@ -6023,7 +6031,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe snapshotBackupUuid = filename; success = true; } else { - snapshotBackupUuid = backupSnapshot(conn, primaryStorageSRUuid, dcId, accountId, volumeId, secondaryStorageMountPath, snapshotUuid, prevBackupUuid, isISCSI); + snapshotBackupUuid = backupSnapshot(conn, primaryStorageSRUuid, dcId, accountId, volumeId, secondaryStorageMountPath, snapshotUuid, prevBackupUuid, isISCSI, wait); success = (snapshotBackupUuid != null); } } @@ -6050,7 +6058,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe Long volumeId = cmd.getVolumeId(); String secondaryStoragePoolURL = cmd.getSecondaryStoragePoolURL(); String backedUpSnapshotUuid = cmd.getSnapshotUuid(); - + int wait = cmd.getWait(); boolean result = false; // Generic error message. String details = null; @@ -6071,7 +6079,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe URI snapshotURI = new URI(secondaryStoragePoolURL + "/snapshots/" + accountId + "/" + volumeId ); String snapshotPath = snapshotURI.getHost() + ":" + snapshotURI.getPath() + "/" + backedUpSnapshotUuid + ".vhd"; String srUuid = primaryStorageSR.getUuid(conn); - volumeUUID = copy_vhd_from_secondarystorage(conn, snapshotPath, srUuid); + volumeUUID = copy_vhd_from_secondarystorage(conn, snapshotPath, srUuid, wait); result = true; } catch (XenAPIException e) { details += " due to " + e.toString(); diff --git a/server/src/com/cloud/agent/AgentManager.java b/server/src/com/cloud/agent/AgentManager.java index 0851eb7d8fc..838c9b56174 100755 --- a/server/src/com/cloud/agent/AgentManager.java +++ b/server/src/com/cloud/agent/AgentManager.java @@ -73,7 +73,6 @@ public interface AgentManager extends Manager { * command * @return an Answer */ - Answer send(Long hostId, Command cmd, int timeout) throws AgentUnavailableException, OperationTimedoutException; Answer send(Long hostId, Command cmd) throws AgentUnavailableException, OperationTimedoutException; @@ -245,8 +244,6 @@ public interface AgentManager extends Manager { public boolean reconnect(final long hostId) throws AgentUnavailableException; - Answer easySend(Long hostId, Command cmd, int timeout); - boolean isHostNativeHAEnabled(long hostId); Answer sendTo(Long dcId, HypervisorType type, Command cmd); diff --git a/server/src/com/cloud/agent/manager/AgentManagerImpl.java b/server/src/com/cloud/agent/manager/AgentManagerImpl.java index 0554fbfb85c..81f38687f69 100755 --- a/server/src/com/cloud/agent/manager/AgentManagerImpl.java +++ b/server/src/com/cloud/agent/manager/AgentManagerImpl.java @@ -274,7 +274,7 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, Manager { _pingInterval = NumbersUtil.parseInt(value, 60); value = configs.get("wait"); - _wait = NumbersUtil.parseInt(value, 1800) * 1000; + _wait = NumbersUtil.parseInt(value, 1800); value = configs.get("alert.wait"); _alertWait = NumbersUtil.parseInt(value, 1800); @@ -797,10 +797,10 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, Manager { } @Override - public Answer send(Long hostId, Command cmd, int timeout) throws AgentUnavailableException, OperationTimedoutException { + public Answer send(Long hostId, Command cmd) throws AgentUnavailableException, OperationTimedoutException { Commands cmds = new Commands(OnError.Stop); cmds.addCommand(cmd); - send(hostId, cmds, timeout); + send(hostId, cmds, cmd.getWait()); Answer[] answers = cmds.getAnswers(); if (answers != null && !(answers[0] instanceof UnsupportedAnswer)) { return answers[0]; @@ -856,7 +856,7 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, Manager { s_logger.debug("checking if agent (" + hostId + ") is alive"); } - Answer answer = easySend(hostId, new CheckHealthCommand(), 50 * 1000); + Answer answer = easySend(hostId, new CheckHealthCommand()); if (answer != null && answer.getResult()) { Status status = Status.Up; if (s_logger.isDebugEnabled()) { @@ -1467,11 +1467,6 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, Manager { @Override public Answer easySend(final Long hostId, final Command cmd) { - return easySend(hostId, cmd, _wait); - } - - @Override - public Answer easySend(final Long hostId, final Command cmd, int timeout) { try { Host h = _hostDao.findById(hostId); if (h == null || h.getRemoved() != null) { @@ -1482,7 +1477,7 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, Manager { if (!status.equals(Status.Up) && !status.equals(Status.Connecting)) { return null; } - final Answer answer = send(hostId, cmd, timeout); + final Answer answer = send(hostId, cmd); if (answer == null) { s_logger.warn("send returns null answer"); return null; @@ -1506,14 +1501,18 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, Manager { } } - @Override - public Answer send(final Long hostId, final Command cmd) throws AgentUnavailableException, OperationTimedoutException { - return send(hostId, cmd, _wait); - } - @Override public Answer[] send(final Long hostId, Commands cmds) throws AgentUnavailableException, OperationTimedoutException { - return send(hostId, cmds, _wait); + int wait = 0; + for( Command cmd : cmds ) { + if ( cmd.getWait() > wait ) { + wait = cmd.getWait(); + } + } + if ( wait == 0 ) { + wait = _wait; + } + return send(hostId, cmds, wait); } @Override diff --git a/server/src/com/cloud/agent/manager/SynchronousListener.java b/server/src/com/cloud/agent/manager/SynchronousListener.java index de501be5c22..5834bb2d8c4 100755 --- a/server/src/com/cloud/agent/manager/SynchronousListener.java +++ b/server/src/com/cloud/agent/manager/SynchronousListener.java @@ -97,7 +97,7 @@ public class SynchronousListener implements Listener { return waitFor(-1); } - public synchronized Answer[] waitFor(int ms) throws InterruptedException { + public synchronized Answer[] waitFor(int s) throws InterruptedException { if (_disconnected) { return null; } @@ -108,9 +108,10 @@ public class SynchronousListener implements Listener { Profiler profiler = new Profiler(); profiler.start(); - if (ms <= 0) { + if (s <= 0) { wait(); } else { + int ms = s * 1000; wait(ms); } profiler.stop(); diff --git a/server/src/com/cloud/configuration/Config.java b/server/src/com/cloud/configuration/Config.java index 28db5c03eb8..b84e3fb468c 100755 --- a/server/src/com/cloud/configuration/Config.java +++ b/server/src/com/cloud/configuration/Config.java @@ -33,6 +33,7 @@ import com.cloud.storage.StorageManager; import com.cloud.storage.allocator.StoragePoolAllocator; import com.cloud.storage.secondary.SecondaryStorageVmManager; import com.cloud.storage.snapshot.SnapshotManager; +import com.cloud.template.TemplateManager; import com.cloud.vm.UserVmManager; public enum Config { @@ -56,7 +57,13 @@ public enum Config { TotalRetries("Storage", AgentManager.class, Integer.class, "total.retries", "4", "The number of times each command sent to a host should be retried in case of failure.", null), StoragePoolMaxWaitSeconds("Storage", ManagementServer.class, Integer.class, "storage.pool.max.waitseconds", "3600", "Timeout (in seconds) to synchronize storage pool operations.", null), StorageTemplateCleanupEnabled("Storage", ManagementServer.class, Boolean.class, "storage.template.cleanup.enabled", "true", "Enable/disable template cleanup activity, only take effect when overall storage cleanup is enabled", null), - + PrimaryStorageDownloadWait("Storage", TemplateManager.class, Integer.class, "primary.storage.download.wait", "10800", "In second, timeout for download template to primary storage", null), + CreateVolumeFromSnapshotWait("Storage", StorageManager.class, Integer.class, "create.volume.from.snapshot.wait", "10800", "In second, timeout for create template from snapshot", null), + CopyVolumeWait("Storage", StorageManager.class, Integer.class, "copy.volume.wait", "10800", "In second, timeout for copy volume command", null), + CreatePrivateTemplateFromVolumeWait("Storage", UserVmManager.class, Integer.class, "create.private.template.from.volume.wait", "10800", "In second, timeout for CreatePrivateTemplateFromVolumeCommand", null), + CreatePrivateTemplateFromSnapshotWait("Storage", UserVmManager.class, Integer.class, "create.private.template.from.snapshot.wait", "10800", "In second, timeout for CreatePrivateTemplateFromSnapshotCommand", null), + BackupSnapshotWait("Storage", StorageManager.class, Integer.class, "backup.snapshot.wait", "10800", "In second, timeout for BackupSnapshotCommand", null), + // Network NetworkLBHaproxyStatsVisbility("Network", ManagementServer.class, String.class, "network.loadbalancer.haproxy.stats.visibility", "global", "Load Balancer(haproxy) stats visibilty, it can take the following four parameters : global,guest-network,link-local,disabled", null), NetworkLBHaproxyStatsUri("Network", ManagementServer.class, String.class, "network.loadbalancer.haproxy.stats.uri","/admin?stats","Load Balancer(haproxy) uri.",null), @@ -153,7 +160,6 @@ public enum Config { Wait("Advanced", AgentManager.class, Integer.class, "wait", "1800", "Time in seconds to wait for control commands to return", null), XapiWait("Advanced", AgentManager.class, Integer.class, "xapiwait", "600", "Time (in seconds) to wait for XAPI to return", null), MigrateWait("Advanced", AgentManager.class, Integer.class, "migratewait", "3600", "Time (in seconds) to wait for VM migrate finish", null), - CmdsWait("Advanced", AgentManager.class, Integer.class, "cmd.wait", "7200", "Time (in seconds) to wait for some heavy time-consuming commands", null), Workers("Advanced", AgentManager.class, Integer.class, "workers", "5", "Number of worker threads.", null), MountParent("Advanced", ManagementServer.class, String.class, "mount.parent", "/var/lib/cloud/mnt", "The mount point on the Management Server for Secondary Storage.", null), // UpgradeURL("Advanced", ManagementServer.class, String.class, "upgrade.url", "http://example.com:8080/client/agent/update.zip", "The upgrade URL is the URL of the management server that agents will connect to in order to automatically upgrade.", null), diff --git a/server/src/com/cloud/ha/AbstractInvestigatorImpl.java b/server/src/com/cloud/ha/AbstractInvestigatorImpl.java index dbafb8f1f22..238063bc406 100644 --- a/server/src/com/cloud/ha/AbstractInvestigatorImpl.java +++ b/server/src/com/cloud/ha/AbstractInvestigatorImpl.java @@ -79,7 +79,7 @@ public abstract class AbstractInvestigatorImpl implements Investigator { protected Status testIpAddress(Long hostId, String testHostIp) { try { - Answer pingTestAnswer = _agentMgr.send(hostId, new PingTestCommand(testHostIp), 30 * 1000); + Answer pingTestAnswer = _agentMgr.send(hostId, new PingTestCommand(testHostIp)); if(pingTestAnswer == null) { if (s_logger.isDebugEnabled()) { s_logger.debug("host (" + testHostIp + ") returns null answer"); diff --git a/server/src/com/cloud/ha/CheckOnAgentInvestigator.java b/server/src/com/cloud/ha/CheckOnAgentInvestigator.java index 16c70425eb8..11c8e0fb513 100644 --- a/server/src/com/cloud/ha/CheckOnAgentInvestigator.java +++ b/server/src/com/cloud/ha/CheckOnAgentInvestigator.java @@ -51,7 +51,7 @@ public class CheckOnAgentInvestigator extends AdapterBase implements Investigato public Boolean isVmAlive(VMInstanceVO vm, HostVO host) { CheckVirtualMachineCommand cmd = new CheckVirtualMachineCommand(vm.getInstanceName()); try { - CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer)_agentMgr.send(vm.getHostId(), cmd, 10 * 1000); + CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer)_agentMgr.send(vm.getHostId(), cmd); if (!answer.getResult()) { s_logger.debug("Unable to get vm state on " + vm.toString()); return null; diff --git a/server/src/com/cloud/ha/UserVmDomRInvestigator.java b/server/src/com/cloud/ha/UserVmDomRInvestigator.java index 24a7f0f8cf7..31944fc5537 100644 --- a/server/src/com/cloud/ha/UserVmDomRInvestigator.java +++ b/server/src/com/cloud/ha/UserVmDomRInvestigator.java @@ -183,21 +183,16 @@ public class UserVmDomRInvestigator extends AbstractInvestigatorImpl { } for (Long hostId : otherHosts) { try { - Answer pingTestAnswer = _agentMgr.send(hostId, new PingTestCommand(routerPrivateIp, privateIp), 30 * 1000); + Answer pingTestAnswer = _agentMgr.easySend(hostId, new PingTestCommand(routerPrivateIp, privateIp)); if (pingTestAnswer.getResult()) { if (s_logger.isDebugEnabled()) { s_logger.debug("user vm " + vm.getHostName() + " has been successfully pinged, returning that it is alive"); } return Boolean.TRUE; } - } catch (AgentUnavailableException e) { + } catch (Exception e) { if (s_logger.isDebugEnabled()) { - s_logger.debug("Couldn't reach " + e.getResourceId()); - } - continue; - } catch (OperationTimedoutException e) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Operation timed out: " + e.getMessage()); + s_logger.debug("Couldn't reach due to" + e.toString()); } continue; } diff --git a/server/src/com/cloud/ha/XenServerInvestigator.java b/server/src/com/cloud/ha/XenServerInvestigator.java index bb03cbad7fa..57d70e1e06a 100644 --- a/server/src/com/cloud/ha/XenServerInvestigator.java +++ b/server/src/com/cloud/ha/XenServerInvestigator.java @@ -56,7 +56,7 @@ public class XenServerInvestigator extends AdapterBase implements Investigator { if (neighbor.getId() == agent.getId() || neighbor.getHypervisorType() != HypervisorType.XenServer) { continue; } - Answer answer = _agentMgr.easySend(neighbor.getId(), cmd, 50 * 1000); + Answer answer = _agentMgr.easySend(neighbor.getId(), cmd); if (answer != null && answer.getResult()) { CheckOnHostAnswer ans = (CheckOnHostAnswer)answer; if (!ans.isDetermined()) { diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index acc9219b322..561469ef596 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -4393,9 +4393,10 @@ public class ManagementServerImpl implements ManagementServer { _asyncMgr.updateAsyncJobAttachment(job.getId(), Upload.Type.VOLUME.toString(), volumeId); _asyncMgr.updateAsyncJobStatus(job.getId(), AsyncJobResult.STATUS_IN_PROGRESS, resultObj); } - + String value = _configs.get(Config.CopyVolumeWait.toString()); + int copyvolumewait = NumbersUtil.parseInt(value, Integer.parseInt(Config.CopyVolumeWait.getDefaultValue())); // Copy the volume from the source storage pool to secondary storage - CopyVolumeCommand cvCmd = new CopyVolumeCommand(volume.getId(), volume.getPath(), srcPool, secondaryStorageURL, true); + CopyVolumeCommand cvCmd = new CopyVolumeCommand(volume.getId(), volume.getPath(), srcPool, secondaryStorageURL, true, copyvolumewait); CopyVolumeAnswer cvAnswer = null; try { cvAnswer = (CopyVolumeAnswer) _storageMgr.sendToPool(srcPool, cvCmd); diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index 65bc04d1c2f..bf0341100b0 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -299,6 +299,8 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag boolean _storageCleanupEnabled; boolean _templateCleanupEnabled = true; int _storageCleanupInterval; + private int _createVolumeFromSnapshotWait; + private int _copyvolumewait; int _storagePoolAcquisitionWaitSeconds = 1800; // 30 minutes protected int _retry = 2; protected int _pingInterval = 60; // seconds @@ -307,7 +309,6 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag private long _maxVolumeSizeInGb; private long _serverId; - private int _snapshotTimeout; public boolean share(VMInstanceVO vm, List vols, HostVO host, boolean cancelPreviousShare) throws StorageUnavailableException { @@ -634,26 +635,29 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag if( snapshot.getSwiftName() != null ) { _snapshotMgr.downloadSnapshotsFromSwift(snapshot); } - CreateVolumeFromSnapshotCommand createVolumeFromSnapshotCommand = new CreateVolumeFromSnapshotCommand(primaryStoragePoolNameLabel, secondaryStoragePoolUrl, dcId, accountId, volumeId, - backedUpSnapshotUuid, snapshot.getName()); - String basicErrMsg = "Failed to create volume from " + snapshot.getName(); + CreateVolumeFromSnapshotCommand createVolumeFromSnapshotCommand = new CreateVolumeFromSnapshotCommand(primaryStoragePoolNameLabel, secondaryStoragePoolUrl, dcId, accountId, volumeId, + backedUpSnapshotUuid, snapshot.getName(), _createVolumeFromSnapshotWait); + CreateVolumeFromSnapshotAnswer answer; if (!_snapshotDao.lockInLockTable(snapshotId.toString(), 10)) { throw new CloudRuntimeException("failed to create volume from " + snapshotId + " due to this snapshot is being used, try it later "); } + String basicErrMsg = "Failed to create volume from " + snapshot.getName() + " on pool " + pool; try { answer = (CreateVolumeFromSnapshotAnswer) sendToPool(pool, createVolumeFromSnapshotCommand); if (answer != null && answer.getResult()) { vdiUUID = answer.getVdi(); } else { - s_logger.error(basicErrMsg + " due to " + answer.getDetails()); + s_logger.error(basicErrMsg + " due to " + ((answer == null)?"null":answer.getDetails())); + throw new CloudRuntimeException(basicErrMsg); } } catch (StorageUnavailableException e) { s_logger.error(basicErrMsg); } finally { _snapshotDao.unlockFromLockTable(snapshotId.toString()); } + return new Pair(vdiUUID, basicErrMsg); } @@ -800,11 +804,10 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag if (overProvisioningFactorStr != null) { _overProvisioningFactor = Float.parseFloat(overProvisioningFactorStr); } - + _retry = NumbersUtil.parseInt(configs.get(Config.StartRetry.key()), 10); _pingInterval = NumbersUtil.parseInt(configs.get("ping.interval"), 60); _hostRetry = NumbersUtil.parseInt(configs.get("host.retry"), 2); - _snapshotTimeout = NumbersUtil.parseInt(Config.CmdsWait.key(), 2 * 60 * 60 * 1000); _storagePoolAcquisitionWaitSeconds = NumbersUtil.parseInt(configs.get("pool.acquisition.wait.seconds"), 1800); s_logger.info("pool.acquisition.wait.seconds is configured as " + _storagePoolAcquisitionWaitSeconds + " seconds"); @@ -813,7 +816,13 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag String storageCleanupEnabled = configs.get("storage.cleanup.enabled"); _storageCleanupEnabled = (storageCleanupEnabled == null) ? true : Boolean.parseBoolean(storageCleanupEnabled); - String value = configDao.getValue(Config.StorageTemplateCleanupEnabled.key()); + String value = configDao.getValue(Config.CreateVolumeFromSnapshotWait.toString()); + _createVolumeFromSnapshotWait = NumbersUtil.parseInt(value, Integer.parseInt(Config.CreateVolumeFromSnapshotWait.getDefaultValue())); + + value = configDao.getValue(Config.CopyVolumeWait.toString()); + _copyvolumewait = NumbersUtil.parseInt(value, Integer.parseInt(Config.CopyVolumeWait.getDefaultValue())); + + value = configDao.getValue(Config.StorageTemplateCleanupEnabled.key()); _templateCleanupEnabled = (value == null ? true : Boolean.parseBoolean(value)); String time = configs.get("storage.cleanup.interval"); @@ -1533,7 +1542,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag StoragePoolVO srcPool = _storagePoolDao.findById(volume.getPoolId()); // Copy the volume from the source storage pool to secondary storage - CopyVolumeCommand cvCmd = new CopyVolumeCommand(volume.getId(), volume.getPath(), srcPool, secondaryStorageURL, true); + CopyVolumeCommand cvCmd = new CopyVolumeCommand(volume.getId(), volume.getPath(), srcPool, secondaryStorageURL, true, _copyvolumewait); CopyVolumeAnswer cvAnswer; try { cvAnswer = (CopyVolumeAnswer) sendToPool(srcPool, cvCmd); @@ -1549,7 +1558,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag // Copy the volume from secondary storage to the destination storage // pool - cvCmd = new CopyVolumeCommand(volume.getId(), secondaryStorageVolumePath, destPool, secondaryStorageURL, false); + cvCmd = new CopyVolumeCommand(volume.getId(), secondaryStorageVolumePath, destPool, secondaryStorageURL, false, _copyvolumewait); try { cvAnswer = (CopyVolumeAnswer) sendToPool(destPool, cvCmd); } catch (StorageUnavailableException e1) { @@ -1874,6 +1883,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag + storagePool.getDataCenterId() + ", HostOrPoolId - " + storagePool.getId() + ", PodId " + storagePool.getPodId()); } + @Override public Pair sendToPool(StoragePool pool, long[] hostIdsToTryFirst, List hostIdsToAvoid, Commands cmds) throws StorageUnavailableException { SearchCriteria sc = UpHostsInPoolSearch.create(); @@ -1903,11 +1913,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag for (Command cmd : cmdArray) { long targetHostId = _hvGuruMgr.getGuruProcessedCommandTargetHost(hostId, cmd); - if (cmd instanceof BackupSnapshotCommand) { - answers.add(_agentMgr.send(targetHostId, cmd, _snapshotTimeout)); - } else { - answers.add(_agentMgr.send(targetHostId, cmd)); - } + answers.add(_agentMgr.send(targetHostId, cmd)); } return new Pair(hostId, answers.toArray(new Answer[answers.size()])); } catch (AgentUnavailableException e) { diff --git a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java index e662b447c20..0a40ebf9565 100755 --- a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java +++ b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java @@ -46,6 +46,7 @@ import com.cloud.api.commands.ListRecurringSnapshotScheduleCmd; import com.cloud.api.commands.ListSnapshotPoliciesCmd; import com.cloud.api.commands.ListSnapshotsCmd; import com.cloud.async.AsyncJobManager; +import com.cloud.configuration.Config; import com.cloud.configuration.ResourceCount.ResourceType; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.ClusterVO; @@ -167,6 +168,7 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma private int _totalRetries; private int _pauseInterval; private int _deltaSnapshotMax; + private int _backupsnapshotwait; protected SearchBuilder PolicySnapshotSearch; protected SearchBuilder PoliciesForSnapSearch; @@ -561,7 +563,7 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma String vmName = _storageMgr.getVmNameOnVolume(volume); StoragePoolVO srcPool = _storagePoolDao.findById(volume.getPoolId()); BackupSnapshotCommand backupSnapshotCommand = new BackupSnapshotCommand(primaryStoragePoolNameLabel, secondaryStoragePoolUrl, dcId, accountId, volumeId, snapshot.getId(), volume.getPath(), srcPool, snapshotUuid, - snapshot.getName(), prevSnapshotUuid, prevBackupUuid, isVolumeInactive, vmName); + snapshot.getName(), prevSnapshotUuid, prevBackupUuid, isVolumeInactive, vmName, _backupsnapshotwait); if ( swift != null ) { backupSnapshotCommand.setSwift(toSwiftTO(swift)); @@ -1293,6 +1295,9 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma if (configDao == null) { throw new ConfigurationException("Unable to get the configuration dao."); } + + String value = configDao.getValue(Config.BackupSnapshotWait.toString()); + _backupsnapshotwait = NumbersUtil.parseInt(value, Integer.parseInt(Config.BackupSnapshotWait.getDefaultValue())); Type.HOURLY.setMax(NumbersUtil.parseInt(configDao.getValue("snapshot.max.hourly"), HOURLYMAX)); Type.DAILY.setMax(NumbersUtil.parseInt(configDao.getValue("snapshot.max.daily"), DAILYMAX)); diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java index ba171657b07..2ee263b7840 100755 --- a/server/src/com/cloud/template/TemplateManagerImpl.java +++ b/server/src/com/cloud/template/TemplateManagerImpl.java @@ -161,10 +161,10 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe @Inject StorageManager _storageMgr; @Inject AsyncJobManager _asyncMgr; @Inject UserVmManager _vmMgr; - @Inject ConfigurationDao _configDao; @Inject UsageEventDao _usageEventDao; @Inject HypervisorGuruManager _hvGuruMgr; - @Inject AccountService _accountService; + @Inject AccountService _accountService; + int _primaryStorageDownloadWait; protected SearchBuilder HostTemplateStatesSearch; int _storagePoolMaxWaitSeconds = 3600; @@ -451,7 +451,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe } String url = origUrl + "/" + templateHostRef.getInstallPath(); PrimaryStorageDownloadCommand dcmd = new PrimaryStorageDownloadCommand(template.getUniqueName(), url, template.getFormat(), - template.getAccountId(), pool.getId(), pool.getUuid()); + template.getAccountId(), pool.getId(), pool.getUuid(), _primaryStorageDownloadWait); HostVO secondaryStorageHost = _hostDao.findById(templateHostRef.getHostId()); assert(secondaryStorageHost != null); dcmd.setSecondaryStorageUrl(secondaryStorageHost.getStorageUrl()); @@ -466,7 +466,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe // set 120 min timeout for this command PrimaryStorageDownloadAnswer answer = (PrimaryStorageDownloadAnswer)_agentMgr.easySend( - _hvGuruMgr.getGuruProcessedCommandTargetHost(vo.getHostId(), dcmd), dcmd, 120*60*1000); + _hvGuruMgr.getGuruProcessedCommandTargetHost(vo.getHostId(), dcmd), dcmd); if (answer != null && answer.getResult() ) { templateStoragePoolRef.setDownloadPercent(100); templateStoragePoolRef.setDownloadState(Status.DOWNLOADED); @@ -733,7 +733,10 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe final Map configs = configDao.getConfiguration("AgentManager", params); _routerTemplateId = NumbersUtil.parseInt(configs.get("router.template.id"), 1); - + + String value = configDao.getValue(Config.PrimaryStorageDownloadWait.toString()); + _primaryStorageDownloadWait = NumbersUtil.parseInt(value, Integer.parseInt(Config.PrimaryStorageDownloadWait.getDefaultValue())); + HostTemplateStatesSearch = _tmpltHostDao.createSearchBuilder(); HostTemplateStatesSearch.and("id", HostTemplateStatesSearch.entity().getTemplateId(), SearchCriteria.Op.EQ); HostTemplateStatesSearch.and("state", HostTemplateStatesSearch.entity().getDownloadState(), SearchCriteria.Op.EQ); diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index f1dfcd46da7..12af7d4a275 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -75,6 +75,7 @@ import com.cloud.async.AsyncJobManager; import com.cloud.async.AsyncJobVO; import com.cloud.async.BaseAsyncJobExecutor; import com.cloud.capacity.dao.CapacityDao; +import com.cloud.configuration.Config; import com.cloud.configuration.ConfigurationManager; import com.cloud.configuration.ResourceCount.ResourceType; import com.cloud.configuration.dao.ConfigurationDao; @@ -340,7 +341,8 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager protected String _zone; private ConfigurationDao _configDao; - + private int _createprivatetemplatefromvolumewait; + private int _createprivatetemplatefromsnapshotwait; @Override public UserVmVO getVirtualMachine(long vmId) { return _vmDao.findById(vmId); @@ -1131,6 +1133,12 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager if (_instance == null) { _instance = "DEFAULT"; } + + String value = _configDao.getValue(Config.CreatePrivateTemplateFromVolumeWait.toString()); + _createprivatetemplatefromvolumewait = NumbersUtil.parseInt(value, Integer.parseInt(Config.CreatePrivateTemplateFromVolumeWait.getDefaultValue())); + + value = _configDao.getValue(Config.CreatePrivateTemplateFromSnapshotWait.toString()); + _createprivatetemplatefromsnapshotwait = NumbersUtil.parseInt(value, Integer.parseInt(Config.CreatePrivateTemplateFromSnapshotWait.getDefaultValue())); String workers = configs.get("expunge.workers"); int wrks = NumbersUtil.parseInt(workers, 10); @@ -1525,7 +1533,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager _snapshotMgr.downloadSnapshotsFromSwift(snapshot); } cmd = new CreatePrivateTemplateFromSnapshotCommand(pool.getUuid(), secondaryStorageURL, dcId, accountId, snapshot.getVolumeId(), backupSnapshotUUID, snapshot.getName(), - origTemplateInstallPath, templateId, name); + origTemplateInstallPath, templateId, name, _createprivatetemplatefromsnapshotwait); } else if (volumeId != null) { VolumeVO volume = _volsDao.findById(volumeId); if (volume == null) { @@ -1546,7 +1554,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager String secondaryStorageURL = secondaryStorageHost.getStorageUrl(); pool = _storagePoolDao.findById(volume.getPoolId()); - cmd = new CreatePrivateTemplateFromVolumeCommand(secondaryStorageURL, templateId, accountId, command.getTemplateName(), uniqueName, volume.getPath(), vmName); + cmd = new CreatePrivateTemplateFromVolumeCommand(secondaryStorageURL, templateId, accountId, command.getTemplateName(), uniqueName, volume.getPath(), vmName, _createprivatetemplatefromvolumewait); } else { throw new CloudRuntimeException("Creating private Template need to specify snapshotId or volumeId");