Update DataObjectInStore interface and unify implementation of

ImageDataFactory, VolumeDataFactory and SnapshotDataFactory
implementations.
This commit is contained in:
Min Chen 2013-04-17 11:40:57 -07:00
parent c74969fcb0
commit fe3b01ece1
17 changed files with 313 additions and 177 deletions

View File

@ -44,66 +44,66 @@ public class VMTemplateHostVO implements VMTemplateStorageResourceAssoc, DataObj
@Id @Id
@GeneratedValue(strategy=GenerationType.IDENTITY) @GeneratedValue(strategy=GenerationType.IDENTITY)
Long id; Long id;
@Column(name="host_id") @Column(name="host_id")
private long hostId; private long hostId;
@Column(name="template_id") @Column(name="template_id")
private long templateId; private long templateId;
@Column(name=GenericDaoBase.CREATED_COLUMN) @Column(name=GenericDaoBase.CREATED_COLUMN)
private Date created = null; private Date created = null;
@Column(name="last_updated") @Column(name="last_updated")
@Temporal(value=TemporalType.TIMESTAMP) @Temporal(value=TemporalType.TIMESTAMP)
private Date lastUpdated = null; private Date lastUpdated = null;
@Column (name="download_pct") @Column (name="download_pct")
private int downloadPercent; private int downloadPercent;
@Column (name="size") @Column (name="size")
private long size; private long size;
@Column (name="physical_size") @Column (name="physical_size")
private long physicalSize; private long physicalSize;
@Column (name="download_state") @Column (name="download_state")
@Enumerated(EnumType.STRING) @Enumerated(EnumType.STRING)
private Status downloadState; private Status downloadState;
@Column (name="local_path") @Column (name="local_path")
private String localDownloadPath; private String localDownloadPath;
@Column (name="error_str") @Column (name="error_str")
private String errorString; private String errorString;
@Column (name="job_id") @Column (name="job_id")
private String jobId; private String jobId;
@Column (name="install_path") @Column (name="install_path")
private String installPath; private String installPath;
@Column (name="url") @Column (name="url")
private String downloadUrl; private String downloadUrl;
@Column(name="is_copy") @Column(name="is_copy")
private boolean isCopy = false; private boolean isCopy = false;
@Column(name="destroyed") @Column(name="destroyed")
boolean destroyed = false; boolean destroyed = false;
@Column(name="update_count", updatable = true, nullable=false) @Column(name="update_count", updatable = true, nullable=false)
protected long updatedCount; protected long updatedCount;
@Column(name = "updated") @Column(name = "updated")
@Temporal(value = TemporalType.TIMESTAMP) @Temporal(value = TemporalType.TIMESTAMP)
Date updated; Date updated;
@Column(name = "state") @Column(name = "state")
@Enumerated(EnumType.STRING) @Enumerated(EnumType.STRING)
ObjectInDataStoreStateMachine.State state; ObjectInDataStoreStateMachine.State state;
@Override @Override
public String getInstallPath() { public String getInstallPath() {
return installPath; return installPath;
@ -156,12 +156,12 @@ public class VMTemplateHostVO implements VMTemplateStorageResourceAssoc, DataObj
public Date getLastUpdated() { public Date getLastUpdated() {
return lastUpdated; return lastUpdated;
} }
@Override @Override
public void setLastUpdated(Date date) { public void setLastUpdated(Date date) {
lastUpdated = date; lastUpdated = date;
} }
@Override @Override
public void setInstallPath(String installPath) { public void setInstallPath(String installPath) {
this.installPath = installPath; this.installPath = installPath;
@ -197,7 +197,7 @@ public class VMTemplateHostVO implements VMTemplateStorageResourceAssoc, DataObj
} }
protected VMTemplateHostVO() { protected VMTemplateHostVO() {
} }
@Override @Override
@ -234,7 +234,7 @@ public class VMTemplateHostVO implements VMTemplateStorageResourceAssoc, DataObj
public boolean equals(Object obj) { public boolean equals(Object obj) {
if (obj instanceof VMTemplateHostVO) { if (obj instanceof VMTemplateHostVO) {
VMTemplateHostVO other = (VMTemplateHostVO)obj; VMTemplateHostVO other = (VMTemplateHostVO)obj;
return (this.templateId==other.getTemplateId() && this.hostId==other.getHostId()); return (this.templateId==other.getTemplateId() && this.hostId==other.getHostId());
} }
return false; return false;
} }
@ -253,8 +253,8 @@ public class VMTemplateHostVO implements VMTemplateStorageResourceAssoc, DataObj
public long getSize() { public long getSize() {
return size; return size;
} }
public void setPhysicalSize(long physicalSize) { public void setPhysicalSize(long physicalSize) {
this.physicalSize = physicalSize; this.physicalSize = physicalSize;
} }
@ -286,12 +286,12 @@ public class VMTemplateHostVO implements VMTemplateStorageResourceAssoc, DataObj
public boolean isCopy() { public boolean isCopy() {
return isCopy; return isCopy;
} }
@Override @Override
public long getTemplateSize() { public long getTemplateSize() {
return -1; return -1;
} }
@Override @Override
public String toString() { public String toString() {
return new StringBuilder("TmplHost[").append(id).append("-").append(templateId).append("-").append(hostId).append(installPath).append("]").toString(); return new StringBuilder("TmplHost[").append(id).append("-").append(templateId).append("-").append(hostId).append(installPath).append("]").toString();
@ -302,11 +302,11 @@ public class VMTemplateHostVO implements VMTemplateStorageResourceAssoc, DataObj
// TODO Auto-generated method stub // TODO Auto-generated method stub
return this.state; return this.state;
} }
public long getUpdatedCount() { public long getUpdatedCount() {
return this.updatedCount; return this.updatedCount;
} }
public void incrUpdatedCount() { public void incrUpdatedCount() {
this.updatedCount++; this.updatedCount++;
} }
@ -314,9 +314,20 @@ public class VMTemplateHostVO implements VMTemplateStorageResourceAssoc, DataObj
public void decrUpdatedCount() { public void decrUpdatedCount() {
this.updatedCount--; this.updatedCount--;
} }
public Date getUpdated() { public Date getUpdated() {
return updated; return updated;
} }
@Override
public long getObjectId() {
return this.getTemplateId();
}
@Override
public long getDataStoreId() {
return this.getHostId();
}
} }

