CLOUDSTACK-6826: Improving the download url expiration where the expiration 
work would be handled by the ssvm that has the corresponding symlink created on 
it. In case it doesnt exist, then would be any one of the ssvm in the zone.
Also when the ssvm is destroyed all the download urls are expired to be cleaned 
up in the next run by the new ssvm.

(cherry picked from commit ce908373573757372a3a09e46f835c3e269f3d02)


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

Branch: refs/heads/4.5
Commit: 50ee9810a8ff7f147f3355f0f176bbaae16e7c75
Parents: 003269e
Author: Nitin Mehta <[email protected]>
Authored: Fri Oct 10 16:28:48 2014 -0700
Committer: David Nalley <[email protected]>
Committed: Mon Oct 13 00:40:03 2014 -0400

----------------------------------------------------------------------
 .../subsystem/api/storage/EndPointSelector.java |  2 ++
 .../schema/src/com/cloud/host/dao/HostDao.java  |  2 ++
 .../src/com/cloud/host/dao/HostDaoImpl.java     | 13 +++++++++
 .../datastore/db/TemplateDataStoreDao.java      |  2 ++
 .../datastore/db/VolumeDataStoreDao.java        |  2 ++
 .../endpoint/DefaultEndPointSelector.java       | 29 ++++++++++++++++++++
 .../image/db/TemplateDataStoreDaoImpl.java      | 20 ++++++++++++++
 .../image/db/VolumeDataStoreDaoImpl.java        | 21 ++++++++++++++
 .../driver/CloudStackImageStoreDriverImpl.java  |  7 +++--
 .../SecondaryStorageManagerImpl.java            |  7 ++++-
 10 files changed, 102 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/50ee9810/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/EndPointSelector.java
----------------------------------------------------------------------
diff --git 
a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/EndPointSelector.java
 
b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/EndPointSelector.java
index 4657316..4d6465b 100644
--- 
a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/EndPointSelector.java
+++ 
b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/EndPointSelector.java
@@ -36,4 +36,6 @@ public interface EndPointSelector {
     EndPoint select(Scope scope, Long storeId);
 
     EndPoint selectHypervisorHost(Scope scope);
+
+    EndPoint select(DataStore store, String downloadUrl);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/50ee9810/engine/schema/src/com/cloud/host/dao/HostDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/host/dao/HostDao.java 
b/engine/schema/src/com/cloud/host/dao/HostDao.java
index 4d57bde..bd48482 100755
--- a/engine/schema/src/com/cloud/host/dao/HostDao.java
+++ b/engine/schema/src/com/cloud/host/dao/HostDao.java
@@ -88,4 +88,6 @@ public interface HostDao extends GenericDao<HostVO, Long>, 
StateDao<Status, Stat
     List<HostVO> listByDataCenterId(long id);
 
     List<Long> listAllHosts(long zoneId);
+
+    HostVO findByPublicIp(String publicIp);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/50ee9810/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java 
b/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java
index 58d472e..f1567ee 100755
--- a/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java
+++ b/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java
@@ -84,6 +84,7 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> 
implements HostDao
     protected SearchBuilder<HostVO> MsStatusSearch;
     protected SearchBuilder<HostVO> DcPrivateIpAddressSearch;
     protected SearchBuilder<HostVO> DcStorageIpAddressSearch;
+    protected SearchBuilder<HostVO> PublicIpAddressSearch;
 
     protected SearchBuilder<HostVO> GuidSearch;
     protected SearchBuilder<HostVO> DcSearch;
@@ -207,6 +208,10 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, 
Long> implements HostDao
         DcStorageIpAddressSearch.and("dc", 
DcStorageIpAddressSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ);
         DcStorageIpAddressSearch.done();
 
+        PublicIpAddressSearch = createSearchBuilder();
+        PublicIpAddressSearch.and("publicIpAddress", 
PublicIpAddressSearch.entity().getPublicIpAddress(), SearchCriteria.Op.EQ);
+        PublicIpAddressSearch.done();
+
         GuidSearch = createSearchBuilder();
         GuidSearch.and("guid", GuidSearch.entity().getGuid(), 
SearchCriteria.Op.EQ);
         GuidSearch.done();
@@ -1069,6 +1074,14 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, 
Long> implements HostDao
     }
 
     @Override
