Skip to content

Commit 76ce304

Browse files
committed
CLOUDSTACK-2707: use executeBatch instead of persist in Usage Server
1 parent c2b20a4 commit 76ce304

5 files changed

Lines changed: 104 additions & 23 deletions

File tree

engine/schema/src/com/cloud/usage/dao/UsageDao.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public interface UsageDao extends GenericDao<UsageVO, Long> {
3838
Long getLastUserStatsId();
3939
List<Long> listPublicTemplatesByAccount(long accountId);
4040
Long getLastVmDiskStatsId();
41-
void updateVmDiskStats(List<VmDiskStatisticsVO> vmNetStats);
42-
void saveVmDiskStats(List<VmDiskStatisticsVO> vmNetStats);
41+
void updateVmDiskStats(List<VmDiskStatisticsVO> vmDiskStats);
42+
void saveVmDiskStats(List<VmDiskStatisticsVO> vmDiskStats);
43+
void saveUsageRecords(List<UsageVO> usageRecords);
4344
}

engine/schema/src/com/cloud/usage/dao/UsageDaoImpl.java

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.sql.PreparedStatement;
2020
import java.sql.ResultSet;
21+
import java.sql.Timestamp;
2122
import java.sql.Types;
2223
import java.util.ArrayList;
2324
import java.util.Date;
@@ -63,6 +64,8 @@ public class UsageDaoImpl extends GenericDaoBase<UsageVO, Long> implements Usage
6364
" VALUES (?,?,?,?,?,?,?,?,?,?, ?, ?, ?, ?,?, ?, ?)";
6465
private static final String UPDATE_VM_DISK_STATS = "UPDATE cloud_usage.vm_disk_statistics SET net_io_read=?, net_io_write=?, current_io_read=?, current_io_write=?, agg_io_read=?, agg_io_write=?, " +
6566
"net_bytes_read=?, net_bytes_write=?, current_bytes_read=?, current_bytes_write=?, agg_bytes_read=?, agg_bytes_write=? WHERE id=?";
67+
private static final String INSERT_USGAE_RECORDS = "INSERT INTO cloud_usage.cloud_usage (zone_id, account_id, domain_id, description, usage_display, usage_type, raw_usage, vm_instance_id, vm_name, offering_id, template_id, " +
68+
"usage_id, type, size, network_id, start_date, end_date) VALUES (?,?,?,?,?,?,?,?,?, ?, ?, ?,?,?,?,?,?)";
6669

6770
protected final static TimeZone s_gmtTimeZone = TimeZone.getTimeZone("GMT");
6871

@@ -375,4 +378,65 @@ public void saveVmDiskStats(List<VmDiskStatisticsVO> vmDiskStats) {
375378
}
376379