View File

@ -45,32 +45,32 @@ public class VMTemplateStoragePoolVO implements VMTemplateStorageResourceAssoc,
@Id @Id
@GeneratedValue(strategy=GenerationType.IDENTITY) @GeneratedValue(strategy=GenerationType.IDENTITY)
long id; long id;
@Column(name="pool_id") @Column(name="pool_id")
private long poolId; private long poolId;
@Column(name="template_id") long templateId; @Column(name="template_id") long templateId;
@Column(name=GenericDaoBase.CREATED_COLUMN) Date created = null; @Column(name=GenericDaoBase.CREATED_COLUMN) Date created = null;
@Column(name="last_updated") @Column(name="last_updated")
@Temporal(value=TemporalType.TIMESTAMP) Date lastUpdated = null; @Temporal(value=TemporalType.TIMESTAMP) Date lastUpdated = null;
@Column (name="download_pct") int downloadPercent; @Column (name="download_pct") int downloadPercent;
@Column (name="download_state") @Column (name="download_state")
@Enumerated(EnumType.STRING) Status downloadState; @Enumerated(EnumType.STRING) Status downloadState;
@Column (name="local_path") String localDownloadPath; @Column (name="local_path") String localDownloadPath;
@Column (name="error_str") String errorString; @Column (name="error_str") String errorString;
@Column (name="job_id") String jobId; @Column (name="job_id") String jobId;
@Column (name="install_path") String installPath; @Column (name="install_path") String installPath;
@Column (name="template_size") long templateSize; @Column (name="template_size") long templateSize;
@Column (name="marked_for_gc") boolean markedForGC; @Column (name="marked_for_gc") boolean markedForGC;
@Column(name="update_count", updatable = true, nullable=false) @Column(name="update_count", updatable = true, nullable=false)
@ -88,7 +88,7 @@ public class VMTemplateStoragePoolVO implements VMTemplateStorageResourceAssoc,
public String getInstallPath() { public String getInstallPath() {
return installPath; return installPath;
} }
@Override @Override
public long getTemplateSize() { public long getTemplateSize() {
return templateSize; return templateSize;
@ -141,12 +141,12 @@ public class VMTemplateStoragePoolVO implements VMTemplateStorageResourceAssoc,
public Date getLastUpdated() { public Date getLastUpdated() {
return lastUpdated; return lastUpdated;
} }
@Override @Override
public void setLastUpdated(Date date) { public void setLastUpdated(Date date) {
lastUpdated = date; lastUpdated = date;
} }
@Override @Override
public void setInstallPath(String installPath) { public void setInstallPath(String installPath) {
this.installPath = installPath; this.installPath = installPath;
@ -184,7 +184,7 @@ public class VMTemplateStoragePoolVO implements VMTemplateStorageResourceAssoc,
} }
protected VMTemplateStoragePoolVO() { protected VMTemplateStoragePoolVO() {
} }
@Override @Override
@ -216,15 +216,15 @@ public class VMTemplateStoragePoolVO implements VMTemplateStorageResourceAssoc,
public String getJobId() { public String getJobId() {
return jobId; return jobId;
} }
public void setTemplateSize(long templateSize) { public void setTemplateSize(long templateSize) {
this.templateSize = templateSize; this.templateSize = templateSize;
} }
public boolean getMarkedForGC() { public boolean getMarkedForGC() {
return markedForGC; return markedForGC;
} }
public void setMarkedForGC(boolean markedForGC) { public void setMarkedForGC(boolean markedForGC) {
this.markedForGC = markedForGC; this.markedForGC = markedForGC;
} }
@ -244,7 +244,7 @@ public class VMTemplateStoragePoolVO implements VMTemplateStorageResourceAssoc,
Long hid = new Long(poolId); Long hid = new Long(poolId);
return tid.hashCode()+hid.hashCode(); return tid.hashCode()+hid.hashCode();
} }
@Override @Override
public String toString() { public String toString() {
return new StringBuilder("TmplPool[").append(id).append("-").append(templateId).append("-").append("poolId").append("-").append(installPath).append("]").toString(); return new StringBuilder("TmplPool[").append(id).append("-").append(templateId).append("-").append("poolId").append("-").append(installPath).append("]").toString();
@ -254,11 +254,11 @@ public class VMTemplateStoragePoolVO implements VMTemplateStorageResourceAssoc,
public State getState() { public State getState() {
return this.state; return this.state;
} }
public long getUpdatedCount() { public long getUpdatedCount() {
return this.updatedCount; return this.updatedCount;
} }
public void incrUpdatedCount() { public void incrUpdatedCount() {
this.updatedCount++; this.updatedCount++;
} }
@ -266,10 +266,20 @@ public class VMTemplateStoragePoolVO implements VMTemplateStorageResourceAssoc,
public void decrUpdatedCount() { public void decrUpdatedCount() {
this.updatedCount--; this.updatedCount--;
} }
public Date getUpdated() { public Date getUpdated() {
return updated; return updated;
} }
@Override
public long getObjectId() {
return this.getTemplateId();
}
@Override
public long getDataStoreId() {
return this.getPoolId();
}
} }

View File

