Skip to content
This repository was archived by the owner on Jan 15, 2020. It is now read-only.

Commit 95fa931

Browse files
Harikrishna PatnalaKishan Kavala
authored andcommitted
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
1 parent 069f8ae commit 95fa931

5 files changed

Lines changed: 69 additions & 82 deletions

File tree

engine/schema/src/com/cloud/event/dao/UsageEventDaoImpl.java

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ public class UsageEventDaoImpl extends GenericDaoBase<UsageEventVO, Long> implem
5454
private static final String COPY_ALL_EVENTS =
5555
"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) "
5656
+ "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 <= ?";
57+
private static final String COPY_EVENT_DETAILS = "INSERT INTO cloud_usage.usage_event_details (id, usage_event_id, name, value) "
58+
+ "SELECT id, usage_event_id, name, value FROM cloud.usage_event_details vmevtDetails WHERE vmevtDetails.usage_event_id > ? and vmevtDetails.usage_event_id <= ? ";
59+
private static final String COPY_ALL_EVENT_DETAILS = "INSERT INTO cloud_usage.usage_event_details (id, usage_event_id, name, value) "
60+
+ "SELECT id, usage_event_id, name, value FROM cloud.usage_event_details vmevtDetails WHERE vmevtDetails.usage_event_id <= ?";
5761
private static final String MAX_EVENT = "select max(id) from cloud.usage_event where created <= ?";
5862
@Inject
5963
protected UsageEventDetailsDao usageEventDetailsDao;
@@ -96,6 +100,7 @@ public synchronized List<UsageEventVO> getRecentEvents(Date endDate) {
96100
long recentEventId = getMostRecentEventId();
97101
long maxEventId = getMaxEventId(endDate);
98102
TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
103+
// Copy events from cloud db to usage db
99104
String sql = COPY_EVENTS;
100105
if (recentEventId == 0) {
101106
if (s_logger.isDebugEnabled()) {
@@ -115,12 +120,39 @@ public synchronized List<UsageEventVO> getRecentEvents(Date endDate) {
115120
pstmt.setLong(i++, maxEventId);
116121
pstmt.executeUpdate();
117122
txn.commit();
118-
return findRecentEvents(endDate);
119123
} catch (Exception ex) {
120124
txn.rollback();
121125
s_logger.error("error copying events from cloud db to usage db", ex);
122126
throw new CloudRuntimeException(ex.getMessage());
123127
}
128+
129+
// Copy event details from cloud db to usage db
130+
sql = COPY_EVENT_DETAILS;
131+
if (recentEventId == 0) {
132+
if (s_logger.isDebugEnabled()) {
133+
s_logger.debug("no recent event date, copying all event detailss");
134+
}
135+
sql = COPY_ALL_EVENT_DETAILS;
136+
}
137+
138+
pstmt = null;
139+
try {
140+
txn.start();
141+
pstmt = txn.prepareAutoCloseStatement(sql);
142+
int i = 1;
143+
if (recentEventId != 0) {
144+
pstmt.setLong(i++, recentEventId);
145+
}
146+
pstmt.setLong(i++, maxEventId);
147+
pstmt.executeUpdate();
148+
txn.commit();
149+
} catch (Exception ex) {
150+
txn.rollback();
151+
s_logger.error("error copying event details from cloud db to usage db", ex);
152+
throw new CloudRuntimeException(ex.getMessage());
153+
}
154+
155+
return findRecentEvents(endDate);
124156
}
125157

126158
@DB

engine/schema/src/com/cloud/event/dao/UsageEventDetailsDao.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import com.cloud.utils.db.GenericDao;
2424

2525
public interface UsageEventDetailsDao extends GenericDao<UsageEventDetailsVO, Long> {
26-
Map<String, String> findDetails(long eventId);
2726

2827
void persist(long eventId, Map<String, String> details);
2928

engine/schema/src/com/cloud/event/dao/UsageEventDetailsDaoImpl.java

Lines changed: 0 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,11 @@
1616
// under the License.
1717
package com.cloud.event.dao;
1818

19-
import java.sql.Connection;
20-
import java.sql.PreparedStatement;
21-
import java.sql.ResultSet;
22-
import java.sql.SQLException;
23-
import java.util.HashMap;
2419
import java.util.List;
2520
import java.util.Map;
2621

2722
import javax.ejb.Local;
2823

29-
import com.cloud.utils.exception.CloudRuntimeException;
3024
import org.apache.log4j.Logger;
3125
import org.springframework.stereotype.Component;
3226

@@ -41,8 +35,6 @@
4135
public class UsageEventDetailsDaoImpl extends GenericDaoBase<UsageEventDetailsVO, Long> implements UsageEventDetailsDao {
4236
public static final Logger s_logger = Logger.getLogger(UsageEventDetailsDaoImpl.class.getName());
4337

44-
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 = ?";
45-
4638
protected final SearchBuilder<UsageEventDetailsVO> EventDetailsSearch;
4739
protected final SearchBuilder<UsageEventDetailsVO> DetailSearch;
4840

@@ -79,45 +71,6 @@ public UsageEventDetailsVO findDetail(long eventId, String key) {
7971
return findOneBy(sc);
8072
}
8173

82-
@Override
83-
public Map<String, String> findDetails(long eventId) {
84-
Connection conn = null;
85-
PreparedStatement pstmt = null;
86-
ResultSet resultSet = null;
87-
Map<String, String> details = new HashMap<String, String>();
88-
try {
89-
conn = TransactionLegacy.getStandaloneConnection();
90-
91-
pstmt = conn.prepareStatement(EVENT_DETAILS_QUERY);
92-
pstmt.setLong(1, eventId);
93-
resultSet = pstmt.executeQuery();
94-
95-
while (resultSet.next()) {
96-
details.put(resultSet.getString(3), resultSet.getString(4));
97-
}
98-
99-
} catch (SQLException e) {
100-
throw new CloudRuntimeException("Error while executing SQL prepared statement", e);
101-
} catch (Throwable e) {
102-
throw new CloudRuntimeException("Caught: " + e);
103-
} finally {
104-
if (pstmt != null) {
105-
try {
106-
pstmt.close();
107-
} catch (SQLException e) {
108-
}
109-
}
110-
if (conn != null) {
111-
try {
112-
conn.close();
113-
} catch (SQLException e) {
114-
}
115-
}
116-
}
117-
118-
return details;
119-
}
120-
12174
@Override
12275
public void persist(long eventId, Map<String, String> details) {
12376
TransactionLegacy txn = TransactionLegacy.currentTxn();

setup/db/db/schema-421to430.sql

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -646,6 +646,15 @@ CREATE TABLE `cloud`.`usage_event_details` (
646646
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
647647
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
648648

649+
CREATE TABLE `cloud_usage`.`usage_event_details` (
650+
`id` bigint unsigned NOT NULL auto_increment,
651+
`usage_event_id` bigint unsigned NOT NULL COMMENT 'usage event id',
652+
`name` varchar(255) NOT NULL,
653+
`value` varchar(1024) NOT NULL,
654+
PRIMARY KEY (`id`),
655+
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
656+
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
657+
649658
CREATE TABLE `cloud`.`user_ip_address_details` (
650659
`id` bigint unsigned NOT NULL auto_increment,
651660
`user_ip_address_id` bigint unsigned NOT NULL COMMENT 'User ip address id',

usage/src/com/cloud/usage/UsageManagerImpl.java

Lines changed: 27 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import com.cloud.alert.AlertManager;
4545
import com.cloud.event.EventTypes;
4646
import com.cloud.event.UsageEventVO;
47+
import com.cloud.event.UsageEventDetailsVO;
4748
import com.cloud.event.dao.UsageEventDao;
4849
import com.cloud.event.dao.UsageEventDetailsDao;
4950
import com.cloud.usage.dao.UsageDao;
@@ -1067,7 +1068,7 @@ private void createVMHelperEvent(UsageEventVO event) {
10671068
usageInstance.setServiceOfferingId(soId);
10681069
usageInstance.setStartDate(event.getCreateDate());
10691070
usageInstance.setEndDate(null);
1070-
_usageInstanceDao.persist(usageInstance);
1071+
populateDynamicComputeOfferingDetailsAndPersist(usageInstance, event.getId());
10711072
}
10721073
}
10731074

@@ -1078,7 +1079,7 @@ private void createVMHelperEvent(UsageEventVO event) {
10781079
UsageVMInstanceVO usageInstanceNew =
10791080
new UsageVMInstanceVO(UsageTypes.RUNNING_VM, zoneId, event.getAccountId(), vmId, vmName, soId, templateId, hypervisorType, event.getCreateDate(),
10801081
null);
1081-
_usageInstanceDao.persist(usageInstanceNew);
1082+
populateDynamicComputeOfferingDetailsAndPersist(usageInstanceNew, event.getId());
10821083
} catch (Exception ex) {
10831084
s_logger.error("Error saving usage instance for vm: " + vmId, ex);
10841085
}
@@ -1105,38 +1106,11 @@ private void createVMHelperEvent(UsageEventVO event) {
11051106
try {
11061107
Long templateId = event.getTemplateId();
11071108
String hypervisorType = event.getResourceType();
1108-
Long cpuCores = null;
1109-
Long memory = null;
1110-
Long cpuSpeed = null;
1111-
1112-
//populate the cpu, memory and cpuSpeed of the vm when created from a dynamic offering.
1113-
Map<String, String> usageDetails = _usageEventDetailsDao.findDetails(event.getId());
1114-
1115-
if (usageDetails != null && usageDetails.size() != 0) {
1116-
if (usageDetails.get(UsageEventVO.DynamicParameters.cpuNumber.name()) != null) {
1117-
cpuCores = Long.parseLong(usageDetails.get(UsageEventVO.DynamicParameters.cpuNumber.name()));
1118-
}
1119-
if (usageDetails.get(UsageEventVO.DynamicParameters.cpuSpeed.name()) != null) {
1120-
cpuSpeed = Long.parseLong(usageDetails.get(UsageEventVO.DynamicParameters.cpuSpeed.name()));
1121-
}
1122-
if (usageDetails.get(UsageEventVO.DynamicParameters.memory.name()) != null) {
1123-
memory = Long.parseLong(usageDetails.get(UsageEventVO.DynamicParameters.memory.name()));
1124-
}
1125-
}
11261109

11271110
// add this VM to the usage helper table
11281111
UsageVMInstanceVO usageInstanceNew = new UsageVMInstanceVO(UsageTypes.ALLOCATED_VM, zoneId, event.getAccountId(), vmId, vmName,
11291112
soId, templateId, hypervisorType, event.getCreateDate(), null);
1130-
if (cpuCores != null) {
1131-
usageInstanceNew.setCpuCores(cpuCores);
1132-
}
1133-
if (cpuSpeed != null) {
1134-
usageInstanceNew.setCpuSpeed(cpuSpeed);
1135-
}
1136-
if (memory != null) {
1137-
usageInstanceNew.setMemory(memory);
1138-
}
1139-
_usageInstanceDao.persist(usageInstanceNew);
1113+
populateDynamicComputeOfferingDetailsAndPersist(usageInstanceNew, event.getId());
11401114
} catch (Exception ex) {
11411115
s_logger.error("Error saving usage instance for vm: " + vmId, ex);
11421116
}
@@ -1176,7 +1150,7 @@ private void createVMHelperEvent(UsageEventVO event) {
11761150
// add this VM to the usage helper table
11771151
UsageVMInstanceVO usageInstanceNew =
11781152
new UsageVMInstanceVO(UsageTypes.ALLOCATED_VM, zoneId, event.getAccountId(), vmId, vmName, soId, templateId, hypervisorType, event.getCreateDate(), null);
1179-
_usageInstanceDao.persist(usageInstanceNew);
1153+
populateDynamicComputeOfferingDetailsAndPersist(usageInstanceNew, event.getId());
11801154
} else if (EventTypes.EVENT_VM_DYNAMIC_SCALE.equals(event.getType())) {
11811155
// Ending the running vm event
11821156
SearchCriteria<UsageVMInstanceVO> sc = _usageInstanceDao.createSearchCriteria();
@@ -1211,7 +1185,7 @@ private void createVMHelperEvent(UsageEventVO event) {
12111185
usageInstance.setServiceOfferingId(soId);
12121186
usageInstance.setStartDate(event.getCreateDate());
12131187
usageInstance.setEndDate(null);
1214-
_usageInstanceDao.persist(usageInstance);
1188+
populateDynamicComputeOfferingDetailsAndPersist(usageInstance, event.getId());
12151189
}
12161190
}
12171191

@@ -1221,8 +1195,28 @@ private void createVMHelperEvent(UsageEventVO event) {
12211195
// add this VM to the usage helper table with new service offering Id
12221196
UsageVMInstanceVO usageInstanceNew =
12231197
new UsageVMInstanceVO(UsageTypes.RUNNING_VM, zoneId, event.getAccountId(), vmId, vmName, soId, templateId, hypervisorType, event.getCreateDate(), null);
1224-
_usageInstanceDao.persist(usageInstanceNew);
1198+
populateDynamicComputeOfferingDetailsAndPersist(usageInstanceNew, event.getId());
1199+
}
1200+
}
1201+
1202+
private void populateDynamicComputeOfferingDetailsAndPersist(UsageVMInstanceVO usageInstance, Long eventId) {
1203+
1204+
//populate the cpu, memory and cpuSpeed of the vm when created from a dynamic offering.
1205+
UsageEventDetailsVO cpuNumber = _usageEventDetailsDao.findDetail(eventId, UsageEventVO.DynamicParameters.cpuNumber.name());
1206+
if (cpuNumber != null) {
1207+
usageInstance.setCpuCores(Long.parseLong(cpuNumber.getValue()));
1208+
}
1209+
1210+
UsageEventDetailsVO cpuSpeed = _usageEventDetailsDao.findDetail(eventId, UsageEventVO.DynamicParameters.cpuSpeed.name());
1211+
if (cpuSpeed != null) {
1212+
usageInstance.setCpuSpeed(Long.parseLong(cpuSpeed.getValue()));
1213+
}
1214+
1215+
UsageEventDetailsVO memory = _usageEventDetailsDao.findDetail(eventId, UsageEventVO.DynamicParameters.memory.name());
1216+
if (memory != null) {
1217+
usageInstance.setMemory(Long.parseLong(memory.getValue()));
12251218
}
1219+
_usageInstanceDao.persist(usageInstance);
12261220
}
12271221

12281222
private void createNetworkHelperEntry(UserStatisticsVO userStat, UsageNetworkVO usageNetworkStats, long timestamp) {

0 commit comments

Comments
 (0)