377380
}
381+
382+
@Override
383+
public void saveUsageRecords(List<UsageVO> usageRecords) {
384+
Transaction txn = Transaction.currentTxn();
385+
try {
386+
txn.start();
387+
String sql = INSERT_USGAE_RECORDS;
388+
PreparedStatement pstmt = null;
389+
pstmt = txn.prepareAutoCloseStatement(sql); // in reality I just want CLOUD_USAGE dataSource connection
390+
for (UsageVO usageRecord : usageRecords) {
391+
pstmt.setLong(1, usageRecord.getZoneId());
392+
pstmt.setLong(2, usageRecord.getAccountId());
393+
pstmt.setLong(3, usageRecord.getDomainId());
394+
pstmt.setString(4, usageRecord.getDescription());
395+
pstmt.setString(5, usageRecord.getUsageDisplay());
396+
pstmt.setInt(6, usageRecord.getUsageType());
397+
pstmt.setDouble(7, usageRecord.getRawUsage());
398+
if(usageRecord.getVmInstanceId() != null){
399+
pstmt.setLong(8, usageRecord.getVmInstanceId());
400+
} else {
401+
pstmt.setNull(8, Types.BIGINT);
402+
}
403+
pstmt.setString(9, usageRecord.getVmName());
404+
if(usageRecord.getOfferingId() != null){
405+
pstmt.setLong(10, usageRecord.getOfferingId());
406+
} else {
407+
pstmt.setNull(10, Types.BIGINT);
408+
}
409+
if(usageRecord.getTemplateId() != null){
410+
pstmt.setLong(11, usageRecord.getTemplateId());
411+
} else {
412+
pstmt.setNull(11, Types.BIGINT);
413+
}
414+
if(usageRecord.getUsageId() != null){
415+
pstmt.setLong(12, usageRecord.getUsageId());
416+
} else {
417+
pstmt.setNull(12, Types.BIGINT);
418+
}
419+
pstmt.setString(13, usageRecord.getType());
420+
if(usageRecord.getSize() != null){
421+
pstmt.setLong(14, usageRecord.getSize());
422+
} else {
423+
pstmt.setNull(14, Types.BIGINT);
424+
}
425+
if(usageRecord.getNetworkId() != null){
426+
pstmt.setLong(15, usageRecord.getNetworkId());
427+
} else {
428+
pstmt.setNull(15, Types.BIGINT);
429+
}
430+
pstmt.setTimestamp(16, new Timestamp(usageRecord.getStartDate().getTime()));
431+
pstmt.setTimestamp(17, new Timestamp(usageRecord.getEndDate().getTime()));
432+
pstmt.addBatch();
433+
}
434+
pstmt.executeBatch();
435+
txn.commit();
436+
} catch (Exception ex) {
437+
txn.rollback();
438+
s_logger.error("error saving usage records to cloud_usage db", ex);
439+
throw new CloudRuntimeException(ex.getMessage());
440+
}
441+
}
378442
}

server/src/com/cloud/api/ApiResponseHelper.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3404,8 +3404,8 @@ public UsageRecordResponse createUsageResponse(Usage usageRecord) {
34043404
//Device Type
34053405
usageRecResponse.setType(usageRecord.getType());
34063406
//VM Instance Id
3407-
VMInstanceVO vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getUsageId().toString());
3408-
usageRecResponse.setUsageId(vm.getUuid());
3407+
VMInstanceVO vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getVmInstanceId().toString());
3408+
usageRecResponse.setVirtualMachineId(vm.getUuid());
34093409
//Volume ID
34103410
VolumeVO volume = _entityMgr.findByIdIncludingRemoved(VolumeVO.class, usageRecord.getUsageId().toString());
34113411
usageRecResponse.setUsageId(volume.getUuid());

usage/src/com/cloud/usage/parser/NetworkUsageParser.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
// under the License.
1717
package com.cloud.usage.parser;
1818

19+
import java.util.ArrayList;
1920
import java.util.Date;
2021
import java.util.HashMap;
2122
import java.util.List;
@@ -89,6 +90,7 @@ public static boolean parse(AccountVO account, Date startDate, Date endDate) {
8990
networkUsageByZone.put(key, new NetworkInfo(zoneId, usageNetwork.getHostId(), usageNetwork.getHostType(), usageNetwork.getNetworkId(), bytesSent, bytesReceived));
9091
}
9192