@ -47,71 +47,71 @@ public class VolumeHostVO implements InternalIdentity, DataObjectInStore {
@Id @Id
@GeneratedValue(strategy=GenerationType.IDENTITY) @GeneratedValue(strategy=GenerationType.IDENTITY)
Long id; Long id;
@Column(name="host_id") @Column(name="host_id")
private long hostId; private long hostId;
@Column(name="volume_id") @Column(name="volume_id")
private long volumeId; private long volumeId;
@Column(name="zone_id") @Column(name="zone_id")
private long zoneId; private long zoneId;
@Column(name=GenericDaoBase.CREATED_COLUMN) @Column(name=GenericDaoBase.CREATED_COLUMN)
private Date created = null; private Date created = null;
@Column(name="last_updated") @Column(name="last_updated")
@Temporal(value=TemporalType.TIMESTAMP) @Temporal(value=TemporalType.TIMESTAMP)
private Date lastUpdated = null; private Date lastUpdated = null;
@Column (name="download_pct") @Column (name="download_pct")
private int downloadPercent; private int downloadPercent;
@Column (name="size") @Column (name="size")
private long size; private long size;
@Column (name="physical_size") @Column (name="physical_size")
private long physicalSize; private long physicalSize;
@Column (name="download_state") @Column (name="download_state")
@Enumerated(EnumType.STRING) @Enumerated(EnumType.STRING)
private Status downloadState; private Status downloadState;
@Column(name="checksum") @Column(name="checksum")
private String checksum; private String checksum;
@Column (name="local_path") @Column (name="local_path")
private String localDownloadPath; private String localDownloadPath;
@Column (name="error_str") @Column (name="error_str")
private String errorString; private String errorString;
@Column (name="job_id") @Column (name="job_id")
private String jobId; private String jobId;
@Column (name="install_path") @Column (name="install_path")
private String installPath; private String installPath;
@Column (name="url") @Column (name="url")
private String downloadUrl; private String downloadUrl;
@Column(name="format") @Column(name="format")
private Storage.ImageFormat format; private Storage.ImageFormat format;
@Column(name="destroyed") @Column(name="destroyed")
boolean destroyed = false; boolean destroyed = false;
@Column(name="update_count", updatable = true, nullable=false) @Column(name="update_count", updatable = true, nullable=false)
protected long updatedCount; protected long updatedCount;
@Column(name = "updated") @Column(name = "updated")
@Temporal(value = TemporalType.TIMESTAMP) @Temporal(value = TemporalType.TIMESTAMP)
Date updated; Date updated;
@Column(name = "state") @Column(name = "state")
@Enumerated(EnumType.STRING) @Enumerated(EnumType.STRING)
ObjectInDataStoreStateMachine.State state; ObjectInDataStoreStateMachine.State state;
public String getInstallPath() { public String getInstallPath() {
return installPath; return installPath;
} }
@ -124,17 +124,17 @@ public class VolumeHostVO implements InternalIdentity, DataObjectInStore {
this.hostId = hostId; this.hostId = hostId;
} }
public long getVolumeId() { public long getVolumeId() {
return volumeId; return volumeId;
} }
public void setVolumeId(long volumeId) { public void setVolumeId(long volumeId) {
this.volumeId = volumeId; this.volumeId = volumeId;
} }
public long getZoneId() { public long getZoneId() {
return zoneId; return zoneId;
} }
@ -147,42 +147,42 @@ public class VolumeHostVO implements InternalIdentity, DataObjectInStore {
return downloadPercent; return downloadPercent;
} }
public void setDownloadPercent(int downloadPercent) { public void setDownloadPercent(int downloadPercent) {
this.downloadPercent = downloadPercent; this.downloadPercent = downloadPercent;
} }
public void setDownloadState(Status downloadState) { public void setDownloadState(Status downloadState) {
this.downloadState = downloadState; this.downloadState = downloadState;
} }
public long getId() { public long getId() {
return id; return id;
} }
public Date getCreated() { public Date getCreated() {
return created; return created;
} }
public Date getLastUpdated() { public Date getLastUpdated() {
return lastUpdated; return lastUpdated;
} }
public void setLastUpdated(Date date) { public void setLastUpdated(Date date) {
lastUpdated = date; lastUpdated = date;
} }
public void setInstallPath(String installPath) { public void setInstallPath(String installPath) {
this.installPath = installPath; this.installPath = installPath;
} }
public Status getDownloadState() { public Status getDownloadState() {
return downloadState; return downloadState;
} }
@ -223,49 +223,49 @@ public class VolumeHostVO implements InternalIdentity, DataObjectInStore {
} }
protected VolumeHostVO() { protected VolumeHostVO() {
} }
public void setLocalDownloadPath(String localPath) { public void setLocalDownloadPath(String localPath) {
this.localDownloadPath = localPath; this.localDownloadPath = localPath;
} }
public String getLocalDownloadPath() { public String getLocalDownloadPath() {
return localDownloadPath; return localDownloadPath;
} }
public void setErrorString(String errorString) { public void setErrorString(String errorString) {
this.errorString = errorString; this.errorString = errorString;
} }
public String getErrorString() { public String getErrorString() {
return errorString; return errorString;
} }
public void setJobId(String jobId) { public void setJobId(String jobId) {
this.jobId = jobId; this.jobId = jobId;
} }
public String getJobId() { public String getJobId() {
return jobId; return jobId;
} }
public boolean equals(Object obj) { public boolean equals(Object obj) {
if (obj instanceof VolumeHostVO) { if (obj instanceof VolumeHostVO) {
VolumeHostVO other = (VolumeHostVO)obj; VolumeHostVO other = (VolumeHostVO)obj;
return (this.volumeId==other.getVolumeId() && this.hostId==other.getHostId()); return (this.volumeId==other.getVolumeId() && this.hostId==other.getHostId());
} }
return false; return false;
} }
public int hashCode() { public int hashCode() {
Long tid = new Long(volumeId); Long tid = new Long(volumeId);
Long hid = new Long(hostId); Long hid = new Long(hostId);
@ -279,8 +279,8 @@ public class VolumeHostVO implements InternalIdentity, DataObjectInStore {
public long getSize() { public long getSize() {
return size; return size;
} }
public void setPhysicalSize(long physicalSize) { public void setPhysicalSize(long physicalSize) {
this.physicalSize = physicalSize; this.physicalSize = physicalSize;
} }
@ -303,8 +303,8 @@ public class VolumeHostVO implements InternalIdentity, DataObjectInStore {
public String getDownloadUrl() { public String getDownloadUrl() {
return downloadUrl; return downloadUrl;
} }
public Storage.ImageFormat getFormat() { public Storage.ImageFormat getFormat() {
return format; return format;
} }
@ -316,16 +316,16 @@ public class VolumeHostVO implements InternalIdentity, DataObjectInStore {
public long getVolumeSize() { public long getVolumeSize() {
return -1; return -1;
} }
public String toString() { public String toString() {
return new StringBuilder("VolumeHost[").append(id).append("-").append(volumeId).append("-").append(hostId).append(installPath).append("]").toString(); return new StringBuilder("VolumeHost[").append(id).append("-").append(volumeId).append("-").append(hostId).append(installPath).append("]").toString();
} }
public long getUpdatedCount() { public long getUpdatedCount() {
return this.updatedCount; return this.updatedCount;
} }
public void incrUpdatedCount() { public void incrUpdatedCount() {
this.updatedCount++; this.updatedCount++;
} }
@ -333,7 +333,7 @@ public class VolumeHostVO implements InternalIdentity, DataObjectInStore {
public void decrUpdatedCount() { public void decrUpdatedCount() {
this.updatedCount--; this.updatedCount--;
} }
public Date getUpdated() { public Date getUpdated() {
return updated; return updated;
} }
@ -344,4 +344,15 @@ public class VolumeHostVO implements InternalIdentity, DataObjectInStore {
return this.state; return this.state;
} }
@Override
public long getObjectId() {
return this.getVolumeId();
}
@Override
public long getDataStoreId() {
return this.getHostId();
}
} }

View File

@ -24,4 +24,6 @@ import com.cloud.utils.fsm.StateObject;
public interface DataObjectInStore extends StateObject<ObjectInDataStoreStateMachine.State> { public interface DataObjectInStore extends StateObject<ObjectInDataStoreStateMachine.State> {
public String getInstallPath(); public String getInstallPath();
public void setInstallPath(String path); public void setInstallPath(String path);
public long getObjectId();
public long getDataStoreId();
} }

View File

@ -31,4 +31,12 @@ public interface SnapshotDataStoreDao extends GenericDao<SnapshotDataStoreVO, Lo
public List<SnapshotDataStoreVO> listByStoreId(long id); public List<SnapshotDataStoreVO> listByStoreId(long id);
public void deletePrimaryRecordsForStore(long id); public void deletePrimaryRecordsForStore(long id);
public SnapshotDataStoreVO findByStoreSnapshot(long storeId, long snapshotId);
public SnapshotDataStoreVO findByStoreSnapshot(long storeId, long snapshotId, boolean lock);
public SnapshotDataStoreVO findBySnapshot(long snapshotId);
public List<SnapshotDataStoreVO> listDestroyed(long storeId);
} }

View File

@ -95,6 +95,7 @@ public class SnapshotDataStoreVO implements StateObject<ObjectInDataStoreStateMa
return installPath; return installPath;
} }
@Override
public long getDataStoreId() { public long getDataStoreId() {
return dataStoreId; return dataStoreId;
} }
@ -239,4 +240,10 @@ public class SnapshotDataStoreVO implements StateObject<ObjectInDataStoreStateMa
return this.state; return this.state;
} }
@Override
public long getObjectId() {
return this.getSnapshotId();
}
} }