+    public HostVO findByPublicIp(String publicIp) {
+        SearchCriteria<HostVO> sc = PublicIpAddressSearch.create();
+        sc.setParameters("publicIpAddress", publicIp);
+        return findOneBy(sc);
+    }
+
+
+    @Override
     public List<HostVO> findHypervisorHostInCluster(long clusterId) {
         SearchCriteria<HostVO> sc = TypeClusterStatusSearch.create();
         sc.setParameters("type", Host.Type.Routing);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/50ee9810/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
----------------------------------------------------------------------
diff --git 
a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
 
b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
index 13c4d31..9f8bccd 100644
--- 
a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
+++ 
b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
@@ -78,4 +78,6 @@ public interface TemplateDataStoreDao extends 
GenericDao<TemplateDataStoreVO, Lo
     List<TemplateDataStoreVO> listTemplateDownloadUrls();
 
     void removeByTemplateStore(long templateId, long imageStoreId);
+
+    void expireDnldUrlsForZone(Long dcId);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/50ee9810/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java
----------------------------------------------------------------------
diff --git 
a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java
 
b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java
index 0016185..625cc29 100644
--- 
a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java
+++ 
b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java
@@ -44,4 +44,6 @@ public interface VolumeDataStoreDao extends 
GenericDao<VolumeDataStoreVO, Long>,
     void duplicateCacheRecordsOnRegionStore(long storeId);
 
     List<VolumeDataStoreVO> listVolumeDownloadUrls();
+
+    void expireDnldUrlsForZone(Long dcId);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/50ee9810/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
----------------------------------------------------------------------
diff --git 
a/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
 
b/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
index c620c40..18c8991 100644
--- 
a/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
+++ 
b/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
@@ -18,6 +18,8 @@
  */
 package org.apache.cloudstack.storage.endpoint;
 
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -262,6 +264,33 @@ public class DefaultEndPointSelector implements 
EndPointSelector {
     }
 
     @Override
+    public EndPoint select(DataStore store, String downloadUrl){
+
+        HostVO host = null;
+        try {
+            URI uri = new URI(downloadUrl);
+            String scheme = uri.getScheme();
+            String publicIp = uri.getHost();
+            // If its https then public ip will be of the form 
xxx-xxx-xxx-xxx.mydomain.com
+            if(scheme.equalsIgnoreCase("https")){
+                publicIp = publicIp.split("\\.")[0]; // We want xxx-xxx-xxx-xxx
+                publicIp = publicIp.replace("-","."); // We not want the IP -  
xxx.xxx.xxx.xxx
+            }
+            host = hostDao.findByPublicIp(publicIp);
+            if(host != null){
+                return RemoteHostEndPoint.getHypervisorHostEndPoint(host);
+            }
+
+        } catch (URISyntaxException e) {
+            s_logger.debug("Received URISyntaxException for url" +downloadUrl);
+        }
+
+        // If ssvm doesnt exist then find any ssvm in the zone.
+        s_logger.debug("Coudn't find ssvm for url" +downloadUrl);
+        return findEndpointForImageStorage(store);
+    }
+
+    @Override
     public EndPoint select(DataStore store) {
         if (store.getRole() == DataStoreRole.Primary) {
             return findEndpointForPrimaryStorage(store);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/50ee9810/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --git 
a/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
 
b/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
index a5cf6f8..dad0b6d 100644
--- 
a/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
+++ 
b/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
@@ -16,6 +16,7 @@
 // under the License.
 package org.apache.cloudstack.storage.image.db;
 
+import java.sql.PreparedStatement;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
@@ -64,6 +65,7 @@ public class TemplateDataStoreDaoImpl extends 
GenericDaoBase<TemplateDataStoreVO
     private SearchBuilder<TemplateDataStoreVO> storeTemplateStateSearch;
     private SearchBuilder<TemplateDataStoreVO> 
storeTemplateDownloadStatusSearch;
     private SearchBuilder<TemplateDataStoreVO> downloadTemplateSearch;
+    private static final String EXPIRE_DOWNLOAD_URLS_FOR_ZONE = "update 
template_store_ref set download_url_created=? where store_id in (select id from 
image_store where data_center_id=?)";
 
     @Inject
     private DataStoreManager _storeMgr;
@@ -511,4 +513,22 @@ public class TemplateDataStoreDaoImpl extends 
GenericDaoBase<TemplateDataStoreVO
         return listBy(sc);
     }
 
+    @Override
+    public void expireDnldUrlsForZone(Long dcId){
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
+        PreparedStatement pstmt = null;
+        try {
+            txn.start();
+            pstmt = 
txn.prepareAutoCloseStatement(EXPIRE_DOWNLOAD_URLS_FOR_ZONE);
+            pstmt.setDate(1, new java.sql.Date(-1l));// Set the time before 
the epoch time.
+            pstmt.setLong(2, dcId);
+            pstmt.executeUpdate();
+            txn.commit();
+        } catch (Exception e) {
+            txn.rollback();
+            s_logger.warn("Failed expiring download urls for dcId: " + dcId, 
e);
+        }
+
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/50ee9810/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --git 
a/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
 
b/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
index 9309f6e..2e29ad7 100644
--- 
a/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
+++ 
b/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
@@ -16,6 +16,7 @@
 // under the License.
 package org.apache.cloudstack.storage.image.db;
 
+import java.sql.PreparedStatement;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
@@ -51,6 +52,8 @@ public class VolumeDataStoreDaoImpl extends 
GenericDaoBase<VolumeDataStoreVO, Lo
     private SearchBuilder<VolumeDataStoreVO> cacheSearch;
     private SearchBuilder<VolumeDataStoreVO> storeVolumeSearch;
     private SearchBuilder<VolumeDataStoreVO> downloadVolumeSearch;
+    private static final String EXPIRE_DOWNLOAD_URLS_FOR_ZONE = "update 
volume_store_ref set download_url_created=? where store_id in (select id from 
image_store where data_center_id=?)";
+
 
     @Inject
     DataStoreManager storeMgr;
@@ -267,4 +270,22 @@ public class VolumeDataStoreDaoImpl extends 
GenericDaoBase<VolumeDataStoreVO, Lo
         sc.setParameters("destroyed", false);
         return listBy(sc);
     }
+
+    @Override
+    public void expireDnldUrlsForZone(Long dcId){
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
+        PreparedStatement pstmt = null;
+        try {
+            txn.start();
+            pstmt = 
txn.prepareAutoCloseStatement(EXPIRE_DOWNLOAD_URLS_FOR_ZONE);
+            pstmt.setDate(1, new java.sql.Date(-1l));// Set the time before 
the epoch time.
+            pstmt.setLong(2, dcId);
+            pstmt.executeUpdate();
+            txn.commit();
+        } catch (Exception e) {
+            txn.rollback();
+            s_logger.warn("Failed expiring download urls for dcId: " + dcId, 
e);
+        }
+
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/50ee9810/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java
----------------------------------------------------------------------
diff --git 
a/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java
 
b/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java
index c25e99f..05222c8 100644
--- 
a/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java
+++ 
b/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java
@@ -23,6 +23,7 @@ import java.util.UUID;
 import javax.inject.Inject;
 
 import com.cloud.agent.api.storage.DeleteEntityDownloadURLCommand;
+import com.cloud.host.dao.HostDao;
 import com.cloud.storage.Upload;
 import org.apache.log4j.Logger;
 
@@ -49,6 +50,8 @@ public class CloudStackImageStoreDriverImpl extends 
BaseImageStoreDriverImpl {
     @Inject
     ConfigurationDao _configDao;
     @Inject
+    HostDao _hostDao;
+    @Inject
     EndPointSelector _epSelector;
 
     @Override
@@ -113,8 +116,8 @@ public class CloudStackImageStoreDriverImpl extends 
BaseImageStoreDriverImpl {
 
     @Override
     public void deleteEntityExtractUrl(DataStore store, String installPath, 
String downloadUrl, Upload.Type entityType) {
-        // find an endpoint to send command
-        EndPoint ep = _epSelector.select(store);
+        // find an endpoint to send command based on the ssvm on which the url 
was created.
+        EndPoint ep = _epSelector.select(store, downloadUrl);
 
         // Delete Symlink at ssvm. In case of volume also delete the volume.
         DeleteEntityDownloadURLCommand cmd = new 
DeleteEntityDownloadURLCommand(installPath, entityType, downloadUrl, 
((ImageStoreEntity) store).getMountPoint());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/50ee9810/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java
----------------------------------------------------------------------
diff --git 
a/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java
 
b/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java
index 9288be4..045c622 100755
--- 
a/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java
+++ 
b/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java
@@ -43,6 +43,7 @@ import 
org.apache.cloudstack.framework.security.keystore.KeystoreManager;
 import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
 import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
 import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
 import org.apache.cloudstack.utils.identity.ManagementServerNode;
 import org.apache.log4j.Logger;
 
@@ -236,6 +237,8 @@ public class SecondaryStorageManagerImpl extends 
ManagerBase implements Secondar
     ImageStoreDao _imageStoreDao;
     @Inject
     TemplateDataStoreDao _tmplStoreDao;
+    @Inject
+    VolumeDataStoreDao _volumeStoreDao;
     private long _capacityScanInterval = DEFAULT_CAPACITY_SCAN_INTERVAL;
     private int _secStorageVmMtuSize;
 
@@ -987,7 +990,9 @@ public class SecondaryStorageManagerImpl extends 
ManagerBase implements Secondar
                 s_logger.debug("Removing host entry for ssvm id=" + vmId);
                 _hostDao.remove(host.getId());
             }
-
+            //Expire the download urls in the entire zone for templates and 
volumes.
+            _tmplStoreDao.expireDnldUrlsForZone(host.getDataCenterId());
+            _volumeStoreDao.expireDnldUrlsForZone(host.getDataCenterId());
             return true;
         } catch (ResourceUnavailableException e) {
             s_logger.warn("Unable to expunge " + ssvm, e);

Reply via email to