Skip to content

Commit 4d045db

Browse files
winterhazeldhslove
authored andcommitted
Backport apache#9888 to 4.19: Fix Usage inconsistencies (apache#10712)
1 parent 71b051a commit 4d045db

File tree

5 files changed

+114
-22
lines changed

5 files changed

+114
-22
lines changed

engine/schema/src/main/java/com/cloud/usage/dao/UsageNetworksDao.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,6 @@ public interface UsageNetworksDao extends GenericDao<UsageNetworksVO, Long> {
2828
void remove(long networkId, Date removed);
2929

3030
List<UsageNetworksVO> getUsageRecords(Long accountId, Date startDate, Date endDate);
31+
32+
List<UsageNetworksVO> listAll(long networkId);
3133
}

engine/schema/src/main/java/com/cloud/usage/dao/UsageNetworksDaoImpl.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,15 @@
1919
import com.cloud.usage.UsageNetworksVO;
2020
import com.cloud.utils.DateUtil;
2121
import com.cloud.utils.db.GenericDaoBase;
22+
import com.cloud.utils.db.SearchBuilder;
2223
import com.cloud.utils.db.SearchCriteria;
2324
import com.cloud.utils.db.TransactionLegacy;
2425

2526
import org.springframework.stereotype.Component;
2627
import org.apache.logging.log4j.LogManager;
2728
import org.apache.logging.log4j.Logger;
2829

30+
import javax.annotation.PostConstruct;
2931
import java.sql.PreparedStatement;
3032
import java.sql.ResultSet;
3133
import java.util.ArrayList;
@@ -40,6 +42,14 @@ public class UsageNetworksDaoImpl extends GenericDaoBase<UsageNetworksVO, Long>
4042
" account_id = ? AND ((removed IS NULL AND created <= ?) OR (created BETWEEN ? AND ?) OR (removed BETWEEN ? AND ?) " +
4143
" OR ((created <= ?) AND (removed >= ?)))";
4244

45+
private SearchBuilder<UsageNetworksVO> usageNetworksSearch;
46+
47+
@PostConstruct
48+
public void init() {
49+
usageNetworksSearch = createSearchBuilder();
50+
usageNetworksSearch.and("networkId", usageNetworksSearch.entity().getNetworkId(), SearchCriteria.Op.EQ);
51+
usageNetworksSearch.done();
52+
}
4353

4454
@Override
4555
public void update(long networkId, long newNetworkOffering, String state) {
@@ -131,4 +141,11 @@ public List<UsageNetworksVO> getUsageRecords(Long accountId, Date startDate, Dat
131141

132142
return usageRecords;
133143
}
144+
145+
@Override
146+
public List<UsageNetworksVO> listAll(long networkId) {
147+
SearchCriteria<UsageNetworksVO> sc = usageNetworksSearch.create();
148+
sc.setParameters("networkId", networkId);
149+
return listBy(sc);
150+
}
134151
}

engine/schema/src/main/java/com/cloud/usage/dao/UsageVpcDao.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@
2424

2525
public interface UsageVpcDao extends GenericDao<UsageVpcVO, Long> {
2626
void update(UsageVpcVO usage);
27+
2728
void remove(long vpcId, Date removed);
29+
2830
List<UsageVpcVO> getUsageRecords(Long accountId, Date startDate, Date endDate);
31+
32+
List<UsageVpcVO> listAll(long vpcId);
2933
}

engine/schema/src/main/java/com/cloud/usage/dao/UsageVpcDaoImpl.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@
1919
import com.cloud.usage.UsageVpcVO;
2020
import com.cloud.utils.DateUtil;
2121
import com.cloud.utils.db.GenericDaoBase;
22+
import com.cloud.utils.db.SearchBuilder;
2223
import com.cloud.utils.db.SearchCriteria;
2324
import com.cloud.utils.db.TransactionLegacy;
2425
import org.springframework.stereotype.Component;
2526

27+
import javax.annotation.PostConstruct;
2628
import java.sql.PreparedStatement;
2729
import java.sql.ResultSet;
2830
import java.util.ArrayList;
@@ -36,6 +38,15 @@ public class UsageVpcDaoImpl extends GenericDaoBase<UsageVpcVO, Long> implements
3638
" account_id = ? AND ((removed IS NULL AND created <= ?) OR (created BETWEEN ? AND ?) OR (removed BETWEEN ? AND ?) " +
3739
" OR ((created <= ?) AND (removed >= ?)))";
3840

