You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ra...@apache.org on 2015/03/23 06:50:16 UTC

git commit: updated refs/heads/volume-upload to c32a669

Repository: cloudstack
Updated Branches:
  refs/heads/volume-upload 48078289f -> c32a6695d


wrapped create template in db transaction

Template entry created in DB even though GetUpload* API fails with "No
ssvm present" error


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/c32a6695
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/c32a6695
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/c32a6695

Branch: refs/heads/volume-upload
Commit: c32a6695dc9fe0d6c1f06e0d6f670d4e8cea5ab4
Parents: 4807828
Author: Rajani Karuturi <ra...@gmail.com>
Authored: Mon Mar 23 11:15:02 2015 +0530
Committer: Rajani Karuturi <ra...@gmail.com>
Committed: Mon Mar 23 11:19:21 2015 +0530

----------------------------------------------------------------------
 .../template/HypervisorTemplateAdapter.java     | 120 ++++++++++---------
 1 file changed, 65 insertions(+), 55 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c32a6695/server/src/com/cloud/template/HypervisorTemplateAdapter.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/template/HypervisorTemplateAdapter.java b/server/src/com/cloud/template/HypervisorTemplateAdapter.java
index 1ad2135..265bc12 100755
--- a/server/src/com/cloud/template/HypervisorTemplateAdapter.java
+++ b/server/src/com/cloud/template/HypervisorTemplateAdapter.java
@@ -27,6 +27,9 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 
 import com.cloud.configuration.Config;
+import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionStatus;
 import org.apache.cloudstack.api.command.user.template.GetUploadParamsForTemplateCmd;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
 import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
@@ -201,74 +204,81 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase {
     }
 
     @Override