93+
List<UsageVO> usageRecords = new ArrayList<UsageVO>();
9294
for (String key : networkUsageByZone.keySet()) {
9395
NetworkInfo networkInfo = networkUsageByZone.get(key);
9496
long totalBytesSent = networkInfo.getBytesSent();
@@ -110,7 +112,7 @@ public static boolean parse(AccountVO account, Date startDate, Date endDate) {
110112
}
111113
UsageVO usageRecord = new UsageVO(networkInfo.getZoneId(), account.getId(), account.getDomainId(), usageDesc, totalBytesSent + " bytes sent",
112114
UsageTypes.NETWORK_BYTES_SENT, new Double(totalBytesSent), hostId, networkInfo.getHostType(), networkInfo.getNetworkId(), startDate, endDate);
113-
m_usageDao.persist(usageRecord);
115+
usageRecords.add(usageRecord);
114116

115117
// Create the usage record for bytes received
116118
usageDesc = "network bytes received";
@@ -119,14 +121,19 @@ public static boolean parse(AccountVO account, Date startDate, Date endDate) {
119121
}
120122
usageRecord = new UsageVO(networkInfo.getZoneId(), account.getId(), account.getDomainId(), usageDesc, totalBytesReceived + " bytes received",
121123
UsageTypes.NETWORK_BYTES_RECEIVED, new Double(totalBytesReceived), hostId, networkInfo.getHostType(), networkInfo.getNetworkId(), startDate, endDate);
122-
m_usageDao.persist(usageRecord);
124+
usageRecords.add(usageRecord);
123125
} else {
124126
// Don't charge anything if there were zero bytes processed
125127
if (s_logger.isDebugEnabled()) {
126128
s_logger.debug("No usage record (0 bytes used) generated for account: " + account.getId());
127129
}
128130
}
129131
}
132+
try {
133+
m_usageDao.saveUsageRecords(usageRecords);
134+
} catch (Exception ex) {
135+
s_logger.error("Exception in usage manager", ex);
136+
}
130137

131138
return true;
132139
}

usage/src/com/cloud/usage/parser/VmDiskUsageParser.java

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
// under the License.
1717
package com.cloud.usage.parser;
1818

19+
import java.util.ArrayList;
1920
import java.util.Date;
2021
import java.util.HashMap;
2122
import java.util.List;
@@ -93,6 +94,7 @@ public static boolean parse(AccountVO account, Date startDate, Date endDate) {
9394
vmDiskUsageByZone.put(key, new VmDiskInfo(zoneId, usageVmDisk.getVmId(), usageVmDisk.getVolumeId(), ioRead, ioWrite, bytesRead, bytesWrite));
9495
}
9596