41+
private SearchBuilder<UsageVpcVO> usageVpcSearch;
42+
43+
@PostConstruct
44+
public void init() {
45+
usageVpcSearch = createSearchBuilder();
46+
usageVpcSearch.and("vpcId", usageVpcSearch.entity().getVpcId(), SearchCriteria.Op.EQ);
47+
usageVpcSearch.done();
48+
}
49+
3950
@Override
4051
public void update(UsageVpcVO usage) {
4152
TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
@@ -124,4 +135,11 @@ public List<UsageVpcVO> getUsageRecords(Long accountId, Date startDate, Date end
124135

125136
return usageRecords;
126137
}
138+
139+
@Override
140+
public List<UsageVpcVO> listAll(long vpcId) {
141+
SearchCriteria<UsageVpcVO> sc = usageVpcSearch.create();
142+
sc.setParameters("vpcId", vpcId);
143+
return listBy(sc);
144+
}
127145
}

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

Lines changed: 73 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2151,39 +2151,90 @@ private void createBackupEvent(final UsageEventVO event) {
21512151
}
21522152

21532153
private void handleNetworkEvent(UsageEventVO event) {
2154+
String eventType = event.getType();
2155+
if (EventTypes.EVENT_NETWORK_DELETE.equals(eventType)) {
2156+
removeNetworkHelperEntry(event);
2157+
} else if (EventTypes.EVENT_NETWORK_CREATE.equals(eventType)) {
2158+
createNetworkHelperEntry(event);
2159+
} else if (EventTypes.EVENT_NETWORK_UPDATE.equals(eventType)) {
2160+
updateNetworkHelperEntry(event);
2161+
} else {
2162+
logger.error(String.format("Unknown event type [%s] in Networks event parser. Skipping it.", eventType));
2163+
}
2164+
}
2165+
2166+
private void removeNetworkHelperEntry(UsageEventVO event) {
2167+
long networkId = event.getResourceId();
2168+
logger.debug(String.format("Removing helper entries of network [%s].", networkId));
2169+
usageNetworksDao.remove(networkId, event.getCreateDate());
2170+
}
2171+
2172+
private void createNetworkHelperEntry(UsageEventVO event) {
2173+
long networkId = event.getResourceId();
21542174
Account account = _accountDao.findByIdIncludingRemoved(event.getAccountId());
21552175
long domainId = account.getDomainId();
2156-
if (EventTypes.EVENT_NETWORK_DELETE.equals(event.getType())) {
2157-
usageNetworksDao.remove(event.getResourceId(), event.getCreateDate());
2158-
} else if (EventTypes.EVENT_NETWORK_CREATE.equals(event.getType())) {
2159-
logger.debug("Marking existing helper entries for network [{}] as removed.", event.getResourceId());
2160-
usageNetworksDao.remove(event.getResourceId(), event.getCreateDate());
2161-
logger.debug("Creating a helper entry for network [{}].", event.getResourceId());
2162-
UsageNetworksVO usageNetworksVO = new UsageNetworksVO(event.getResourceId(), event.getOfferingId(), event.getZoneId(), event.getAccountId(), domainId, Network.State.Allocated.name(), event.getCreateDate(), null);
2163-
usageNetworksDao.persist(usageNetworksVO);
2164-
} else if (EventTypes.EVENT_NETWORK_UPDATE.equals(event.getType())) {
2165-
usageNetworksDao.update(event.getResourceId(), event.getOfferingId(), event.getResourceType());
2166-
} else {
2167-
logger.error("Unknown event type [{}] in Networks event parser. Skipping it.", event.getType());
2176+
2177+
List<UsageNetworksVO> entries = usageNetworksDao.listAll(networkId);
2178+
if (!entries.isEmpty()) {
2179+
logger.warn(String.format("Received a NETWORK.CREATE event for a network [%s] that already has helper entries; " +
2180+
"therefore, we will not create a new one.", networkId));
2181+
return;
21682182
}
2183+
2184+
logger.debug(String.format("Creating a helper entry for network [%s].", networkId));
2185+
UsageNetworksVO usageNetworksVO = new UsageNetworksVO(networkId, event.getOfferingId(), event.getZoneId(),
2186+
event.getAccountId(), domainId, Network.State.Allocated.name(), event.getCreateDate(), null);
2187+
usageNetworksDao.persist(usageNetworksVO);
21692188
}
21702189

2171-
private void handleVpcEvent(UsageEventVO event) {
2190+
private void updateNetworkHelperEntry(UsageEventVO event) {
2191+
long networkId = event.getResourceId();
21722192
Account account = _accountDao.findByIdIncludingRemoved(event.getAccountId());
21732193
long domainId = account.getDomainId();
2174-
if (EventTypes.EVENT_VPC_DELETE.equals(event.getType())) {
2175-
usageVpcDao.remove(event.getResourceId(), event.getCreateDate());
2176-
} else if (EventTypes.EVENT_VPC_CREATE.equals(event.getType())) {
2177-
logger.debug("Marking existing helper entries for VPC [{}] as removed.", event.getResourceId());
2178-
usageVpcDao.remove(event.getResourceId(), event.getCreateDate());
2179-
logger.debug("Creating a helper entry for VPC [{}].", event.getResourceId());
2180-
UsageVpcVO usageVPCVO = new UsageVpcVO(event.getResourceId(), event.getZoneId(), event.getAccountId(), domainId, Vpc.State.Enabled.name(), event.getCreateDate(), null);
2181-
usageVpcDao.persist(usageVPCVO);
2194+
2195+
logger.debug(String.format("Marking previous helper entries of network [%s] as removed.", networkId));
2196+
usageNetworksDao.remove(networkId, event.getCreateDate());
2197+
2198+
logger.debug(String.format("Creating an updated helper entry for network [%s].", networkId));
2199+
UsageNetworksVO usageNetworksVO = new UsageNetworksVO(networkId, event.getOfferingId(), event.getZoneId(),
2200+
event.getAccountId(), domainId, event.getResourceType(), event.getCreateDate(), null);
2201+
usageNetworksDao.persist(usageNetworksVO);
2202+
}
2203+
2204+
private void handleVpcEvent(UsageEventVO event) {
2205+
String eventType = event.getType();
2206+
if (EventTypes.EVENT_VPC_DELETE.equals(eventType)) {
2207+
removeVpcHelperEntry(event);
2208+
} else if (EventTypes.EVENT_VPC_CREATE.equals(eventType)) {
2209+
createVpcHelperEntry(event);
21822210
} else {
2183-
logger.error("Unknown event type [{}] in VPC event parser. Skipping it.", event.getType());
2211+
logger.error(String.format("Unknown event type [%s] in VPC event parser. Skipping it.", eventType));
21842212
}
21852213
}
21862214

2215+
private void removeVpcHelperEntry(UsageEventVO event) {
2216+
long vpcId = event.getResourceId();
2217+
logger.debug(String.format("Removing helper entries of VPC [%s].", vpcId));
2218+
usageVpcDao.remove(vpcId, event.getCreateDate());
2219+
}
2220+
2221+
private void createVpcHelperEntry(UsageEventVO event) {
2222+
long vpcId = event.getResourceId();
2223+
Account account = _accountDao.findByIdIncludingRemoved(event.getAccountId());
2224+
long domainId = account.getDomainId();
2225+
2226+
List<UsageVpcVO> entries = usageVpcDao.listAll(vpcId);
2227+
if (!entries.isEmpty()) {
2228+
logger.warn(String.format("Active helper entries already exist for VPC [%s]; therefore, we will not create a new one.",
2229+
vpcId));
2230+
return;
2231+
}
2232+
2233+
logger.debug(String.format("Creating a helper entry for VPC [%s].", vpcId));
2234+
UsageVpcVO usageVPCVO = new UsageVpcVO(vpcId, event.getZoneId(), event.getAccountId(), domainId, Vpc.State.Enabled.name(), event.getCreateDate(), null);
2235+
usageVpcDao.persist(usageVPCVO);
2236+
}
2237+
21872238
private class Heartbeat extends ManagedContextRunnable {
21882239
@Override
21892240
protected void runInContext() {

0 commit comments

Comments
 (0)