Program: 107104
Project: 107104
Buggy source:
@Override @DB public boolean delete(long userId,long templateId,Long zoneId){
  boolean success=true;
  VMTemplateVO template=_tmpltDao.findById(templateId);
  if (template == null || template.getRemoved() != null) {
    throw new InvalidParameterValueException("String_Node_Str");
  }
  String zoneName;
  List<HostVO> secondaryStorageHosts;
  if (!template.isCrossZones() && zoneId != null) {
    DataCenterVO zone=_dcDao.findById(zoneId);
    zoneName=zone.getName();
    secondaryStorageHosts=new ArrayList<HostVO>();
    secondaryStorageHosts.add(_hostDao.findSecondaryStorageHost(zoneId));
  }
 else {
    zoneName="String_Node_Str";
    secondaryStorageHosts=_hostDao.listSecondaryStorageHosts();
  }
  s_logger.debug("String_Node_Str" + template.getName() + "String_Node_Str"+ zoneName);
  for (  HostVO secondaryStorageHost : secondaryStorageHosts) {
    long hostId=secondaryStorageHost.getId();
    List<VMTemplateHostVO> templateHostVOs=_tmpltHostDao.listByHostTemplate(hostId,templateId);
    for (    VMTemplateHostVO templateHostVO : templateHostVOs) {
      if (templateHostVO.getDownloadState() == Status.DOWNLOAD_IN_PROGRESS) {
        String errorMsg="String_Node_Str";
        s_logger.debug("String_Node_Str" + template.getName() + "String_Node_Str"+ secondaryStorageHost.getName()+ "String_Node_Str");
        throw new CloudRuntimeException(errorMsg);
      }
    }
  }
  Account account=_accountDao.findById(template.getAccountId());
  String eventType="String_Node_Str";
  if (template.getFormat().equals(ImageFormat.ISO)) {
    eventType=EventTypes.EVENT_ISO_DELETE;
  }
 else {
    eventType=EventTypes.EVENT_TEMPLATE_DELETE;
  }
  for (  HostVO secondaryStorageHost : secondaryStorageHosts) {
    long hostId=secondaryStorageHost.getId();
    long sZoneId=secondaryStorageHost.getDataCenterId();
    List<VMTemplateHostVO> templateHostVOs=_tmpltHostDao.listByHostTemplate(hostId,templateId);
    for (    VMTemplateHostVO templateHostVO : templateHostVOs) {
      VMTemplateHostVO lock=_tmpltHostDao.acquireInLockTable(templateHostVO.getId());
      try {
        if (lock == null) {
          s_logger.debug("String_Node_Str" + templateHostVO.getId());
          success=false;
          break;
        }
        templateHostVO.setDestroyed(true);
        _tmpltHostDao.update(templateHostVO.getId(),templateHostVO);
        VMTemplateZoneVO templateZone=_tmpltZoneDao.findByZoneTemplate(sZoneId,templateId);
        if (templateZone != null) {
          _tmpltZoneDao.remove(templateZone.getId());
        }
        UsageEventVO usageEvent=new UsageEventVO(eventType,account.getId(),sZoneId,templateId,null);
        _usageEventDao.persist(usageEvent);
      }
  finally {
        if (lock != null) {
          _tmpltHostDao.releaseFromLockTable(lock.getId());
        }
      }
    }
    if (!success) {
      break;
    }
  }
  s_logger.debug("String_Node_Str" + template.getName() + "String_Node_Str"+ zoneName);
  if (success && (_tmpltHostDao.listByTemplateId(templateId).size() == 0)) {
    long accountId=template.getAccountId();
    VMTemplateVO lock=_tmpltDao.acquireInLockTable(templateId);
    try {
      if (lock == null) {
        s_logger.debug("String_Node_Str" + templateId);
        success=false;
      }
 else       if (_tmpltDao.remove(templateId)) {
        _accountMgr.decrementResourceCount(accountId,ResourceType.template);
      }
    }
  finally {
      if (lock != null) {
        _tmpltDao.releaseFromLockTable(lock.getId());
      }
    }
    s_logger.debug("String_Node_Str" + template.getName() + "String_Node_Str");
  }
  return success;
}