-    public List<TemplateOrVolumePostUploadCommand> createTemplateForPostUpload(TemplateProfile profile) {
+    public List<TemplateOrVolumePostUploadCommand> createTemplateForPostUpload(final TemplateProfile profile) {
         // persist entry in vm_template, vm_template_details and template_zone_ref tables, not that entry at template_store_ref is not created here, and created in createTemplateAsync.
-        VMTemplateVO template = persistTemplate(profile, State.NotUploaded);
+        return Transaction.execute(new TransactionCallback<List<TemplateOrVolumePostUploadCommand>>() {
 
-        if (template == null) {
-            throw new CloudRuntimeException("Unable to persist the template " + profile.getTemplate());
-        }
+            @Override
+            public List<TemplateOrVolumePostUploadCommand> doInTransaction(TransactionStatus status) {
 
-        // find all eligible image stores for this zone scope
-        List<DataStore> imageStores = storeMgr.getImageStoresByScope(new ZoneScope(profile.getZoneId()));
-        if (imageStores == null || imageStores.size() == 0) {
-            throw new CloudRuntimeException("Unable to find image store to download template " + profile.getTemplate());
-        }
+                VMTemplateVO template = persistTemplate(profile, State.NotUploaded);
 
-        List<TemplateOrVolumePostUploadCommand> payloads = new LinkedList<>();
-        Set<Long> zoneSet = new HashSet<Long>();
-        Collections.shuffle(imageStores); // For private templates choose a random store. TODO - Have a better algorithm based on size, no. of objects, load etc.
-        for (DataStore imageStore : imageStores) {
-            // skip data stores for a disabled zone
-            Long zoneId = imageStore.getScope().getScopeId();
-            if (zoneId != null) {
-                DataCenterVO zone = _dcDao.findById(zoneId);
-                if (zone == null) {
-                    s_logger.warn("Unable to find zone by id " + zoneId + ", so skip downloading template to its image store " + imageStore.getId());
-                    continue;
+                if (template == null) {
+                    throw new CloudRuntimeException("Unable to persist the template " + profile.getTemplate());
                 }
 
-                // Check if zone is disabled
-                if (Grouping.AllocationState.Disabled == zone.getAllocationState()) {
-                    s_logger.info("Zone " + zoneId + " is disabled, so skip downloading template to its image store " + imageStore.getId());
-                    continue;
+                // find all eligible image stores for this zone scope
+                List<DataStore> imageStores = storeMgr.getImageStoresByScope(new ZoneScope(profile.getZoneId()));
+                if (imageStores == null || imageStores.size() == 0) {
+                    throw new CloudRuntimeException("Unable to find image store to download template " + profile.getTemplate());
                 }
 
-                // We want to download private template to one of the image store in a zone
-                if (isPrivateTemplate(template) && zoneSet.contains(zoneId)) {
-                    continue;
-                } else {
-                    zoneSet.add(zoneId);
-                }
+                List<TemplateOrVolumePostUploadCommand> payloads = new LinkedList<>();
+                Set<Long> zoneSet = new HashSet<Long>();
+                Collections.shuffle(imageStores); // For private templates choose a random store. TODO - Have a better algorithm based on size, no. of objects, load etc.
+                for (DataStore imageStore : imageStores) {
+                    // skip data stores for a disabled zone
+                    Long zoneId = imageStore.getScope().getScopeId();
+                    if (zoneId != null) {
+                        DataCenterVO zone = _dcDao.findById(zoneId);
+                        if (zone == null) {
+                            s_logger.warn("Unable to find zone by id " + zoneId + ", so skip downloading template to its image store " + imageStore.getId());
+                            continue;
+                        }
 
-            }
+                        // Check if zone is disabled
+                        if (Grouping.AllocationState.Disabled == zone.getAllocationState()) {
+                            s_logger.info("Zone " + zoneId + " is disabled, so skip downloading template to its image store " + imageStore.getId());
+                            continue;
+                        }
 
-            TemplateInfo tmpl = imageFactory.getTemplate(template.getId(), imageStore);
-            //imageService.createTemplateAsync(tmpl, imageStore, caller);
+                        // We want to download private template to one of the image store in a zone
+                        if (isPrivateTemplate(template) && zoneSet.contains(zoneId)) {
+                            continue;
+                        } else {
+                            zoneSet.add(zoneId);
+                        }
 
-            // persist template_store_ref entry
-            DataObject templateOnStore = imageStore.create(tmpl);
-            // update template_store_ref and template state
+                    }
 
-            EndPoint ep = _epSelector.select(templateOnStore);
-            if (ep == null) {
-                String errMsg = "There is no secondary storage VM for downloading template to image store " + imageStore.getName();
-                s_logger.warn(errMsg);
-                throw new CloudRuntimeException(errMsg);
-            }
+                    TemplateInfo tmpl = imageFactory.getTemplate(template.getId(), imageStore);
+                    //imageService.createTemplateAsync(tmpl, imageStore, caller);
 
-            TemplateOrVolumePostUploadCommand payload = new TemplateOrVolumePostUploadCommand(template.getId(), template.getUuid(), tmpl.getInstallPath(), tmpl.getChecksum(), tmpl
-                    .getType().toString(), template.getUniqueName(), template.getFormat().toString(), templateOnStore.getDataStore().getUri(), templateOnStore.getDataStore().getRole()
-                    .toString());
-            //using the existing max template size configuration
-            payload.setMaxUploadSize(_configDao.getValue(Config.MaxTemplateAndIsoSize.key()));
-            payload.setRemoteEndPoint(ep.getPublicAddr());
-            payload.setRequiresHvm(template.requiresHvm());
-            payload.setDescription(template.getDisplayText());
-            payloads.add(payload);
-        }
-        _resourceLimitMgr.incrementResourceCount(profile.getAccountId(), ResourceType.template);
-        return payloads;
+                    // persist template_store_ref entry
+                    DataObject templateOnStore = imageStore.create(tmpl);
+                    // update template_store_ref and template state
+
+                    EndPoint ep = _epSelector.select(templateOnStore);
+                    if (ep == null) {
+                        String errMsg = "There is no secondary storage VM for downloading template to image store " + imageStore.getName();
+                        s_logger.warn(errMsg);
+                        throw new CloudRuntimeException(errMsg);
+                    }
+
+                    TemplateOrVolumePostUploadCommand payload = new TemplateOrVolumePostUploadCommand(template.getId(), template.getUuid(), tmpl.getInstallPath(), tmpl
+                            .getChecksum(), tmpl.getType().toString(), template.getUniqueName(), template.getFormat().toString(), templateOnStore.getDataStore().getUri(),
+                            templateOnStore.getDataStore().getRole().toString());
+                    //using the existing max template size configuration
+                    payload.setMaxUploadSize(_configDao.getValue(Config.MaxTemplateAndIsoSize.key()));
+                    payload.setRemoteEndPoint(ep.getPublicAddr());
+                    payload.setRequiresHvm(template.requiresHvm());
+                    payload.setDescription(template.getDisplayText());
+                    payloads.add(payload);
+                }
+                _resourceLimitMgr.incrementResourceCount(profile.getAccountId(), ResourceType.template);
+                return payloads;
+            }
+        });
     }
 
     private boolean isPrivateTemplate(VMTemplateVO template){