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

Reply via email to