Greg Padgett has uploaded a new change for review. Change subject: [WIP] vdsbroker: update vmJobs when updating vm statistics ......................................................................
[WIP] vdsbroker: update vmJobs when updating vm statistics Change-Id: If1a300d440a0a93381afe047eb294106a38088ec Bug-Url: https://bugzilla.redhat.com/?????? Signed-off-by: Greg Padgett <gpadg...@redhat.com> --- M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsUpdateRunTimeInfo.java 1 file changed, 90 insertions(+), 1 deletion(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/06/26906/1 diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsUpdateRunTimeInfo.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsUpdateRunTimeInfo.java index 1760fc1..b42a8eb 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsUpdateRunTimeInfo.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsUpdateRunTimeInfo.java @@ -45,6 +45,7 @@ import org.ovirt.engine.core.common.businessentities.VmExitReason; import org.ovirt.engine.core.common.businessentities.VmExitStatus; import org.ovirt.engine.core.common.businessentities.VmGuestAgentInterface; +import org.ovirt.engine.core.common.businessentities.VmJob; import org.ovirt.engine.core.common.businessentities.VmPauseStatus; import org.ovirt.engine.core.common.businessentities.VmStatic; import org.ovirt.engine.core.common.businessentities.VmStatistics; @@ -100,6 +101,9 @@ private final Map<VmDeviceId, VmDevice> vmDeviceToSave = new HashMap<>(); private final List<VmDevice> newVmDevices = new ArrayList<>(); private final List<VmDeviceId> removedDeviceIds = new ArrayList<>(); + private final Map<Guid, VmJob> vmJobsToSave = new HashMap<>(); + private final List<VmJob> newVmJobs = new ArrayList<>(); + private final List<Guid> removedVmJobIds = new ArrayList<>(); private final Map<VM, VmDynamic> _vmsClientIpChanged = new HashMap<>(); private final Map<Guid, List<VmGuestAgentInterface>> vmGuestAgentNics = new HashMap<>(); private final List<VmDynamic> _poweringUpVms = new ArrayList<>(); @@ -186,8 +190,11 @@ getDbFacade().getDiskImageDynamicDao().updateAllInBatch(_vmDiskImageDynamicToSave.values()); getDbFacade().getLunDao().updateAllInBatch(vmLunDisksToSave); saveVmDevicesToDb(); + saveVmJobsToDb(); saveVmGuestAgentNetworkDevices(); getVdsEventListener().addExternallyManagedVms(_externalVmsToAdd); + // TODO GP is VmGenerationId updated? + // TODO GP are stats cleared when vm goes down? need to clear vmJobs too } private void saveVmGuestAgentNetworkDevices() { @@ -234,6 +241,26 @@ @Override public Void runInTransaction() { getDbFacade().getVmDeviceDao().saveAll(newVmDevices); + return null; + } + }); + } + } + + private void saveVmJobsToDb() { + getDbFacade().getVmJobDao().updateAllInBatch(vmJobsToSave.values()); + + if (!removedVmJobIds.isEmpty() || !newVmJobs.isEmpty()) { + TransactionSupport.executeInScope(TransactionScopeOption.Required, + new TransactionMethod<Void>() { + @Override + public Void runInTransaction() { + if (!removedVmJobIds.isEmpty()) { + getDbFacade().getVmJobDao().removeAll(removedVmJobIds); + } + if (!newVmJobs.isEmpty()) { + getDbFacade().getVmJobDao().saveAll(newVmJobs); + } return null; } }); @@ -827,6 +854,8 @@ prepareGuestAgentNetworkDevicesForUpdate(); updateLunDisks(); + + updateVmJobs(); } } @@ -926,6 +955,66 @@ lunFromDB.setDeviceSize(lunFromMap.getDeviceSize()); vmLunDisksToSave.add(lunFromDB); } + } + } + } + } + + protected void updateVmJobs() { + /* + TODO GP just for reference, remove when done working on method + private final Map<Guid, VmJob> vmJobsToSave = new HashMap<>(); + private final List<VmJob> newVmJobs = new ArrayList<>(); + private final List<Guid> removedVmJobIds = new ArrayList<>(); + */ + // The database vmJob records are synced with the vmJobs returned from each VM. + removedVmJobIds.clear(); + vmJobsToSave.clear(); + newVmJobs.clear(); + Set<Guid> vmJobIdsToIgnore = new HashSet<>(); + + for (Entry<Guid, VmInternalData> vmInternalData : _runningVms.entrySet()) { + Map<Guid, VmJob> jobsFromDb = new HashMap<>(); + for (VmJob job : getDbFacade().getVmJobDao().getAllForVm(vmInternalData.getKey())) { + jobsFromDb.put(job.getId(), job); + } + + if (vmInternalData.getValue().getVmStatistics().getVmJobs() == null) { + // If no vmJobs key was returned, we can't presume anything about the jobs; save them all + vmJobIdsToIgnore.addAll(jobsFromDb.keySet()); + for (Guid id : vmJobIdsToIgnore) { + // TODO GP remove/change log + log.errorFormat("VM job {0}: Preserving (no vmJob data)", id); + } + continue; + } + + for (VmJob jobFromVds : vmInternalData.getValue().getVmStatistics().getVmJobs()) { + if (jobsFromDb.containsKey(jobFromVds.getId())) { + if (jobsFromDb.get(jobFromVds.getId()).equals(jobFromVds)) { + // Same data, no update needed. It would be nice if a caching + // layer would take care of this for us. + vmJobIdsToIgnore.add(jobFromVds.getId()); + // TODO GP remove/change log + log.errorFormat("VM job {0}: Ignoring (no change)", jobFromVds.getId()); + } else { + vmJobsToSave.put(jobFromVds.getId(), jobFromVds); + // TODO GP remove/change log + log.errorFormat("VM job {0}: Updating", jobFromVds.getId()); + } + } else { + newVmJobs.add(jobFromVds); + // TODO GP remove/change log + log.errorFormat("VM job {0}: Inserting", jobFromVds.getId()); + } + } + + // Any existing jobs not saved need to be removed + for (Guid id : jobsFromDb.keySet()) { + if (!vmJobsToSave.containsKey(id) && !vmJobIdsToIgnore.contains(id)) { + removedVmJobIds.add(id); + // TODO GP remove/change log + log.errorFormat("VM job {0}: Deleting", id); } } } @@ -2017,7 +2106,7 @@ protected List<VmDeviceId> getRemovedVmDevices() { return Collections.unmodifiableList(removedDeviceIds); } - +// TODO GP tests /** * An access method for test usages * -- To view, visit http://gerrit.ovirt.org/26906 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: If1a300d440a0a93381afe047eb294106a38088ec Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Greg Padgett <gpadg...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches