mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
add cache storage
This commit is contained in:
parent
e5bf38ed05
commit
1c448cd6e3
@ -21,4 +21,5 @@ package org.apache.cloudstack.engine.subsystem.api.storage;
|
||||
|
||||
public interface StorageCacheManager {
|
||||
public DataStore getCacheStorage(Scope scope);
|
||||
public DataObject createCacheObject(DataObject data, Scope scope);
|
||||
}
|
||||
|
||||
@ -24,6 +24,8 @@ import java.util.Map;
|
||||
import javax.inject.Inject;
|
||||
import javax.naming.ConfigurationException;
|
||||
|
||||
import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionService;
|
||||
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
|
||||
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
|
||||
import org.apache.cloudstack.engine.subsystem.api.storage.Scope;
|
||||
import org.apache.cloudstack.engine.subsystem.api.storage.StorageCacheManager;
|
||||
@ -34,6 +36,8 @@ import com.cloud.utils.component.Manager;
|
||||
public class StorageCacheManagerImpl implements StorageCacheManager, Manager {
|
||||
@Inject
|
||||
List<StorageCacheAllocator> storageCacheAllocator;
|
||||
@Inject
|
||||
DataMotionService dataMotionSvr;
|
||||
@Override
|
||||
public DataStore getCacheStorage(Scope scope) {
|
||||
for (StorageCacheAllocator allocator : storageCacheAllocator) {
|
||||
@ -97,4 +101,14 @@ public class StorageCacheManagerImpl implements StorageCacheManager, Manager {
|
||||
// TODO Auto-generated method stub
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DataObject createCacheObject(DataObject data, Scope scope) {
|
||||
DataStore cacheStore = this.getCacheStorage(scope);
|
||||
DataObject objOnCacheStore = cacheStore.create(data);
|
||||
//AsyncCallFuture<>
|
||||
//dataMotionSvr.copyAsync(data, objOnCacheStore, callback);
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@ -63,7 +63,7 @@ public class SnapshotDataFactoryImpl implements SnapshotDataFactory {
|
||||
SnapshotVO snapshot = snapshotDao.findByIdIncludingRemoved(snapshotId);
|
||||
SnapshotObject so = null;
|
||||
if (snapshot.getState() == Snapshot.State.BackedUp) {
|
||||
DataStore store = objMap.findStore(snapshot.getUuid(), DataObjectType.SNAPSHOT, DataStoreRole.Image);
|
||||
DataStore store = objMap.findStore(snapshot.getId(), DataObjectType.SNAPSHOT, DataStoreRole.Image);
|
||||
so = SnapshotObject.getSnapshotObject(snapshot, store);
|
||||
} else {
|
||||
VolumeInfo volume = this.volumeFactory.getVolume(snapshot.getVolumeId());
|
||||
|
||||
@ -470,7 +470,7 @@ public class AncientSnapshotStrategy implements SnapshotStrategy {
|
||||
|
||||
@DB
|
||||
protected boolean destroySnapshotBackUp(SnapshotVO snapshot) {
|
||||
DataStore store = objInStoreMgr.findStore(snapshot.getUuid(), DataObjectType.SNAPSHOT, DataStoreRole.Image);
|
||||
DataStore store = objInStoreMgr.findStore(snapshot.getId(), DataObjectType.SNAPSHOT, DataStoreRole.Image);
|
||||
if (store == null) {
|
||||
s_logger.debug("Can't find snapshot" + snapshot.getId() + " backed up into image store");
|
||||
return false;
|
||||
|
||||
@ -32,5 +32,5 @@ public interface ObjectInDataStoreManager {
|
||||
DataObjectInStore findObject(long objId, DataObjectType type,
|
||||
long dataStoreId, DataStoreRole role);
|
||||
DataObjectInStore findObject(DataObject obj, DataStore store);
|
||||
DataStore findStore(String objUuid, DataObjectType type, DataStoreRole role);
|
||||
DataStore findStore(long objId, DataObjectType type, DataStoreRole role);
|
||||
}
|
||||
|
||||
@ -35,6 +35,7 @@ import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
|
||||
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
|
||||
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
|
||||
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
|
||||
import org.apache.cloudstack.storage.db.ObjectInDataStoreDao;
|
||||
import org.apache.cloudstack.storage.db.ObjectInDataStoreVO;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.springframework.stereotype.Component;
|
||||
@ -69,6 +70,8 @@ public class ObjectInDataStoreManagerImpl implements ObjectInDataStoreManager {
|
||||
VMTemplatePoolDao templatePoolDao;
|
||||
@Inject
|
||||
SnapshotDataFactory snapshotFactory;
|
||||
@Inject
|
||||
ObjectInDataStoreDao objInStoreDao;
|
||||
protected StateMachine2<State, Event, DataObjectInStore> stateMachines;
|
||||
|
||||
public ObjectInDataStoreManagerImpl() {
|
||||
@ -110,6 +113,13 @@ public class ObjectInDataStoreManagerImpl implements ObjectInDataStoreManager {
|
||||
VMTemplateStoragePoolVO vo = new VMTemplateStoragePoolVO(dataStore.getId(), obj.getId());
|
||||
vo = templatePoolDao.persist(vo);
|
||||
}
|
||||
} else if (dataStore.getRole() == DataStoreRole.ImageCache) {
|
||||
ObjectInDataStoreVO vo = new ObjectInDataStoreVO();
|
||||
vo.setDataStoreRole(dataStore.getRole());
|
||||
vo.setDataStoreId(dataStore.getId());
|
||||
vo.setObjectType(obj.getType());
|
||||
vo.setObjectId(obj.getId());
|
||||
vo = objInStoreDao.persist(vo);
|
||||
} else {
|
||||
// Image store
|
||||
switch ( obj.getType()){
|
||||
@ -212,6 +222,13 @@ public class ObjectInDataStoreManagerImpl implements ObjectInDataStoreManager {
|
||||
}
|
||||
} else if (type == DataObjectType.TEMPLATE && role == DataStoreRole.Primary) {
|
||||
vo = templatePoolDao.findByPoolTemplate(dataStoreId, objId);
|
||||
} else if (role == DataStoreRole.ImageCache) {
|
||||
SearchCriteriaService<ObjectInDataStoreVO, ObjectInDataStoreVO> sc = SearchCriteria2.create(ObjectInDataStoreVO.class);
|
||||
sc.addAnd(sc.getEntity().getObjectId(), Op.EQ, objId);
|
||||
sc.addAnd(sc.getEntity().getObjectType(), Op.EQ, type);
|
||||
sc.addAnd(sc.getEntity().getDataStoreId(), Op.EQ, dataStoreId);
|
||||
sc.addAnd(sc.getEntity().getDataStoreRole(), Op.EQ, role);
|
||||
vo = sc.find();
|
||||
} else {
|
||||
s_logger.debug("Invalid data or store type: " + type + " " + role);
|
||||
throw new CloudRuntimeException("Invalid data or store type: " + type + " " + role);
|
||||
@ -222,16 +239,16 @@ public class ObjectInDataStoreManagerImpl implements ObjectInDataStoreManager {
|
||||
}
|
||||
|
||||
@Override
|
||||
public DataStore findStore(String objUuid, DataObjectType type, DataStoreRole role) {
|
||||
public DataStore findStore(long objId, DataObjectType type, DataStoreRole role) {
|
||||
DataStore store = null;
|
||||
if (role == DataStoreRole.Image) {
|
||||
SearchCriteriaService<ObjectInDataStoreVO, ObjectInDataStoreVO> sc = SearchCriteria2.create(ObjectInDataStoreVO.class);
|
||||
sc.addAnd(sc.getEntity().getDataStoreRole(), Op.EQ, role);
|
||||
sc.addAnd(sc.getEntity().getObjectUuid(), Op.EQ, objUuid);
|
||||
sc.addAnd(sc.getEntity().getObjectId(), Op.EQ, objId);
|
||||
sc.addAnd(sc.getEntity().getObjectType(), Op.EQ, type);
|
||||
ObjectInDataStoreVO vo = sc.find();
|
||||
if (vo != null) {
|
||||
store = this.storeMgr.getDataStore(vo.getDataStoreUuid(), vo.getDataStoreRole());
|
||||
store = this.storeMgr.getDataStore(vo.getDataStoreId(), vo.getDataStoreRole());
|
||||
}
|
||||
}
|
||||
return store;
|
||||
|
||||
@ -46,15 +46,15 @@ public class ObjectInDataStoreVO implements StateObject<ObjectInDataStoreStateMa
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
long id;
|
||||
|
||||
@Column(name = "datastore_uuid")
|
||||
private String dataStoreUuid;
|
||||
@Column(name = "datastore_id")
|
||||
private long dataStoreId;
|
||||
|
||||
@Column(name = "datastore_role")
|
||||
@Enumerated(EnumType.STRING)
|
||||
private DataStoreRole dataStoreRole;
|
||||
|
||||
@Column(name = "object_uuid")
|
||||
String objectUuid;
|
||||
@Column(name = "object_id")
|
||||
long objectId;
|
||||
|
||||
@Column(name = "object_type")
|
||||
@Enumerated(EnumType.STRING)
|
||||
@ -117,14 +117,6 @@ public class ObjectInDataStoreVO implements StateObject<ObjectInDataStoreStateMa
|
||||
return this.id;
|
||||
}
|
||||
|
||||
public String getDataStoreUuid() {
|
||||
return this.dataStoreUuid;
|
||||
}
|
||||
|
||||
public void setDataStoreUuid(String uuid) {
|
||||
this.dataStoreUuid = uuid;
|
||||
}
|
||||
|
||||
public DataStoreRole getDataStoreRole() {
|
||||
return this.dataStoreRole;
|
||||
}
|
||||
@ -133,12 +125,12 @@ public class ObjectInDataStoreVO implements StateObject<ObjectInDataStoreStateMa
|
||||
this.dataStoreRole = role;
|
||||
}
|
||||
|
||||
public String getObjectUuid() {
|
||||
return this.objectUuid;
|
||||
public long getObjectId() {
|
||||
return this.objectId;
|
||||
}
|
||||
|
||||
public void setObjectUuid(String uuid) {
|
||||
this.objectUuid = uuid;
|
||||
public void setObjectId(long id) {
|
||||
this.objectId = id;
|
||||
}
|
||||
|
||||
public DataObjectType getObjectType() {
|
||||
@ -189,4 +181,12 @@ public class ObjectInDataStoreVO implements StateObject<ObjectInDataStoreStateMa
|
||||
public void setUpdated(Date updated) {
|
||||
this.updated = updated;
|
||||
}
|
||||
|
||||
public long getDataStoreId() {
|
||||
return dataStoreId;
|
||||
}
|
||||
|
||||
public void setDataStoreId(long dataStoreId) {
|
||||
this.dataStoreId = dataStoreId;
|
||||
}
|
||||
}
|
||||
|
||||
@ -55,7 +55,7 @@ public class VolumeDataFactoryImpl implements VolumeDataFactory {
|
||||
VolumeVO volumeVO = volumeDao.findById(volumeId);
|
||||
VolumeObject vol = null;
|
||||
if (volumeVO.getPoolId() == null) {
|
||||
DataStore store = objMap.findStore(volumeVO.getUuid(), DataObjectType.VOLUME, DataStoreRole.Image);
|
||||
DataStore store = objMap.findStore(volumeVO.getId(), DataObjectType.VOLUME, DataStoreRole.Image);
|
||||
vol = VolumeObject.getVolumeObject(store, volumeVO);
|
||||
} else {
|
||||
DataStore store = this.storeMgr.getDataStore(volumeVO.getPoolId(), DataStoreRole.Primary);
|
||||
|
||||
@ -44,6 +44,8 @@ import org.apache.cloudstack.storage.datastore.PrimaryDataStoreProviderManager;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import com.cloud.configuration.Config;
|
||||
import com.cloud.configuration.dao.ConfigurationDao;
|
||||
import com.cloud.exception.ConcurrentOperationException;
|
||||
import com.cloud.storage.StoragePool;
|
||||
import com.cloud.storage.Volume;
|
||||
@ -51,6 +53,7 @@ import com.cloud.storage.Volume.Type;
|
||||
import com.cloud.storage.VolumeVO;
|
||||
import com.cloud.storage.dao.VolumeDao;
|
||||
import com.cloud.storage.snapshot.SnapshotManager;
|
||||
import com.cloud.utils.NumbersUtil;
|
||||
import com.cloud.utils.db.DB;
|
||||
import com.cloud.vm.VirtualMachine;
|
||||
import com.cloud.vm.dao.VMInstanceDao;
|
||||
@ -75,6 +78,8 @@ public class VolumeServiceImpl implements VolumeService {
|
||||
VolumeDataFactory volFactory;
|
||||
@Inject SnapshotManager snapshotMgr;
|
||||
@Inject VMInstanceDao vmDao;
|
||||
@Inject
|
||||
ConfigurationDao configDao;
|
||||
|
||||
public VolumeServiceImpl() {
|
||||
}
|
||||
@ -281,6 +286,24 @@ public class VolumeServiceImpl implements VolumeService {
|
||||
}
|
||||
}
|
||||
|
||||
private TemplateInfo waitForTemplateDownloaded(PrimaryDataStore store, TemplateInfo template) {
|
||||
int storagePoolMaxWaitSeconds = NumbersUtil.parseInt(configDao.getValue(Config.StoragePoolMaxWaitSeconds.key()), 3600);
|
||||
int sleepTime = 120;
|
||||
int tries = storagePoolMaxWaitSeconds/sleepTime;
|
||||
while (tries > 0) {
|
||||
TemplateInfo tmpl = store.getTemplate(template.getId());
|
||||
if (tmpl != null) {
|
||||
return tmpl;
|
||||
}
|
||||
try {
|
||||
Thread.sleep(sleepTime * 1000);
|
||||
} catch (InterruptedException e) {
|
||||
s_logger.debug("waiting for template download been interrupted: " + e.toString());
|
||||
}
|
||||
tries--;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@DB
|
||||
protected void createBaseImageAsync(VolumeInfo volume, PrimaryDataStore dataStore, TemplateInfo template, AsyncCallFuture<VolumeApiResult> future) {
|
||||
|
||||
@ -293,8 +316,21 @@ public class VolumeServiceImpl implements VolumeService {
|
||||
caller.setCallback(caller.getTarget().copyBaseImageCallback(null, null))
|
||||
.setContext(context);
|
||||
|
||||
templateOnPrimaryStoreObj.processEvent(Event.CreateOnlyRequested);
|
||||
|
||||
try {
|
||||
templateOnPrimaryStoreObj.processEvent(Event.CreateOnlyRequested);
|
||||
} catch (Exception e) {
|
||||
try {
|
||||
templateOnPrimaryStoreObj = waitForTemplateDownloaded(dataStore, template);
|
||||
} finally {
|
||||
if (templateOnPrimaryStoreObj == null) {
|
||||
VolumeApiResult result = new VolumeApiResult(volume);
|
||||
result.setResult(e.toString());
|
||||
caller.complete(result);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
motionSrv.copyAsync(template, templateOnPrimaryStoreObj, caller);
|
||||
} catch (Exception e) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user