97+
List<UsageVO> usageRecords = new ArrayList<UsageVO>();
9698
for (String key : vmDiskUsageByZone.keySet()) {
9799
VmDiskInfo vmDiskInfo = vmDiskUsageByZone.get(key);
98100
long ioRead = vmDiskInfo.getIORead();
@@ -107,44 +109,45 @@ public static boolean parse(AccountVO account, Date startDate, Date endDate) {
107109
}
108110

109111
Long vmId = null;
112+
Long volumeId = null;
110113

111114
// Create the usage record for bytes read
112115
String usageDesc = "disk bytes read";
113-
if(vmDiskInfo.getVmId() != 0){
116+
if ((vmDiskInfo.getVmId() != 0) && (vmDiskInfo.getVolumeId() != 0)){
114117
vmId = vmDiskInfo.getVmId();
115-
usageDesc += " for Vm: "+vmDiskInfo.getVmId()+" and Volume: "+ vmDiskInfo.getVolumeId();
118+
volumeId = vmDiskInfo.getVolumeId();
119+
usageDesc += " for Vm: " + vmId + " and Volume: " + volumeId;
116120
}
117121
UsageVO usageRecord = new UsageVO(vmDiskInfo.getZoneId(), account.getId(), account.getDomainId(), usageDesc, ioRead + " io read",
118-
UsageTypes.VM_DISK_IO_READ, new Double(ioRead), vmId, "VirtualMachine", vmDiskInfo.getVolumeId(), startDate, endDate);
119-
m_usageDao.persist(usageRecord);
122+
UsageTypes.VM_DISK_IO_READ, new Double(ioRead), vmId, null, null, null, vmDiskInfo.getVolumeId(), startDate, endDate, "VirtualMachine");
123+
usageRecords.add(usageRecord);
120124

121125
// Create the usage record for bytes write
122126
usageDesc = "disk bytes write";
123-
if(vmDiskInfo.getVmId() != 0){
124-
usageDesc += " for Vm: "+vmDiskInfo.getVmId()+" and Volume: "+ vmDiskInfo.getVolumeId();
127+
if ((vmDiskInfo.getVmId() != 0) && (vmDiskInfo.getVolumeId() != 0)){
128+
usageDesc += " for Vm: " + vmId + " and Volume: " + volumeId;
125129
}
126130
usageRecord = new UsageVO(vmDiskInfo.getZoneId(), account.getId(), account.getDomainId(), usageDesc, ioWrite + " io write",
127-
UsageTypes.VM_DISK_BYTES_WRITE, new Double(ioWrite), vmId, "VirtualMachine", vmDiskInfo.getVolumeId(), startDate, endDate);
128-
m_usageDao.persist(usageRecord);
131+
UsageTypes.VM_DISK_BYTES_WRITE, new Double(ioWrite), vmId, null, null, null, vmDiskInfo.getVolumeId(), startDate, endDate, "VirtualMachine");
132+
usageRecords.add(usageRecord);
129133

130134
// Create the usage record for bytes read
131135
usageDesc = "disk bytes read";
132-
if(vmDiskInfo.getVmId() != 0){
133-
vmId = vmDiskInfo.getVmId();
134-
usageDesc += " for Vm: "+vmDiskInfo.getVmId()+" and Volume: "+ vmDiskInfo.getVolumeId();
136+
if ((vmDiskInfo.getVmId() != 0) && (vmDiskInfo.getVolumeId() != 0)){
137+
usageDesc += " for Vm: " + vmId + " and Volume: " + volumeId;
135138
}
136139
usageRecord = new UsageVO(vmDiskInfo.getZoneId(), account.getId(), account.getDomainId(), usageDesc, bytesRead + " bytes read",
137-
UsageTypes.VM_DISK_BYTES_READ, new Double(bytesRead), vmId, "VirtualMachine", vmDiskInfo.getVolumeId(), startDate, endDate);
138-
m_usageDao.persist(usageRecord);
140+
UsageTypes.VM_DISK_BYTES_READ, new Double(bytesRead), vmId, null, null, null, vmDiskInfo.getVolumeId(), startDate, endDate, "VirtualMachine");
141+
usageRecords.add(usageRecord);
139142

140143
// Create the usage record for bytes write
141144
usageDesc = "disk bytes write";
142-
if(vmDiskInfo.getVmId() != 0){
143-
usageDesc += " for Vm: "+vmDiskInfo.getVmId()+" and Volume: "+ vmDiskInfo.getVolumeId();
145+
if ((vmDiskInfo.getVmId() != 0) && (vmDiskInfo.getVolumeId() != 0)){
146+
usageDesc += " for Vm: " + vmId + " and Volume: " + volumeId;
144147
}
145148
usageRecord = new UsageVO(vmDiskInfo.getZoneId(), account.getId(), account.getDomainId(), usageDesc, bytesWrite + " bytes write",
146-
UsageTypes.VM_DISK_BYTES_WRITE, new Double(bytesWrite), vmId, "VirtualMachine", vmDiskInfo.getVolumeId(), startDate, endDate);
147-
m_usageDao.persist(usageRecord);
149+
UsageTypes.VM_DISK_BYTES_WRITE, new Double(bytesWrite), vmId, null, null, null, vmDiskInfo.getVolumeId(), startDate, endDate, "VirtualMachine");
150+
usageRecords.add(usageRecord);
148151

149152
} else {
150153
// Don't charge anything if there were zero bytes processed
@@ -154,6 +157,12 @@ public static boolean parse(AccountVO account, Date startDate, Date endDate) {
154157
}
155158
}
156159

160+
try {
161+
m_usageDao.saveUsageRecords(usageRecords);
162+
} catch (Exception ex) {
163+
s_logger.error("Exception in usage manager", ex);
164+
}
165+
157166
return true;
158167
}
159168

0 commit comments

Comments
 (0)