Skip to content

Commit 3e41f54

Browse files
committed
add log Cache to decrese memory occupy of eth_newFilter
1 parent 0779184 commit 3e41f54

File tree

2 files changed

+58
-6
lines changed

2 files changed

+58
-6
lines changed

framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpc.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.googlecode.jsonrpc4j.JsonRpcMethod;
88
import java.io.IOException;
99
import java.util.List;
10+
import java.util.Objects;
1011
import java.util.concurrent.ExecutionException;
1112
import lombok.AllArgsConstructor;
1213
import lombok.Getter;
@@ -23,6 +24,7 @@
2324
import org.tron.core.exception.jsonrpc.JsonRpcInvalidRequestException;
2425
import org.tron.core.exception.jsonrpc.JsonRpcMethodNotFoundException;
2526
import org.tron.core.exception.jsonrpc.JsonRpcTooManyResultException;
27+
import org.tron.core.net.peer.Item;
2628
import org.tron.core.services.jsonrpc.types.BlockResult;
2729
import org.tron.core.services.jsonrpc.types.BuildArguments;
2830
import org.tron.core.services.jsonrpc.types.CallArguments;
@@ -472,5 +474,39 @@ public LogFilterElement(String blockHash, Long blockNum, String txId, Integer tx
472474
}
473475
this.removed = removed;
474476
}
477+
478+
@Override
479+
public boolean equals(Object o) {
480+
if (this == o) {
481+
return true;
482+
}
483+
if (o == null || this.getClass() != o.getClass()) {
484+
return false;
485+
}
486+
LogFilterElement item = (LogFilterElement) o;
487+
if (!Objects.equals(blockHash, item.blockHash)) {
488+
return false;
489+
}
490+
if (!Objects.equals(transactionHash, item.transactionHash)) {
491+
return false;
492+
}
493+
if (!Objects.equals(transactionIndex, item.transactionIndex)) {
494+
return false;
495+
}
496+
if (!Objects.equals(logIndex, item.logIndex)) {
497+
return false;
498+
}
499+
return removed == item.removed;
500+
}
501+
502+
@Override
503+
public int hashCode() {
504+
int result = blockHash != null ? blockHash.hashCode() : 0;
505+
result = 31 * result + (transactionHash != null ? transactionHash.hashCode() : 0);
506+
result = 31 * result + (transactionIndex != null ? transactionIndex.hashCode() : 0);
507+
result = 31 * result + (logIndex != null ? logIndex.hashCode() : 0);
508+
return result + (removed ? 1 : 0);
509+
}
510+
475511
}
476512
}

framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import static org.tron.core.services.jsonrpc.JsonRpcApiUtil.triggerCallContract;
1212

1313
import com.alibaba.fastjson.JSON;
14+
import com.google.common.cache.Cache;
15+
import com.google.common.cache.CacheBuilder;
1416
import com.google.protobuf.ByteString;
1517
import com.google.protobuf.GeneratedMessageV3;
1618
import java.io.Closeable;
@@ -25,10 +27,10 @@
2527
import java.util.concurrent.ConcurrentHashMap;
2628
import java.util.concurrent.ExecutionException;
2729
import java.util.concurrent.ExecutorService;
30+
import java.util.concurrent.TimeUnit;
2831
import java.util.regex.Pattern;
2932
import lombok.Getter;
3033
import lombok.extern.slf4j.Slf4j;
31-
import org.apache.commons.collections4.CollectionUtils;
3234
import org.apache.commons.lang3.StringUtils;
3335
import org.bouncycastle.util.encoders.Hex;
3436
import org.springframework.beans.factory.annotation.Autowired;
@@ -110,6 +112,10 @@ public enum RequestSource {
110112

111113
private static final String FILTER_NOT_FOUND = "filter not found";
112114
public static final int EXPIRE_SECONDS = 5 * 60;
115+
private static final Cache<Integer, LogFilterElement> logElementCache = CacheBuilder.newBuilder()
116+
.maximumSize(100_000L)
117+
.expireAfterWrite(EXPIRE_SECONDS, TimeUnit.SECONDS)
118+
.recordStats().build(); //LRU cache
113119
/**
114120
* for log filter in Full Json-RPC
115121
*/
@@ -165,7 +171,7 @@ public enum RequestSource {
165171

166172
@Autowired
167173
public TronJsonRpcImpl(@Autowired NodeInfoService nodeInfoService, @Autowired Wallet wallet,
168-
@Autowired Manager manager) {
174+
@Autowired Manager manager) {
169175
this.nodeInfoService = nodeInfoService;
170176
this.wallet = wallet;
171177
this.manager = manager;
@@ -191,6 +197,9 @@ public static void handleBLockFilter(BlockFilterCapsule blockFilterCapsule) {
191197
}
192198
}
193199

200+
/**
201+
* append LogsFilterCapsule's LogFilterElement list to each filter if matched
202+
*/
194203
public static void handleLogsFilter(LogsFilterCapsule logsFilterCapsule) {
195204
Iterator<Entry<String, LogFilterAndResult>> it;
196205

@@ -226,8 +235,15 @@ public static void handleLogsFilter(LogsFilterCapsule logsFilterCapsule) {
226235
LogMatch.matchBlock(logFilter, logsFilterCapsule.getBlockNumber(),
227236
logsFilterCapsule.getBlockHash(), logsFilterCapsule.getTxInfoList(),
228237
logsFilterCapsule.isRemoved());
229-
if (CollectionUtils.isNotEmpty(elements)) {
230-
logFilterAndResult.getResult().addAll(elements);
238+
239+
for (LogFilterElement element : elements) {
240+
LogFilterElement newElement;
241+
try {
242+
newElement = logElementCache.get(element.hashCode(), () -> element);
243+
} catch (ExecutionException e) {
244+
continue;
245+
}
246+
logFilterAndResult.getResult().add(newElement);
231247
}
232248
}
233249
}
@@ -797,7 +813,7 @@ public TransactionReceipt getTransactionReceipt(String txId)
797813
long blockNum = blockCapsule.getNum();
798814
TransactionInfoList transactionInfoList = wallet.getTransactionInfoByBlockNum(blockNum);
799815
long energyFee = wallet.getEnergyFee(blockCapsule.getTimeStamp());
800-
816+
801817
// Find transaction context
802818
TransactionReceipt.TransactionContext context
803819
= findTransactionContext(transactionInfoList,
@@ -806,7 +822,7 @@ public TransactionReceipt getTransactionReceipt(String txId)
806822
if (context == null) {
807823
return null; // Transaction not found in block
808824
}
809-
825+
810826
return new TransactionReceipt(blockCapsule, transactionInfo, context, energyFee);
811827
}
812828

0 commit comments

Comments
 (0)