Skip to content

Commit

Permalink
Made key collection more efficient
Browse files Browse the repository at this point in the history
  • Loading branch information
Javier Alvarez committed May 30, 2023
1 parent 62c041b commit 33bbf49
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 14 deletions.
2 changes: 0 additions & 2 deletions rskj-core/src/main/java/co/rsk/RskContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -966,8 +966,6 @@ public synchronized List<InternalService> buildInternalServices() {
boolean rpcWebSocketEnabled = getRskSystemProperties().isRpcWebSocketEnabled();
boolean bloomServiceEnabled = getRskSystemProperties().bloomServiceEnabled();

logger.debug("State requester is {}", getRskSystemProperties().isSnapshotSyncEnabled());

if (getRskSystemProperties().isSnapshotSyncEnabled()) {
internalServices.add(getSnapshotProcessor());
}
Expand Down
23 changes: 11 additions & 12 deletions rskj-core/src/main/java/co/rsk/net/SnapshotProcessor.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
import co.rsk.config.InternalService;
import co.rsk.net.messages.StateChunkRequestMessage;
import co.rsk.net.messages.StateChunkResponseMessage;
import co.rsk.trie.IterationElement;
import co.rsk.trie.Trie;
import co.rsk.trie.TrieStore;
import org.ethereum.core.Block;
import org.ethereum.core.Blockchain;
import org.ethereum.db.ByteArrayWrapper;
import org.ethereum.net.NodeHandler;
import org.ethereum.net.NodeManager;
import org.ethereum.net.client.PeerClient;
Expand All @@ -18,10 +18,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.*;

public class SnapshotProcessor implements InternalService {

Expand Down Expand Up @@ -93,14 +90,16 @@ public void processStateChunkRequest(Peer sender, long requestId) {
}

Trie trie = retrieve.get();
List<ByteArrayWrapper> trieKeys = new ArrayList<>(trie.collectKeys(Integer.MAX_VALUE));
int nKeys = Math.min(chunkSize, trieKeys.size());
List<ByteArrayWrapper> sublistOfKeys = trieKeys.subList(0, nKeys);
List<byte[]> trieEncoded = new ArrayList<>();

for (ByteArrayWrapper key : sublistOfKeys) {
byte[] value = trie.get(key.getData());
trieEncoded.add(RLP.encodeList(RLP.encodeElement(key.getData()), RLP.encodeElement(value)));
Iterator<IterationElement> it = trie.getInOrderIterator();
int i = 0;

while (it.hasNext() && i < chunkSize) {
IterationElement e = it.next();
byte[] key = e.getNodeKey().encode();
byte[] value = e.getNode().getValue();
trieEncoded.add(RLP.encodeList(RLP.encodeElement(key), RLP.encodeElement(value)));
i++;
}

byte[] chunkBytes = RLP.encodeList(trieEncoded.toArray(new byte[0][0]));
Expand Down

0 comments on commit 33bbf49

Please sign in to comment.