Skip to content

Commit ef74271

Browse files
committed
CE-110 markedForGC is ignored so delete the templates in the task that finds them
1 parent a5c516c commit ef74271

File tree

3 files changed

+33
-12
lines changed

3 files changed

+33
-12
lines changed

plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/CleanupFullyClonedTemplatesTask.java

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import com.cloud.hypervisor.HypervisorGuru;
2323
import com.cloud.storage.VMTemplateStoragePoolVO;
2424
import com.cloud.storage.dao.VMTemplatePoolDao;
25+
import com.cloud.template.TemplateManager;
26+
import com.cloud.template.VirtualMachineTemplate;
2527
import com.cloud.vm.UserVmCloneSettingVO;
2628
import com.cloud.vm.VMInstanceVO;
2729
import com.cloud.vm.dao.UserVmCloneSettingDao;
@@ -46,19 +48,22 @@ public class CleanupFullyClonedTemplatesTask extends ManagedContextRunnable {
4648
private TemplateJoinDao templateDao;
4749
private VMInstanceDao vmInstanceDao;
4850
private UserVmCloneSettingDao cloneSettingDao;
51+
private TemplateManager templateManager;
4952

5053
private Thread mine;
5154

5255
CleanupFullyClonedTemplatesTask(PrimaryDataStoreDao primaryStorageDao,
5356
VMTemplatePoolDao templateDataStoreDao,
5457
TemplateJoinDao templateDao,
5558
VMInstanceDao vmInstanceDao,
56-
UserVmCloneSettingDao cloneSettingDao) {
59+
UserVmCloneSettingDao cloneSettingDao,
60+
TemplateManager templateManager) {
5761
this.primaryStorageDao = primaryStorageDao;
5862
this.templateDataStoreDao = templateDataStoreDao;
5963
this.templateDao = templateDao;
6064
this.vmInstanceDao = vmInstanceDao;
6165
this.cloneSettingDao = cloneSettingDao;
66+
this.templateManager = templateManager;
6267
if(s_logger.isDebugEnabled()) {
6368
s_logger.debug("new task created: " + this);
6469
}
@@ -97,7 +102,9 @@ private void queryPoolForTemplates(StoragePoolVO pool, long zoneId) {
97102
}
98103
List<VMTemplateStoragePoolVO> templatePrimaryDataStoreVOS = templateDataStoreDao.listByPoolId(pool.getId());
99104
for (VMTemplateStoragePoolVO templateMapping : templatePrimaryDataStoreVOS) {
100-
checkTemplateForRemoval(zoneId, templateMapping);
105+
if (canRemoveTemplateFromZone(zoneId, templateMapping)) {
106+
templateManager.evictTemplateFromStoragePool(templateMapping);
107+
}
101108
}
102109
} else {
103110
if(s_logger.isDebugEnabled()) {
@@ -106,22 +113,23 @@ private void queryPoolForTemplates(StoragePoolVO pool, long zoneId) {
106113
}
107114
}
108115

109-
private void checkTemplateForRemoval(long zoneId, VMTemplateStoragePoolVO templateMapping) {
116+
private boolean canRemoveTemplateFromZone(long zoneId, VMTemplateStoragePoolVO templateMapping) {
110117
if (!templateMapping.getMarkedForGC()) {
111118
if(s_logger.isDebugEnabled()) {
112119
s_logger.debug(mine.getName() + " is checking template with id " + templateMapping.getTemplateId() + " for deletion from pool with id " + templateMapping.getPoolId());
113120
}
114121

115-
TemplateJoinVO templateJoinVO = templateDao.findByIdIncludingRemoved(templateMapping.getPoolId());
122+
TemplateJoinVO templateJoinVO = templateDao.findByIdIncludingRemoved(templateMapping.getTemplateId());
116123
// check if these are deleted (not removed is null)
117-
if (templateJoinVO.getRemoved() != null) { // meaning it is removed!
124+
if (VirtualMachineTemplate.State.Inactive.equals(templateJoinVO.getTemplateState())) { // meaning it is removed!
118125
// see if we can find vms using it with user_vm_clone_setting != full
119-
markForGcAsNeeded(templateMapping, zoneId);
126+
return markedForGc(templateMapping, zoneId);
120127
}
121128
}
129+
return false;
122130
}
123131

124-
private void markForGcAsNeeded(VMTemplateStoragePoolVO templateMapping, long zoneId) {
132+
private boolean markedForGc(VMTemplateStoragePoolVO templateMapping, long zoneId) {
125133
boolean used = false;
126134
List<VMInstanceVO> vms = vmInstanceDao.listNonExpungedByZoneAndTemplate(zoneId, templateMapping.getTemplateId());
127135
for (VMInstanceVO vm : vms) {
@@ -130,6 +138,7 @@ private void markForGcAsNeeded(VMTemplateStoragePoolVO templateMapping, long zon
130138
// VolumeOrchestrator or UserVmManagerImpl depending on version
131139
if (VolumeOrchestrator.UserVmCloneType.linked.equals(VolumeOrchestrator.UserVmCloneType.valueOf(cloneSetting.getCloneType()))) {
132140
used = true;
141+
break;
133142
}
134143
} catch (Exception e) {
135144
s_logger.error("failed to retrieve vm clone setting for vm " + vm.toString());
@@ -139,13 +148,11 @@ private void markForGcAsNeeded(VMTemplateStoragePoolVO templateMapping, long zon
139148
}
140149
}
141150
if (!used) {
142-
if(s_logger.isInfoEnabled()) {
143-
s_logger.info(mine.getName() + " is marking template with id " + templateMapping.getTemplateId() + " for gc in pool with id " + templateMapping.getPoolId());
144-
}
151+
s_logger.info(mine.getName() + " is marking template with id " + templateMapping.getTemplateId() + " for gc in pool with id " + templateMapping.getPoolId());
145152
// else
146153
// mark it for removal from primary store
147154
templateMapping.setMarkedForGC(true);
148-
templateDataStoreDao.persist(templateMapping);
149155
}
156+
return !used;
150157
}
151158
}

plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
import com.cloud.storage.StorageLayer;
8080
import com.cloud.storage.StorageManager;
8181
import com.cloud.storage.dao.VMTemplatePoolDao;
82+
import com.cloud.template.TemplateManager;
8283
import com.cloud.utils.FileUtil;
8384
import com.cloud.utils.NumbersUtil;
8485
import com.cloud.utils.Pair;
@@ -181,6 +182,8 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw
181182
private VMInstanceDao vmInstanceDao;
182183
@Inject
183184
private UserVmCloneSettingDao cloneSettingDao;
185+
@Inject
186+
private TemplateManager templateManager;
184187

185188
private String _mountParent;
186189
private StorageLayer _storage;
@@ -1309,6 +1312,7 @@ private Runnable getCleanupFullyClonedTemplatesTask() {
13091312
templateDataStoreDao,
13101313
templateDao,
13111314
vmInstanceDao,
1312-
cloneSettingDao);
1315+
cloneSettingDao,
1316+
templateManager);
13131317
}
13141318
}

plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import com.cloud.server.ConfigurationServer;
5151
import com.cloud.storage.ImageStoreDetailsUtil;
5252
import com.cloud.storage.dao.VMTemplatePoolDao;
53+
import com.cloud.template.TemplateManager;
5354
import com.cloud.user.Account;
5455
import com.cloud.user.AccountManager;
5556
import com.cloud.user.AccountService;
@@ -453,23 +454,32 @@ public ImageStoreDetailsDao imageStoreDetailsDao() {
453454
public VMTemplatePoolDao templateDataStoreDao() {
454455
return Mockito.mock(VMTemplatePoolDao.class);
455456
}
457+
456458
@Bean
457459
public TemplateJoinDao templateDao() {
458460
return Mockito.mock(TemplateJoinDao.class);
459461
}
462+
460463
@Bean
461464
public VMInstanceDao vmInstanceDao() {
462465
return Mockito.mock(VMInstanceDao.class);
463466
}
467+
464468
@Bean
465469
public UserVmCloneSettingDao cloneSettingDao() {
466470
return Mockito.mock(UserVmCloneSettingDao.class);
467471
}
472+
468473
@Bean
469474
public PrimaryDataStoreDao primaryStorageDao() {
470475
return Mockito.mock(PrimaryDataStoreDao.class);
471476
}
472477

478+
@Bean
479+
public TemplateManager templateManager() {
480+
return Mockito.mock(TemplateManager.class);
481+
}
482+
473483
public static class Library implements TypeFilter {
474484

475485
@Override

0 commit comments

Comments
 (0)