1. added timeout in Command Class, then each command can configure itself timeout, if timeout is not configed, use the default timeout , which is 30 minute

2. added following configurable timeout
       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),
This commit is contained in:
anthony 2011-09-07 19:15:46 -07:00
parent 3f40fdd6e1
commit 4423da06a2
25 changed files with 155 additions and 101 deletions

View File

@ -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() {

View File

@ -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;

View File

@ -29,6 +29,7 @@ public class CheckOnHostCommand extends Command {
public CheckOnHostCommand(Host host) {
this.host = new HostTO(host);
setWait(20);
}
public HostTO getHost() {

View File

@ -27,6 +27,7 @@ public class CheckVirtualMachineCommand extends Command {
public CheckVirtualMachineCommand(String vmName) {
this.vmName = vmName;
setWait(20);
}
public String getVmName() {

View File

@ -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<String, String> contextMap = new HashMap<String, String>();
private int wait; //in second
protected Command() {
this.wait = 0;
}
public int getWait() {
return wait;
}
public void setWait(int wait) {
this.wait = wait;
}
@Override

View File

@ -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);
}
/**

View File

@ -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

View File

@ -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);
}
}

View File

@ -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() {

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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, String>());
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<String, String> args = new HashMap<String, String>();
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();

View File

@ -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);

View File

@ -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

View File

@ -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();

View File

@ -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),

View File

@ -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");

View File

@ -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;

View File

@ -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;
}

View File

@ -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()) {

View File

@ -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);

View File

@ -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<VolumeVO> 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<String, String>(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<Long, Answer[]> sendToPool(StoragePool pool, long[] hostIdsToTryFirst, List<Long> hostIdsToAvoid, Commands cmds) throws StorageUnavailableException {
SearchCriteria<Long> 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<Long, Answer[]>(hostId, answers.toArray(new Answer[answers.size()]));
} catch (AgentUnavailableException e) {

View File

@ -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<SnapshotVO> PolicySnapshotSearch;
protected SearchBuilder<SnapshotPolicyVO> 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));

View File

@ -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<VMTemplateHostVO> 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<String, String> 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);

View File

@ -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");