You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by we...@apache.org on 2013/06/10 15:01:19 UTC
[3/4] git commit: updated refs/heads/master to 50dc67b
CLOUDSTACK-2707: use executeBatch instead of persist in Usage Server
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/76ce3044
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/76ce3044
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/76ce3044
Branch: refs/heads/master
Commit: 76ce304411259dc4a29e0e070de829b79b46efe2
Parents: c2b20a4
Author: Wei Zhou <w....@leaseweb.com>
Authored: Mon Jun 10 15:00:08 2013 +0200
Committer: Wei Zhou <w....@leaseweb.com>
Committed: Mon Jun 10 15:00:08 2013 +0200
----------------------------------------------------------------------
.../src/com/cloud/usage/dao/UsageDao.java | 5 +-
.../src/com/cloud/usage/dao/UsageDaoImpl.java | 64 ++++++++++++++++++++
server/src/com/cloud/api/ApiResponseHelper.java | 4 +-
.../cloud/usage/parser/NetworkUsageParser.java | 11 +++-
.../cloud/usage/parser/VmDiskUsageParser.java | 43 +++++++------
5 files changed, 104 insertions(+), 23 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/76ce3044/engine/schema/src/com/cloud/usage/dao/UsageDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/usage/dao/UsageDao.java b/engine/schema/src/com/cloud/usage/dao/UsageDao.java
index 8a80655..f571b63 100644
--- a/engine/schema/src/com/cloud/usage/dao/UsageDao.java
+++ b/engine/schema/src/com/cloud/usage/dao/UsageDao.java
@@ -38,6 +38,7 @@ public interface UsageDao extends GenericDao<UsageVO, Long> {
Long getLastUserStatsId();
List<Long> listPublicTemplatesByAccount(long accountId);
Long getLastVmDiskStatsId();
- void updateVmDiskStats(List<VmDiskStatisticsVO> vmNetStats);
- void saveVmDiskStats(List<VmDiskStatisticsVO> vmNetStats);
+ void updateVmDiskStats(List<VmDiskStatisticsVO> vmDiskStats);
+ void saveVmDiskStats(List<VmDiskStatisticsVO> vmDiskStats);
+ void saveUsageRecords(List<UsageVO> usageRecords);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/76ce3044/engine/schema/src/com/cloud/usage/dao/UsageDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/usage/dao/UsageDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageDaoImpl.java
index f7d5069..2237d56 100644
--- a/engine/schema/src/com/cloud/usage/dao/UsageDaoImpl.java
+++ b/engine/schema/src/com/cloud/usage/dao/UsageDaoImpl.java
@@ -18,6 +18,7 @@ package com.cloud.usage.dao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
+import java.sql.Timestamp;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Date;
@@ -63,6 +64,8 @@ public class UsageDaoImpl extends GenericDaoBase<UsageVO, Long> implements Usage
" VALUES (?,?,?,?,?,?,?,?,?,?, ?, ?, ?, ?,?, ?, ?)";
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=?, " +
"net_bytes_read=?, net_bytes_write=?, current_bytes_read=?, current_bytes_write=?, agg_bytes_read=?, agg_bytes_write=? WHERE id=?";
+ 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, " +
+ "usage_id, type, size, network_id, start_date, end_date) VALUES (?,?,?,?,?,?,?,?,?, ?, ?, ?,?,?,?,?,?)";
protected final static TimeZone s_gmtTimeZone = TimeZone.getTimeZone("GMT");
@@ -375,4 +378,65 @@ public class UsageDaoImpl extends GenericDaoBase<UsageVO, Long> implements Usage
}
}
+
+ @Override
+ public void saveUsageRecords(List<UsageVO> usageRecords) {
+ Transaction txn = Transaction.currentTxn();
+ try {
+ txn.start();
+ String sql = INSERT_USGAE_RECORDS;
+ PreparedStatement pstmt = null;
+ pstmt = txn.prepareAutoCloseStatement(sql); // in reality I just want CLOUD_USAGE dataSource connection
+ for (UsageVO usageRecord : usageRecords) {
+ pstmt.setLong(1, usageRecord.getZoneId());
+ pstmt.setLong(2, usageRecord.getAccountId());
+ pstmt.setLong(3, usageRecord.getDomainId());
+ pstmt.setString(4, usageRecord.getDescription());
+ pstmt.setString(5, usageRecord.getUsageDisplay());
+ pstmt.setInt(6, usageRecord.getUsageType());
+ pstmt.setDouble(7, usageRecord.getRawUsage());
+ if(usageRecord.getVmInstanceId() != null){
+ pstmt.setLong(8, usageRecord.getVmInstanceId());
+ } else {
+ pstmt.setNull(8, Types.BIGINT);
+ }
+ pstmt.setString(9, usageRecord.getVmName());
+ if(usageRecord.getOfferingId() != null){
+ pstmt.setLong(10, usageRecord.getOfferingId());
+ } else {
+ pstmt.setNull(10, Types.BIGINT);
+ }
+ if(usageRecord.getTemplateId() != null){
+ pstmt.setLong(11, usageRecord.getTemplateId());
+ } else {
+ pstmt.setNull(11, Types.BIGINT);
+ }
+ if(usageRecord.getUsageId() != null){
+ pstmt.setLong(12, usageRecord.getUsageId());
+ } else {
+ pstmt.setNull(12, Types.BIGINT);
+ }
+ pstmt.setString(13, usageRecord.getType());
+ if(usageRecord.getSize() != null){
+ pstmt.setLong(14, usageRecord.getSize());
+ } else {
+ pstmt.setNull(14, Types.BIGINT);
+ }
+ if(usageRecord.getNetworkId() != null){
+ pstmt.setLong(15, usageRecord.getNetworkId());
+ } else {
+ pstmt.setNull(15, Types.BIGINT);
+ }
+ pstmt.setTimestamp(16, new Timestamp(usageRecord.getStartDate().getTime()));
+ pstmt.setTimestamp(17, new Timestamp(usageRecord.getEndDate().getTime()));
+ pstmt.addBatch();
+ }
+ pstmt.executeBatch();
+ txn.commit();
+ } catch (Exception ex) {
+ txn.rollback();
+ s_logger.error("error saving usage records to cloud_usage db", ex);
+ throw new CloudRuntimeException(ex.getMessage());
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/76ce3044/server/src/com/cloud/api/ApiResponseHelper.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java
index bcc1605..0c98abc 100755
--- a/server/src/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/com/cloud/api/ApiResponseHelper.java
@@ -3404,8 +3404,8 @@ public class ApiResponseHelper implements ResponseGenerator {
//Device Type
usageRecResponse.setType(usageRecord.getType());
//VM Instance Id
- VMInstanceVO vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getUsageId().toString());
- usageRecResponse.setUsageId(vm.getUuid());
+ VMInstanceVO vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getVmInstanceId().toString());
+ usageRecResponse.setVirtualMachineId(vm.getUuid());
//Volume ID
VolumeVO volume = _entityMgr.findByIdIncludingRemoved(VolumeVO.class, usageRecord.getUsageId().toString());
usageRecResponse.setUsageId(volume.getUuid());
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/76ce3044/usage/src/com/cloud/usage/parser/NetworkUsageParser.java
----------------------------------------------------------------------
diff --git a/usage/src/com/cloud/usage/parser/NetworkUsageParser.java b/usage/src/com/cloud/usage/parser/NetworkUsageParser.java
index 3da6854..f2f24e4 100644
--- a/usage/src/com/cloud/usage/parser/NetworkUsageParser.java
+++ b/usage/src/com/cloud/usage/parser/NetworkUsageParser.java
@@ -16,6 +16,7 @@
// under the License.
package com.cloud.usage.parser;
+import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@@ -89,6 +90,7 @@ public static final Logger s_logger = Logger.getLogger(NetworkUsageParser.class.
networkUsageByZone.put(key, new NetworkInfo(zoneId, usageNetwork.getHostId(), usageNetwork.getHostType(), usageNetwork.getNetworkId(), bytesSent, bytesReceived));
}
+ List<UsageVO> usageRecords = new ArrayList<UsageVO>();
for (String key : networkUsageByZone.keySet()) {
NetworkInfo networkInfo = networkUsageByZone.get(key);
long totalBytesSent = networkInfo.getBytesSent();
@@ -110,7 +112,7 @@ public static final Logger s_logger = Logger.getLogger(NetworkUsageParser.class.
}
UsageVO usageRecord = new UsageVO(networkInfo.getZoneId(), account.getId(), account.getDomainId(), usageDesc, totalBytesSent + " bytes sent",
UsageTypes.NETWORK_BYTES_SENT, new Double(totalBytesSent), hostId, networkInfo.getHostType(), networkInfo.getNetworkId(), startDate, endDate);
- m_usageDao.persist(usageRecord);
+ usageRecords.add(usageRecord);
// Create the usage record for bytes received
usageDesc = "network bytes received";
@@ -119,7 +121,7 @@ public static final Logger s_logger = Logger.getLogger(NetworkUsageParser.class.
}
usageRecord = new UsageVO(networkInfo.getZoneId(), account.getId(), account.getDomainId(), usageDesc, totalBytesReceived + " bytes received",
UsageTypes.NETWORK_BYTES_RECEIVED, new Double(totalBytesReceived), hostId, networkInfo.getHostType(), networkInfo.getNetworkId(), startDate, endDate);
- m_usageDao.persist(usageRecord);
+ usageRecords.add(usageRecord);
} else {
// Don't charge anything if there were zero bytes processed
if (s_logger.isDebugEnabled()) {
@@ -127,6 +129,11 @@ public static final Logger s_logger = Logger.getLogger(NetworkUsageParser.class.
}
}
}
+ try {
+ m_usageDao.saveUsageRecords(usageRecords);
+ } catch (Exception ex) {
+ s_logger.error("Exception in usage manager", ex);
+ }
return true;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/76ce3044/usage/src/com/cloud/usage/parser/VmDiskUsageParser.java
----------------------------------------------------------------------
diff --git a/usage/src/com/cloud/usage/parser/VmDiskUsageParser.java b/usage/src/com/cloud/usage/parser/VmDiskUsageParser.java
index b8a5f98..74fa214 100644
--- a/usage/src/com/cloud/usage/parser/VmDiskUsageParser.java
+++ b/usage/src/com/cloud/usage/parser/VmDiskUsageParser.java
@@ -16,6 +16,7 @@
// under the License.
package com.cloud.usage.parser;
+import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@@ -93,6 +94,7 @@ public static final Logger s_logger = Logger.getLogger(VmDiskUsageParser.class.g
vmDiskUsageByZone.put(key, new VmDiskInfo(zoneId, usageVmDisk.getVmId(), usageVmDisk.getVolumeId(), ioRead, ioWrite, bytesRead, bytesWrite));
}
+ List<UsageVO> usageRecords = new ArrayList<UsageVO>();
for (String key : vmDiskUsageByZone.keySet()) {
VmDiskInfo vmDiskInfo = vmDiskUsageByZone.get(key);
long ioRead = vmDiskInfo.getIORead();
@@ -107,44 +109,45 @@ public static final Logger s_logger = Logger.getLogger(VmDiskUsageParser.class.g
}
Long vmId = null;
+ Long volumeId = null;
// Create the usage record for bytes read
String usageDesc = "disk bytes read";
- if(vmDiskInfo.getVmId() != 0){
+ if ((vmDiskInfo.getVmId() != 0) && (vmDiskInfo.getVolumeId() != 0)){
vmId = vmDiskInfo.getVmId();
- usageDesc += " for Vm: "+vmDiskInfo.getVmId()+" and Volume: "+ vmDiskInfo.getVolumeId();
+ volumeId = vmDiskInfo.getVolumeId();
+ usageDesc += " for Vm: " + vmId + " and Volume: " + volumeId;
}
UsageVO usageRecord = new UsageVO(vmDiskInfo.getZoneId(), account.getId(), account.getDomainId(), usageDesc, ioRead + " io read",
- UsageTypes.VM_DISK_IO_READ, new Double(ioRead), vmId, "VirtualMachine", vmDiskInfo.getVolumeId(), startDate, endDate);
- m_usageDao.persist(usageRecord);
+ UsageTypes.VM_DISK_IO_READ, new Double(ioRead), vmId, null, null, null, vmDiskInfo.getVolumeId(), startDate, endDate, "VirtualMachine");
+ usageRecords.add(usageRecord);
// Create the usage record for bytes write
usageDesc = "disk bytes write";
- if(vmDiskInfo.getVmId() != 0){
- usageDesc += " for Vm: "+vmDiskInfo.getVmId()+" and Volume: "+ vmDiskInfo.getVolumeId();
+ if ((vmDiskInfo.getVmId() != 0) && (vmDiskInfo.getVolumeId() != 0)){
+ usageDesc += " for Vm: " + vmId + " and Volume: " + volumeId;
}
usageRecord = new UsageVO(vmDiskInfo.getZoneId(), account.getId(), account.getDomainId(), usageDesc, ioWrite + " io write",
- UsageTypes.VM_DISK_BYTES_WRITE, new Double(ioWrite), vmId, "VirtualMachine", vmDiskInfo.getVolumeId(), startDate, endDate);
- m_usageDao.persist(usageRecord);
+ UsageTypes.VM_DISK_BYTES_WRITE, new Double(ioWrite), vmId, null, null, null, vmDiskInfo.getVolumeId(), startDate, endDate, "VirtualMachine");
+ usageRecords.add(usageRecord);
// Create the usage record for bytes read
usageDesc = "disk bytes read";
- if(vmDiskInfo.getVmId() != 0){
- vmId = vmDiskInfo.getVmId();
- usageDesc += " for Vm: "+vmDiskInfo.getVmId()+" and Volume: "+ vmDiskInfo.getVolumeId();
+ if ((vmDiskInfo.getVmId() != 0) && (vmDiskInfo.getVolumeId() != 0)){
+ usageDesc += " for Vm: " + vmId + " and Volume: " + volumeId;
}
usageRecord = new UsageVO(vmDiskInfo.getZoneId(), account.getId(), account.getDomainId(), usageDesc, bytesRead + " bytes read",
- UsageTypes.VM_DISK_BYTES_READ, new Double(bytesRead), vmId, "VirtualMachine", vmDiskInfo.getVolumeId(), startDate, endDate);
- m_usageDao.persist(usageRecord);
+ UsageTypes.VM_DISK_BYTES_READ, new Double(bytesRead), vmId, null, null, null, vmDiskInfo.getVolumeId(), startDate, endDate, "VirtualMachine");
+ usageRecords.add(usageRecord);
// Create the usage record for bytes write
usageDesc = "disk bytes write";
- if(vmDiskInfo.getVmId() != 0){
- usageDesc += " for Vm: "+vmDiskInfo.getVmId()+" and Volume: "+ vmDiskInfo.getVolumeId();
+ if ((vmDiskInfo.getVmId() != 0) && (vmDiskInfo.getVolumeId() != 0)){
+ usageDesc += " for Vm: " + vmId + " and Volume: " + volumeId;
}
usageRecord = new UsageVO(vmDiskInfo.getZoneId(), account.getId(), account.getDomainId(), usageDesc, bytesWrite + " bytes write",
- UsageTypes.VM_DISK_BYTES_WRITE, new Double(bytesWrite), vmId, "VirtualMachine", vmDiskInfo.getVolumeId(), startDate, endDate);
- m_usageDao.persist(usageRecord);
+ UsageTypes.VM_DISK_BYTES_WRITE, new Double(bytesWrite), vmId, null, null, null, vmDiskInfo.getVolumeId(), startDate, endDate, "VirtualMachine");
+ usageRecords.add(usageRecord);
} else {
// Don't charge anything if there were zero bytes processed
@@ -154,6 +157,12 @@ public static final Logger s_logger = Logger.getLogger(VmDiskUsageParser.class.g
}
}
+ try {
+ m_usageDao.saveUsageRecords(usageRecords);
+ } catch (Exception ex) {
+ s_logger.error("Exception in usage manager", ex);
+ }
+
return true;
}