package org.ovirt.engine.core.vdsbroker;
import java.util.concurrent.TimeUnit;
import org.ovirt.engine.core.compat.*;
import org.ovirt.engine.core.common.vdscommands.*;
import org.ovirt.engine.core.utils.timer.OnTimerMethodAnnotation;
import org.ovirt.engine.core.utils.timer.SchedulerUtilQuartzImpl;
import org.ovirt.engine.core.dal.dbbroker.*;
import org.ovirt.engine.core.common.businessentities.*;
public abstract class VdsIdVDSCommandBase<P extends VdsIdVDSCommandParametersBase> extends VDSCommandBase<P> {
protected VdsManager _vdsManager;
public VdsIdVDSCommandBase(P parameters) {
super(parameters);
_vdsManager = ResourceManager.getInstance().GetVdsManager(parameters.getVdsId());
}
protected Guid getVdsId() {
return getParameters().getVdsId();
}
private VDS _vds;
protected VDS getVds() {
if (_vds == null) {
_vds = DbFacade.getInstance().getVdsDAO().get(getVdsId());
}
return _vds;
}
@Override
protected void ExecuteVDSCommand() {
if (_vdsManager != null) {
synchronized (_vdsManager.getLockObj()) {
ExecuteVdsIdCommand();
}
} else {
ExecuteVdsIdCommand();
}
}
protected abstract void ExecuteVdsIdCommand();
// protected void SaveVmDynamicToDBThreaded(VM vm)
// {
// ThreadPoolCompat.QueueUserWorkItem(delegate
// {
// for (int i = 1; i < 6; i++)
// {
// try
// {
// DbFacade.Instance.SaveVmDynamic(vm.DynamicData);
// return;
// }
// catch (Exception ex)
// {
// log.infoFormat("ResourceManager::Failed save vm dynamic to DB, try number {4}. vm: {0} in vds = {1} : {2} error = {3}",
// vm.vm_name, _vdsManager.Vds.vds_id, _vdsManager.Vds.vds_name, ex.Message,
// i);
// ThreadCompat.Sleep(1000);
// }
// }
// log.errorFormat("ResourceManager::Failed save vm dynamic to DB. vm: {0} in vds = {1} : {2}. command name: {3}.",
// vm.vm_name, _vdsManager.Vds.vds_id, _vdsManager.Vds.vds_name,
// CommandName);
// });
// }
protected void SaveVdsDynamicToDBThreaded(VDS vds, VM vm) {
// TODO should use thread poo and not timer
Class<?>[] inputTypes = new Class[] { VDS.class, VM.class };
Object[] inputParams = new Object[] { vds, vm };
SchedulerUtilQuartzImpl.getInstance().scheduleAOneTimeJob(this, "saveVdsDynamicToDBOnTimer", inputTypes,
inputParams, 0, TimeUnit.MILLISECONDS);
}
@OnTimerMethodAnnotation("saveVdsDynamicToDBOnTimer")
public void saveVdsDynamicToDBOnTimer(VDS vds, VM vm) {
try {
_vdsManager.UpdateDynamicData(vds.getDynamicData());
} catch (RuntimeException ex) {
log.errorFormat(
"ResourceManager::Failed save vds dynamic to DB. vm: {0} in vds = {1} : {2} error = {3}. command name: {3}.",
vm.getvm_name(),
vds.getvds_id(),
vds.getvds_name(),
ex.getMessage(),
getCommandName());
}
}
private static LogCompat log = LogFactoryCompat.getLog(VdsIdVDSCommandBase.class);
}