View File

@ -113,6 +113,7 @@ public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMa
} }
@Override
public long getDataStoreId() { public long getDataStoreId() {
return dataStoreId; return dataStoreId;
} }
@ -313,4 +314,11 @@ public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMa
return updated; return updated;
} }
@Override
public long getObjectId() {
return this.getTemplateId();
}
} }

View File

@ -32,7 +32,11 @@ public interface VolumeDataStoreDao extends GenericDao<VolumeDataStoreVO, Long>,
public void deletePrimaryRecordsForStore(long id); public void deletePrimaryRecordsForStore(long id);
public VolumeDataStoreVO findByVolumeId(long volumeId); public VolumeDataStoreVO findByVolume(long volumeId);
public VolumeDataStoreVO findByStoreVolume(long storeId, long volumeId); public VolumeDataStoreVO findByStoreVolume(long storeId, long volumeId);
public VolumeDataStoreVO findByStoreVolume(long storeId, long volumeId, boolean lock);
public List<VolumeDataStoreVO> listDestroyed(long storeId);
} }

View File

@ -117,6 +117,7 @@ public class VolumeDataStoreVO implements StateObject<ObjectInDataStoreStateMach
return installPath; return installPath;
} }
@Override
public long getDataStoreId() { public long getDataStoreId() {
return dataStoreId; return dataStoreId;
} }
@ -345,4 +346,10 @@ public class VolumeDataStoreVO implements StateObject<ObjectInDataStoreStateMach
return this.state; return this.state;
} }
@Override
public long getObjectId() {
return this.getVolumeId();
}
} }

View File

