You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ki...@apache.org on 2013/12/30 07:45:48 UTC
git commit: updated refs/heads/4.3 to 662383e
Updated Branches:
refs/heads/4.3 5551724a2 -> 662383e24
CLOUDSTACK-5515: #cpu ,cpuspeed and ram is set to NULL in usage db(usage_vm_instance table) after vm stop and start Fixed populating usage event details in usage db on vm start/upgrade/dynamic_scale
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/662383e2
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/662383e2
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/662383e2
Branch: refs/heads/4.3
Commit: 662383e24b824c0622360435ad596a8307d67fee
Parents: 5551724
Author: Harikrishna Patnala <ha...@citrix.com>
Authored: Mon Dec 30 11:45:24 2013 +0530
Committer: Kishan Kavala <ki...@cloud.com>
Committed: Mon Dec 30 12:08:30 2013 +0530
----------------------------------------------------------------------
.../com/cloud/event/dao/UsageEventDaoImpl.java | 34 ++++++++++-
.../cloud/event/dao/UsageEventDetailsDao.java | 1 -
.../event/dao/UsageEventDetailsDaoImpl.java | 41 -------------
setup/db/db/schema-421to430.sql | 9 +++
usage/src/com/cloud/usage/UsageManagerImpl.java | 60 +++++++++-----------
5 files changed, 69 insertions(+), 76 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/662383e2/engine/schema/src/com/cloud/event/dao/UsageEventDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/event/dao/UsageEventDaoImpl.java b/engine/schema/src/com/cloud/event/dao/UsageEventDaoImpl.java
index 370afba..df8124a 100644
--- a/engine/schema/src/com/cloud/event/dao/UsageEventDaoImpl.java
+++ b/engine/schema/src/com/cloud/event/dao/UsageEventDaoImpl.java
@@ -53,6 +53,10 @@ public class UsageEventDaoImpl extends GenericDaoBase<UsageEventVO, Long> implem
private static final String COPY_ALL_EVENTS = "INSERT INTO cloud_usage.usage_event (id, type, account_id, created, zone_id, resource_id, resource_name, offering_id, template_id, size, resource_type, virtual_size) " +
"SELECT id, type, account_id, created, zone_id, resource_id, resource_name, offering_id, template_id, size, resource_type, virtual_size FROM cloud.usage_event vmevt WHERE vmevt.id <= ?";
private static final String MAX_EVENT = "select max(id) from cloud.usage_event where created <= ?";
+ private static final String COPY_EVENT_DETAILS = "INSERT INTO cloud_usage.usage_event_details (id, usage_event_id, name, value) " +
+ "SELECT id, usage_event_id, name, value FROM cloud.usage_event_details vmevtDetails WHERE vmevtDetails.usage_event_id > ? and vmevtDetails.usage_event_id <= ? ";
+ private static final String COPY_ALL_EVENT_DETAILS = "INSERT INTO cloud_usage.usage_event_details (id, usage_event_id, name, value) " +
+ "SELECT id, usage_event_id, name, value FROM cloud.usage_event_details vmevtDetails WHERE vmevtDetails.usage_event_id <= ?";
@Inject protected UsageEventDetailsDao usageEventDetailsDao;
public UsageEventDaoImpl () {
@@ -93,6 +97,7 @@ public class UsageEventDaoImpl extends GenericDaoBase<UsageEventVO, Long> implem
long recentEventId = getMostRecentEventId();
long maxEventId = getMaxEventId(endDate);
TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
+ // Copy events from cloud db to usage db
String sql = COPY_EVENTS;
if (recentEventId == 0) {
if (s_logger.isDebugEnabled()) {
@@ -112,12 +117,39 @@ public class UsageEventDaoImpl extends GenericDaoBase<UsageEventVO, Long> implem
pstmt.setLong(i++, maxEventId);
pstmt.executeUpdate();
txn.commit();
- return findRecentEvents(endDate);
} catch (Exception ex) {
txn.rollback();
s_logger.error("error copying events from cloud db to usage db", ex);
throw new CloudRuntimeException(ex.getMessage());
}
+
+ // Copy event details from cloud db to usage db
+ sql = COPY_EVENT_DETAILS;
+ if (recentEventId == 0) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("no recent event date, copying all event detailss");
+ }
+ sql = COPY_ALL_EVENT_DETAILS;
+ }
+
+ pstmt = null;
+ try {
+ txn.start();
+ pstmt = txn.prepareAutoCloseStatement(sql);
+ int i = 1;
+ if (recentEventId != 0) {
+ pstmt.setLong(i++, recentEventId);
+ }
+ pstmt.setLong(i++, maxEventId);
+ pstmt.executeUpdate();
+ txn.commit();
+ } catch (Exception ex) {
+ txn.rollback();
+ s_logger.error("error copying event details from cloud db to usage db", ex);
+ throw new CloudRuntimeException(ex.getMessage());
+ }
+
+ return findRecentEvents(endDate);
}
@DB
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/662383e2/engine/schema/src/com/cloud/event/dao/UsageEventDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/event/dao/UsageEventDetailsDao.java b/engine/schema/src/com/cloud/event/dao/UsageEventDetailsDao.java
index fb9c0e2..240553e 100644
--- a/engine/schema/src/com/cloud/event/dao/UsageEventDetailsDao.java
+++ b/engine/schema/src/com/cloud/event/dao/UsageEventDetailsDao.java
@@ -23,7 +23,6 @@ import com.cloud.utils.db.GenericDao;
public interface UsageEventDetailsDao extends GenericDao<UsageEventDetailsVO, Long> {
- Map<String, String> findDetails(long eventId);
void persist(long eventId, Map<String, String> details);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/662383e2/engine/schema/src/com/cloud/event/dao/UsageEventDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/event/dao/UsageEventDetailsDaoImpl.java b/engine/schema/src/com/cloud/event/dao/UsageEventDetailsDaoImpl.java
index 36afc75..5512f07 100644
--- a/engine/schema/src/com/cloud/event/dao/UsageEventDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/event/dao/UsageEventDetailsDaoImpl.java
@@ -39,8 +39,6 @@ import java.util.Map;
public class UsageEventDetailsDaoImpl extends GenericDaoBase<UsageEventDetailsVO, Long> implements UsageEventDetailsDao {
public static final Logger s_logger = Logger.getLogger(UsageEventDetailsDaoImpl.class.getName());
- private static final String EVENT_DETAILS_QUERY = "SELECT details.id, details.usage_event_id, details.name, details.value FROM `cloud`.`usage_event_details` details WHERE details.usage_event_id = ?";
-
protected final SearchBuilder<UsageEventDetailsVO> EventDetailsSearch;
protected final SearchBuilder<UsageEventDetailsVO> DetailSearch;
@@ -79,45 +77,6 @@ public class UsageEventDetailsDaoImpl extends GenericDaoBase<UsageEventDetailsVO
}
@Override
- public Map<String, String> findDetails(long eventId) {
- Connection conn = null;
- PreparedStatement pstmt = null;
- ResultSet resultSet = null;
- Map<String, String> details = new HashMap<String, String>();
- try {
- conn = TransactionLegacy.getStandaloneConnection();
-
- pstmt = conn.prepareStatement(EVENT_DETAILS_QUERY);
- pstmt.setLong(1, eventId);
- resultSet = pstmt.executeQuery();
-
- while (resultSet.next()) {
- details.put(resultSet.getString(3), resultSet.getString(4));
- }
-
- } catch (SQLException e) {
- throw new CloudRuntimeException("Error while executing SQL prepared statement", e);
- } catch (Throwable e) {
- throw new CloudRuntimeException("Caught: " + e);
- } finally {
- if (pstmt != null) {
- try {
- pstmt.close();
- } catch (SQLException e) {
- }
- }
- if (conn != null) {
- try {
- conn.close();
- } catch (SQLException e) {
- }
- }
- }
-
- return details;
- }
-
- @Override
public void persist(long eventId, Map<String, String> details) {
TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/662383e2/setup/db/db/schema-421to430.sql
----------------------------------------------------------------------
diff --git a/setup/db/db/schema-421to430.sql b/setup/db/db/schema-421to430.sql
index 95a8e8c..284fb17 100644
--- a/setup/db/db/schema-421to430.sql
+++ b/setup/db/db/schema-421to430.sql
@@ -646,6 +646,15 @@ CREATE TABLE `cloud`.`usage_event_details` (
CONSTRAINT `fk_usage_event_details__usage_event_id` FOREIGN KEY `fk_usage_event_details__usage_event_id`(`usage_event_id`) REFERENCES `usage_event`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+CREATE TABLE `cloud_usage`.`usage_event_details` (
+ `id` bigint unsigned NOT NULL auto_increment,
+ `usage_event_id` bigint unsigned NOT NULL COMMENT 'usage event id',
+ `name` varchar(255) NOT NULL,
+ `value` varchar(1024) NOT NULL,
+ PRIMARY KEY (`id`),
+ CONSTRAINT `fk_usage_event_details__usage_event_id` FOREIGN KEY `fk_usage_event_details__usage_event_id`(`usage_event_id`) REFERENCES `usage_event`(`id`) ON DELETE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
CREATE TABLE `cloud`.`user_ip_address_details` (
`id` bigint unsigned NOT NULL auto_increment,
`user_ip_address_id` bigint unsigned NOT NULL COMMENT 'User ip address id',
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/662383e2/usage/src/com/cloud/usage/UsageManagerImpl.java
----------------------------------------------------------------------
diff --git a/usage/src/com/cloud/usage/UsageManagerImpl.java b/usage/src/com/cloud/usage/UsageManagerImpl.java
index 8b3127d..de442e2 100644
--- a/usage/src/com/cloud/usage/UsageManagerImpl.java
+++ b/usage/src/com/cloud/usage/UsageManagerImpl.java
@@ -34,6 +34,7 @@ import javax.ejb.Local;
import javax.inject.Inject;
import javax.naming.ConfigurationException;
+import com.cloud.event.UsageEventDetailsVO;
import com.cloud.service.ServiceOfferingVO;
import org.apache.log4j.Logger;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
@@ -1028,7 +1029,7 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
usageInstance.setServiceOfferingId(soId);
usageInstance.setStartDate(event.getCreateDate());
usageInstance.setEndDate(null);
- m_usageInstanceDao.persist(usageInstance);
+ populateDynamicComputeOfferingDetailsAndPersist(usageInstance, event.getId());
}
}
@@ -1039,7 +1040,7 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
// add this VM to the usage helper table
UsageVMInstanceVO usageInstanceNew = new UsageVMInstanceVO(UsageTypes.RUNNING_VM, zoneId, event.getAccountId(), vmId, vmName,
soId, templateId, hypervisorType, event.getCreateDate(), null);
- m_usageInstanceDao.persist(usageInstanceNew);
+ populateDynamicComputeOfferingDetailsAndPersist(usageInstanceNew, event.getId());
} catch (Exception ex) {
s_logger.error("Error saving usage instance for vm: " + vmId, ex);
}
@@ -1066,38 +1067,11 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
try {
Long templateId = event.getTemplateId();
String hypervisorType = event.getResourceType();
- Long cpuCores= null;
- Long memory = null;
- Long cpuSpeed = null;
-
- //populate the cpu, memory and cpuSpeed of the vm when created from a dynamic offering.
- Map<String, String> usageDetails = _usageEventDetailsDao.findDetails(event.getId());
-
- if (usageDetails != null && usageDetails.size() != 0) {
- if (usageDetails.get(UsageEventVO.DynamicParameters.cpuNumber.name()) != null) {
- cpuCores = Long.parseLong(usageDetails.get(UsageEventVO.DynamicParameters.cpuNumber.name()));
- }
- if (usageDetails.get(UsageEventVO.DynamicParameters.cpuSpeed.name()) != null) {
- cpuSpeed = Long.parseLong(usageDetails.get(UsageEventVO.DynamicParameters.cpuSpeed.name()));
- }
- if (usageDetails.get(UsageEventVO.DynamicParameters.memory.name()) != null) {
- memory = Long.parseLong(usageDetails.get(UsageEventVO.DynamicParameters.memory.name()));
- }
- }
// add this VM to the usage helper table
UsageVMInstanceVO usageInstanceNew = new UsageVMInstanceVO(UsageTypes.ALLOCATED_VM, zoneId, event.getAccountId(), vmId, vmName,
soId, templateId, hypervisorType, event.getCreateDate(), null);
- if (cpuCores != null) {
- usageInstanceNew.setCpuCores(cpuCores);
- }
- if (cpuSpeed != null) {
- usageInstanceNew.setCpuSpeed(cpuSpeed);
- }
- if (memory != null) {
- usageInstanceNew.setMemory(memory);
- }
- m_usageInstanceDao.persist(usageInstanceNew);
+ populateDynamicComputeOfferingDetailsAndPersist(usageInstanceNew, event.getId());
} catch (Exception ex) {
s_logger.error("Error saving usage instance for vm: " + vmId, ex);
}
@@ -1137,7 +1111,7 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
// add this VM to the usage helper table
UsageVMInstanceVO usageInstanceNew = new UsageVMInstanceVO(UsageTypes.ALLOCATED_VM, zoneId, event.getAccountId(), vmId, vmName,
soId, templateId, hypervisorType, event.getCreateDate(), null);
- m_usageInstanceDao.persist(usageInstanceNew);
+ populateDynamicComputeOfferingDetailsAndPersist(usageInstanceNew, event.getId());
} else if (EventTypes.EVENT_VM_DYNAMIC_SCALE.equals(event.getType())) {
// Ending the running vm event
SearchCriteria<UsageVMInstanceVO> sc = m_usageInstanceDao.createSearchCriteria();
@@ -1172,7 +1146,7 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
usageInstance.setServiceOfferingId(soId);
usageInstance.setStartDate(event.getCreateDate());
usageInstance.setEndDate(null);
- m_usageInstanceDao.persist(usageInstance);
+ populateDynamicComputeOfferingDetailsAndPersist(usageInstance, event.getId());
}
}
@@ -1182,8 +1156,28 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
// add this VM to the usage helper table with new service offering Id
UsageVMInstanceVO usageInstanceNew = new UsageVMInstanceVO(UsageTypes.RUNNING_VM, zoneId, event.getAccountId(), vmId, vmName,
soId, templateId, hypervisorType, event.getCreateDate(), null);
- m_usageInstanceDao.persist(usageInstanceNew);
+ populateDynamicComputeOfferingDetailsAndPersist(usageInstanceNew, event.getId());
+ }
+ }
+
+ private void populateDynamicComputeOfferingDetailsAndPersist(UsageVMInstanceVO usageInstance, Long eventId) {
+
+ //populate the cpu, memory and cpuSpeed of the vm when created from a dynamic offering.
+ UsageEventDetailsVO cpuNumber = _usageEventDetailsDao.findDetail(eventId, UsageEventVO.DynamicParameters.cpuNumber.name());
+ if (cpuNumber != null) {
+ usageInstance.setCpuCores(Long.parseLong(cpuNumber.getValue()));
+ }
+
+ UsageEventDetailsVO cpuSpeed = _usageEventDetailsDao.findDetail(eventId, UsageEventVO.DynamicParameters.cpuSpeed.name());
+ if (cpuSpeed != null) {
+ usageInstance.setCpuSpeed(Long.parseLong(cpuSpeed.getValue()));
+ }
+
+ UsageEventDetailsVO memory = _usageEventDetailsDao.findDetail(eventId, UsageEventVO.DynamicParameters.memory.name());
+ if (memory != null) {
+ usageInstance.setMemory(Long.parseLong(memory.getValue()));
}
+ m_usageInstanceDao.persist(usageInstance);
}
private void createNetworkHelperEntry(UserStatisticsVO userStat, UsageNetworkVO usageNetworkStats, long timestamp) {