Fixed version (ground truth):
@Override @DB public boolean delete(long userId,long templateId,Long zoneId){
  boolean success=true;
  VMTemplateVO template=_tmpltDao.findById(templateId);
  if (template == null || template.getRemoved() != null) {
    throw new InvalidParameterValueException("String_Node_Str");
  }
  String zoneName;
  List<HostVO> secondaryStorageHosts;
  if (!template.isCrossZones() && zoneId != null) {
    DataCenterVO zone=_dcDao.findById(zoneId);
    zoneName=zone.getName();
    secondaryStorageHosts=new ArrayList<HostVO>();
    secondaryStorageHosts.add(_hostDao.findSecondaryStorageHost(zoneId));
  }
 else {
    zoneName="String_Node_Str";
    secondaryStorageHosts=_hostDao.listSecondaryStorageHosts();
  }
  s_logger.debug("String_Node_Str" + template.getName() + "String_Node_Str"+ zoneName);
  for (  HostVO secondaryStorageHost : secondaryStorageHosts) {
    long hostId=secondaryStorageHost.getId();
    List<VMTemplateHostVO> templateHostVOs=_tmpltHostDao.listByHostTemplate(hostId,templateId);
    for (    VMTemplateHostVO templateHostVO : templateHostVOs) {
      if (templateHostVO.getDownloadState() == Status.DOWNLOAD_IN_PROGRESS) {
        String errorMsg="String_Node_Str";
        s_logger.debug("String_Node_Str" + template.getName() + "String_Node_Str"+ secondaryStorageHost.getName()+ "String_Node_Str");
        throw new CloudRuntimeException(errorMsg);
      }
    }
  }
  Account account=_accountDao.findByIdIncludingRemoved(template.getAccountId());
  String eventType="String_Node_Str";
  if (template.getFormat().equals(ImageFormat.ISO)) {
    eventType=EventTypes.EVENT_ISO_DELETE;
  }
 else {
    eventType=EventTypes.EVENT_TEMPLATE_DELETE;
  }
  for (  HostVO secondaryStorageHost : secondaryStorageHosts) {
    long hostId=secondaryStorageHost.getId();
    long sZoneId=secondaryStorageHost.getDataCenterId();
    List<VMTemplateHostVO> templateHostVOs=_tmpltHostDao.listByHostTemplate(hostId,templateId);
    for (    VMTemplateHostVO templateHostVO : templateHostVOs) {
      VMTemplateHostVO lock=_tmpltHostDao.acquireInLockTable(templateHostVO.getId());
      try {
        if (lock == null) {
          s_logger.debug("String_Node_Str" + templateHostVO.getId());
          success=false;
          break;
        }
        templateHostVO.setDestroyed(true);
        _tmpltHostDao.update(templateHostVO.getId(),templateHostVO);
        VMTemplateZoneVO templateZone=_tmpltZoneDao.findByZoneTemplate(sZoneId,templateId);
        if (templateZone != null) {
          _tmpltZoneDao.remove(templateZone.getId());
        }
        UsageEventVO usageEvent=new UsageEventVO(eventType,account.getId(),sZoneId,templateId,null);
        _usageEventDao.persist(usageEvent);
      }
  finally {
        if (lock != null) {
          _tmpltHostDao.releaseFromLockTable(lock.getId());
        }
      }
    }
    if (!success) {
      break;
    }
  }
  s_logger.debug("String_Node_Str" + template.getName() + "String_Node_Str"+ zoneName);
  if (success && (_tmpltHostDao.listByTemplateId(templateId).size() == 0)) {
    long accountId=template.getAccountId();
    VMTemplateVO lock=_tmpltDao.acquireInLockTable(templateId);
    try {
      if (lock == null) {
        s_logger.debug("String_Node_Str" + templateId);
        success=false;
      }
 else       if (_tmpltDao.remove(templateId)) {
        _accountMgr.decrementResourceCount(accountId,ResourceType.template);
      }
    }
  finally {
      if (lock != null) {
        _tmpltDao.releaseFromLockTable(lock.getId());
      }
    }
    s_logger.debug("String_Node_Str" + template.getName() + "String_Node_Str");
  }
  return success;
}