@ -21,13 +21,10 @@ package org.apache.cloudstack.storage.image;
import javax.inject.Inject; import javax.inject.Inject;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
import org.apache.cloudstack.engine.subsystem.api.storage.ImageDataFactory; import org.apache.cloudstack.engine.subsystem.api.storage.ImageDataFactory;
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo; import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager;
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao; import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO; import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
import org.apache.cloudstack.storage.image.store.TemplateObject; import org.apache.cloudstack.storage.image.store.TemplateObject;
@ -47,8 +44,6 @@ public class ImageDataFactoryImpl implements ImageDataFactory {
@Inject @Inject
VMTemplateDao imageDataDao; VMTemplateDao imageDataDao;
@Inject @Inject
ObjectInDataStoreManager objMap;
@Inject
DataStoreManager storeMgr; DataStoreManager storeMgr;
@Inject @Inject
VMTemplatePoolDao templatePoolDao; VMTemplatePoolDao templatePoolDao;
@ -61,6 +56,7 @@ public class ImageDataFactoryImpl implements ImageDataFactory {
TemplateObject tmpl = TemplateObject.getTemplate(templ, null); TemplateObject tmpl = TemplateObject.getTemplate(templ, null);
return tmpl; return tmpl;
} }
// verify if the given input parameters are consistent with our db data.
boolean found = false; boolean found = false;
if (store.getRole() == DataStoreRole.Primary) { if (store.getRole() == DataStoreRole.Primary) {
VMTemplateStoragePoolVO templatePoolVO = templatePoolDao.findByPoolTemplate(store.getId(), templateId); VMTemplateStoragePoolVO templatePoolVO = templatePoolDao.findByPoolTemplate(store.getId(), templateId);
@ -68,8 +64,8 @@ public class ImageDataFactoryImpl implements ImageDataFactory {
found = true; found = true;
} }
} else { } else {
DataObjectInStore obj = objMap.findObject(templ.getId(), DataObjectType.TEMPLATE, store.getId(), store.getRole()); TemplateDataStoreVO templateStoreVO = templateStoreDao.findByStoreTemplate(store.getId(), templateId);
if (obj != null) { if (templateStoreVO != null) {
found = true; found = true;
} }
} }
@ -82,8 +78,9 @@ public class ImageDataFactoryImpl implements ImageDataFactory {
return tmpl; return tmpl;
} }
// NOTE that this method can only be used for get template information stored in secondary storage
//TODO: this method is problematic, since one template can be stored in multiple image stores. //TODO: this method is problematic, since one template can be stored in multiple image stores.
// need to see if we can get rid of this method or change to plural format. // need to see if we can get rid of this method or change to plural format, or restrict to 1:1 mapping
@Override @Override
public TemplateInfo getTemplate(long templateId) { public TemplateInfo getTemplate(long templateId) {
VMTemplateVO templ = imageDataDao.findById(templateId); VMTemplateVO templ = imageDataDao.findById(templateId);
@ -94,6 +91,7 @@ public class ImageDataFactoryImpl implements ImageDataFactory {
} }
return this.getTemplate(templateId, store); return this.getTemplate(templateId, store);
} }
@Override @Override
public TemplateInfo getTemplate(DataObject obj, DataStore store) { public TemplateInfo getTemplate(DataObject obj, DataStore store) {
return this.getTemplate(obj.getId(), store); return this.getTemplate(obj.getId(), store);

View File

@ -21,15 +21,14 @@ package org.apache.cloudstack.storage.snapshot;
import javax.inject.Inject; import javax.inject.Inject;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotDataFactory; import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotDataFactory;
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo; import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager; import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import com.cloud.storage.DataStoreRole; import com.cloud.storage.DataStoreRole;
@ -43,7 +42,7 @@ public class SnapshotDataFactoryImpl implements SnapshotDataFactory {
@Inject @Inject
SnapshotDao snapshotDao; SnapshotDao snapshotDao;
@Inject @Inject
ObjectInDataStoreManager objMap; SnapshotDataStoreDao snapshotStoreDao;
@Inject @Inject
DataStoreManager storeMgr; DataStoreManager storeMgr;
@Inject @Inject
@ -51,19 +50,20 @@ public class SnapshotDataFactoryImpl implements SnapshotDataFactory {
@Override @Override
public SnapshotInfo getSnapshot(long snapshotId, DataStore store) { public SnapshotInfo getSnapshot(long snapshotId, DataStore store) {
SnapshotVO snapshot = snapshotDao.findByIdIncludingRemoved(snapshotId); SnapshotVO snapshot = snapshotDao.findByIdIncludingRemoved(snapshotId);
DataObjectInStore obj = objMap.findObject(snapshot.getId(), DataObjectType.SNAPSHOT, store.getId(), store.getRole());
if (obj == null) {
return null;
}
SnapshotObject so = SnapshotObject.getSnapshotObject(snapshot, store); SnapshotObject so = SnapshotObject.getSnapshotObject(snapshot, store);
return so; return so;
} }
@Override @Override
public SnapshotInfo getSnapshot(long snapshotId) { public SnapshotInfo getSnapshot(long snapshotId) {
SnapshotVO snapshot = snapshotDao.findByIdIncludingRemoved(snapshotId); SnapshotVO snapshot = snapshotDao.findByIdIncludingRemoved(snapshotId);
SnapshotObject so = null; SnapshotObject so = null;
if (snapshot.getState() == Snapshot.State.BackedUp) { if (snapshot.getState() == Snapshot.State.BackedUp) {
DataStore store = objMap.findStore(snapshot.getId(), DataObjectType.SNAPSHOT, DataStoreRole.Image); DataStore store = null;
SnapshotDataStoreVO snapshotStore = snapshotStoreDao.findBySnapshot(snapshotId);
if ( snapshotStore != null ){
store = this.storeMgr.getDataStore(snapshotStore.getDataStoreId(), DataStoreRole.Image);
}
so = SnapshotObject.getSnapshotObject(snapshot, store); so = SnapshotObject.getSnapshotObject(snapshot, store);
} else { } else {
VolumeInfo volume = this.volumeFactory.getVolume(snapshot.getVolumeId()); VolumeInfo volume = this.volumeFactory.getVolume(snapshot.getVolumeId());

View File

@ -218,20 +218,11 @@ public class ObjectInDataStoreManagerImpl implements ObjectInDataStoreManager {
if (role == DataStoreRole.Image) { if (role == DataStoreRole.Image) {
switch (type){ switch (type){
case TEMPLATE: case TEMPLATE:
SearchCriteria<TemplateDataStoreVO> ts = templateDataStoreDao.createSearchCriteria(); vo = templateDataStoreDao.findByStoreTemplate(dataStoreId, objId);
ts.addAnd("templateId", SearchCriteria.Op.EQ, objId);
ts.addAnd("dataStoreId", SearchCriteria.Op.EQ, dataStoreId);
vo = templateDataStoreDao.findOneBy(ts);
case SNAPSHOT: case SNAPSHOT:
SearchCriteria<SnapshotDataStoreVO> ss = snapshotDataStoreDao.createSearchCriteria(); vo = snapshotDataStoreDao.findByStoreSnapshot(dataStoreId, objId);
ss.addAnd("snapshotId", SearchCriteria.Op.EQ, objId);
ss.addAnd("dataStoreId", SearchCriteria.Op.EQ, objId);
vo = snapshotDataStoreDao.findOneBy(ss);
case VOLUME: case VOLUME:
SearchCriteria<VolumeDataStoreVO> vs = volumeDataStoreDao.createSearchCriteria(); vo = volumeDataStoreDao.findByStoreVolume(dataStoreId, objId);
vs.addAnd("volumeId", SearchCriteria.Op.EQ, objId);
vs.addAnd("dataStoreId", SearchCriteria.Op.EQ, objId);
vo = volumeDataStoreDao.findOneBy(vs);
} }
} else if (type == DataObjectType.TEMPLATE && role == DataStoreRole.Primary) { } else if (type == DataObjectType.TEMPLATE && role == DataStoreRole.Primary) {
vo = templatePoolDao.findByPoolTemplate(dataStoreId, objId); vo = templatePoolDao.findByPoolTemplate(dataStoreId, objId);
@ -255,13 +246,17 @@ public class ObjectInDataStoreManagerImpl implements ObjectInDataStoreManager {
public DataStore findStore(long objId, DataObjectType type, DataStoreRole role) { public DataStore findStore(long objId, DataObjectType type, DataStoreRole role) {
DataStore store = null; DataStore store = null;
if (role == DataStoreRole.Image) { if (role == DataStoreRole.Image) {
SearchCriteriaService<ObjectInDataStoreVO, ObjectInDataStoreVO> sc = SearchCriteria2.create(ObjectInDataStoreVO.class); DataObjectInStore vo = null;
sc.addAnd(sc.getEntity().getDataStoreRole(), Op.EQ, role); switch (type){
sc.addAnd(sc.getEntity().getObjectId(), Op.EQ, objId); case TEMPLATE:
sc.addAnd(sc.getEntity().getObjectType(), Op.EQ, type); vo = templateDataStoreDao.findByTemplate(objId);
ObjectInDataStoreVO vo = sc.find(); case SNAPSHOT:
vo = snapshotDataStoreDao.findBySnapshot(objId);
case VOLUME:
vo = volumeDataStoreDao.findByVolume(objId);
}
if (vo != null) { if (vo != null) {
store = this.storeMgr.getDataStore(vo.getDataStoreId(), vo.getDataStoreRole()); store = this.storeMgr.getDataStore(vo.getDataStoreId(), DataStoreRole.Image);
} }
} }
return store; return store;

View File

@ -48,14 +48,14 @@ public class ObjectInDataStoreVO implements StateObject<ObjectInDataStoreStateMa
@Column(name = "datastore_id") @Column(name = "datastore_id")
private long dataStoreId; private long dataStoreId;
@Column(name = "datastore_role") @Column(name = "datastore_role")
@Enumerated(EnumType.STRING) @Enumerated(EnumType.STRING)
private DataStoreRole dataStoreRole; private DataStoreRole dataStoreRole;
@Column(name = "object_id") @Column(name = "object_id")
long objectId; long objectId;
@Column(name = "object_type") @Column(name = "object_type")
@Enumerated(EnumType.STRING) @Enumerated(EnumType.STRING)
DataObjectType objectType; DataObjectType objectType;
@ -76,13 +76,13 @@ public class ObjectInDataStoreVO implements StateObject<ObjectInDataStoreStateMa
@Column(name = "local_path") @Column(name = "local_path")
String localDownloadPath; String localDownloadPath;
@Column (name="url") @Column (name="url")
private String downloadUrl; private String downloadUrl;
@Column(name="format") @Column(name="format")
private Storage.ImageFormat format; private Storage.ImageFormat format;
@Column(name="checksum") @Column(name="checksum")
private String checksum; private String checksum;
@ -97,46 +97,47 @@ public class ObjectInDataStoreVO implements StateObject<ObjectInDataStoreStateMa
@Column(name = "size") @Column(name = "size")
Long size; Long size;
@Column(name = "state") @Column(name = "state")
@Enumerated(EnumType.STRING) @Enumerated(EnumType.STRING)
ObjectInDataStoreStateMachine.State state; ObjectInDataStoreStateMachine.State state;
@Column(name="update_count", updatable = true, nullable=false) @Column(name="update_count", updatable = true, nullable=false)
protected long updatedCount; protected long updatedCount;
@Column(name = "updated") @Column(name = "updated")
@Temporal(value = TemporalType.TIMESTAMP) @Temporal(value = TemporalType.TIMESTAMP)
Date updated; Date updated;
public ObjectInDataStoreVO() { public ObjectInDataStoreVO() {
this.state = ObjectInDataStoreStateMachine.State.Allocated; this.state = ObjectInDataStoreStateMachine.State.Allocated;
} }
public long getId() { public long getId() {
return this.id; return this.id;
} }
public DataStoreRole getDataStoreRole() { public DataStoreRole getDataStoreRole() {
return this.dataStoreRole; return this.dataStoreRole;
} }
public void setDataStoreRole(DataStoreRole role) { public void setDataStoreRole(DataStoreRole role) {
this.dataStoreRole = role; this.dataStoreRole = role;
} }
@Override
public long getObjectId() { public long getObjectId() {
return this.objectId; return this.objectId;
} }
public void setObjectId(long id) { public void setObjectId(long id) {
this.objectId = id; this.objectId = id;
} }
public DataObjectType getObjectType() { public DataObjectType getObjectType() {
return this.objectType; return this.objectType;
} }
public void setObjectType(DataObjectType type) { public void setObjectType(DataObjectType type) {
this.objectType = type; this.objectType = type;
} }
@ -145,27 +146,27 @@ public class ObjectInDataStoreVO implements StateObject<ObjectInDataStoreStateMa
public ObjectInDataStoreStateMachine.State getState() { public ObjectInDataStoreStateMachine.State getState() {
return this.state; return this.state;
} }
public void setInstallPath(String path) { public void setInstallPath(String path) {
this.installPath = path; this.installPath = path;
} }
public String getInstallPath() { public String getInstallPath() {
return this.installPath; return this.installPath;
} }
public void setSize(Long size) { public void setSize(Long size) {
this.size = size; this.size = size;
} }
public Long getSize() { public Long getSize() {
return this.size; return this.size;
} }
public long getUpdatedCount() { public long getUpdatedCount() {
return this.updatedCount; return this.updatedCount;
} }
public void incrUpdatedCount() { public void incrUpdatedCount() {
this.updatedCount++; this.updatedCount++;
} }
@ -173,15 +174,16 @@ public class ObjectInDataStoreVO implements StateObject<ObjectInDataStoreStateMa
public void decrUpdatedCount() { public void decrUpdatedCount() {
this.updatedCount--; this.updatedCount--;
} }
public Date getUpdated() { public Date getUpdated() {
return updated; return updated;
} }
public void setUpdated(Date updated) { public void setUpdated(Date updated) {
this.updated = updated; this.updated = updated;
} }
@Override
public long getDataStoreId() { public long getDataStoreId() {
return dataStoreId; return dataStoreId;
} }

View File

@ -26,6 +26,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreState
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State; import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State;
import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao; import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO; import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO;
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -42,6 +43,8 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase<SnapshotDataStoreVO
private static final Logger s_logger = Logger.getLogger(SnapshotDataStoreDaoImpl.class); private static final Logger s_logger = Logger.getLogger(SnapshotDataStoreDaoImpl.class);
private SearchBuilder<SnapshotDataStoreVO> updateStateSearch; private SearchBuilder<SnapshotDataStoreVO> updateStateSearch;
private SearchBuilder<SnapshotDataStoreVO> storeSearch; private SearchBuilder<SnapshotDataStoreVO> storeSearch;
private SearchBuilder<SnapshotDataStoreVO> snapshotSearch;
private SearchBuilder<SnapshotDataStoreVO> storeSnapshotSearch;
@Override @Override
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException { public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
@ -57,6 +60,18 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase<SnapshotDataStoreVO
updateStateSearch.and("state", updateStateSearch.entity().getState(), Op.EQ); updateStateSearch.and("state", updateStateSearch.entity().getState(), Op.EQ);
updateStateSearch.and("updatedCount", updateStateSearch.entity().getUpdatedCount(), Op.EQ); updateStateSearch.and("updatedCount", updateStateSearch.entity().getUpdatedCount(), Op.EQ);
updateStateSearch.done(); updateStateSearch.done();
snapshotSearch = createSearchBuilder();
snapshotSearch.and("snapshot_id", snapshotSearch.entity().getSnapshotId(), SearchCriteria.Op.EQ);
snapshotSearch.and("destroyed", snapshotSearch.entity().getDestroyed(), SearchCriteria.Op.EQ);
snapshotSearch.done();
storeSnapshotSearch = createSearchBuilder();
storeSnapshotSearch.and("snapshot_id", storeSnapshotSearch.entity().getSnapshotId(), SearchCriteria.Op.EQ);
storeSnapshotSearch.and("store_id", storeSnapshotSearch.entity().getDataStoreId(), SearchCriteria.Op.EQ);
storeSnapshotSearch.and("destroyed", storeSnapshotSearch.entity().getDestroyed(), SearchCriteria.Op.EQ);
storeSnapshotSearch.done();
return true; return true;
} }
@ -116,6 +131,41 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase<SnapshotDataStoreVO
txn.commit(); txn.commit();
} }
@Override
public SnapshotDataStoreVO findByStoreSnapshot(long storeId, long snapshotId) {
SearchCriteria<SnapshotDataStoreVO> sc = storeSnapshotSearch.create();
sc.setParameters("store_id", storeId);
sc.setParameters("snapshot_id", snapshotId);
sc.setParameters("destroyed", false);
return findOneIncludingRemovedBy(sc);
}
@Override
public SnapshotDataStoreVO findByStoreSnapshot(long storeId, long snapshotId, boolean lock) {
SearchCriteria<SnapshotDataStoreVO> sc = storeSnapshotSearch.create();
sc.setParameters("store_id", storeId);
sc.setParameters("snapshot_id", snapshotId);
sc.setParameters("destroyed", false);
if (!lock)
return findOneIncludingRemovedBy(sc);
else
return lockOneRandomRow(sc, true);
}
@Override
public SnapshotDataStoreVO findBySnapshot(long snapshotId) {
SearchCriteria<SnapshotDataStoreVO> sc = snapshotSearch.create();
sc.setParameters("snapshot_id", snapshotId);
sc.setParameters("destroyed", false);
return findOneIncludingRemovedBy(sc);
}
@Override
public List<SnapshotDataStoreVO> listDestroyed(long id) {
SearchCriteria<SnapshotDataStoreVO> sc = storeSearch.create();
sc.setParameters("store_id", id);
sc.setParameters("destroyed", true);
return listIncludingRemovedBy(sc);
}
} }

View File

@ -133,12 +133,13 @@ public class VolumeDataStoreDaoImpl extends GenericDaoBase<VolumeDataStoreVO, Lo
@Override @Override
public VolumeDataStoreVO findByVolumeId(long volumeId) { public VolumeDataStoreVO findByVolume(long volumeId) {
SearchCriteria<VolumeDataStoreVO> sc = volumeSearch.create(); SearchCriteria<VolumeDataStoreVO> sc = volumeSearch.create();
sc.setParameters("volume_id", volumeId); sc.setParameters("volume_id", volumeId);
sc.setParameters("destroyed", false); sc.setParameters("destroyed", false);
return findOneBy(sc); return findOneBy(sc);
} }
@Override @Override
public VolumeDataStoreVO findByStoreVolume(long storeId, long volumeId) { public VolumeDataStoreVO findByStoreVolume(long storeId, long volumeId) {
SearchCriteria<VolumeDataStoreVO> sc = storeVolumeSearch.create(); SearchCriteria<VolumeDataStoreVO> sc = storeVolumeSearch.create();
@ -148,5 +149,23 @@ public class VolumeDataStoreDaoImpl extends GenericDaoBase<VolumeDataStoreVO, Lo
return findOneBy(sc); return findOneBy(sc);
} }
@Override
public VolumeDataStoreVO findByStoreVolume(long storeId, long volumeId, boolean lock) {
SearchCriteria<VolumeDataStoreVO> sc = storeVolumeSearch.create();
sc.setParameters("store_id", storeId);
sc.setParameters("volume_id", volumeId);
sc.setParameters("destroyed", false);
if (!lock)
return findOneIncludingRemovedBy(sc);
else
return lockOneRandomRow(sc, true);
}
@Override
public List<VolumeDataStoreVO> listDestroyed(long id) {
SearchCriteria<VolumeDataStoreVO> sc = storeSearch.create();
sc.setParameters("store_id", id);
sc.setParameters("destroyed", true);
return listIncludingRemovedBy(sc);
}
} }

View File

@ -21,12 +21,12 @@ package org.apache.cloudstack.storage.volume;
import javax.inject.Inject; import javax.inject.Inject;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager; import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import com.cloud.storage.DataStoreRole; import com.cloud.storage.DataStoreRole;
@ -38,24 +38,28 @@ public class VolumeDataFactoryImpl implements VolumeDataFactory {
@Inject @Inject
VolumeDao volumeDao; VolumeDao volumeDao;
@Inject @Inject
ObjectInDataStoreManager objMap; VolumeDataStoreDao volumeStoreDao;
@Inject @Inject
DataStoreManager storeMgr; DataStoreManager storeMgr;
@Override @Override
public VolumeInfo getVolume(long volumeId, DataStore store) { public VolumeInfo getVolume(long volumeId, DataStore store) {
VolumeVO volumeVO = volumeDao.findById(volumeId); VolumeVO volumeVO = volumeDao.findById(volumeId);
VolumeObject vol = VolumeObject.getVolumeObject(store, volumeVO); VolumeObject vol = VolumeObject.getVolumeObject(store, volumeVO);
return vol; return vol;
} }
@Override @Override
public VolumeInfo getVolume(long volumeId) { public VolumeInfo getVolume(long volumeId) {
VolumeVO volumeVO = volumeDao.findById(volumeId); VolumeVO volumeVO = volumeDao.findById(volumeId);
VolumeObject vol = null; VolumeObject vol = null;
if (volumeVO.getPoolId() == null) { if (volumeVO.getPoolId() == null) {
DataStore store = objMap.findStore(volumeVO.getId(), DataObjectType.VOLUME, DataStoreRole.Image); DataStore store = null;
VolumeDataStoreVO volumeStore = volumeStoreDao.findByVolume(volumeId);
if ( volumeStore != null ){
store = this.storeMgr.getDataStore(volumeStore.getDataStoreId(), DataStoreRole.Image);
}
vol = VolumeObject.getVolumeObject(store, volumeVO); vol = VolumeObject.getVolumeObject(store, volumeVO);
} else { } else {
DataStore store = this.storeMgr.getDataStore(volumeVO.getPoolId(), DataStoreRole.Primary); DataStore store = this.storeMgr.getDataStore(volumeVO.getPoolId(), DataStoreRole.Primary);

View File

@ -774,7 +774,7 @@ public class VolumeServiceImpl implements VolumeService {
if (volInfo.getSize() > 0) { if (volInfo.getSize() > 0) {
try { try {
String url = _volumeStoreDao.findByVolumeId(volume.getId()).getDownloadUrl(); String url = _volumeStoreDao.findByVolume(volume.getId()).getDownloadUrl();
_resourceLimitMgr.checkResourceLimit(_accountMgr.getAccount(volume.getAccountId()), _resourceLimitMgr.checkResourceLimit(_accountMgr.getAccount(volume.getAccountId()),
com.cloud.configuration.Resource.ResourceType.secondary_storage, com.cloud.configuration.Resource.ResourceType.secondary_storage,
volInfo.getSize() - UriUtils.getRemoteSize(url)); volInfo.getSize() - UriUtils.getRemoteSize(url));