forked from Qortal/qortal
"blockCacheSize" can now be configured via settings.json.
This commit is contained in:
parent
0c7e388463
commit
427fa1816d
@ -143,7 +143,6 @@ public class Controller extends Thread {
|
|||||||
private ExecutorService callbackExecutor = Executors.newFixedThreadPool(3);
|
private ExecutorService callbackExecutor = Executors.newFixedThreadPool(3);
|
||||||
private volatile boolean notifyGroupMembershipChange = false;
|
private volatile boolean notifyGroupMembershipChange = false;
|
||||||
|
|
||||||
private static final int BLOCK_CACHE_SIZE = 10; // To cover typical Synchronizer request + a few spare
|
|
||||||
/** Latest blocks on our chain. Note: tail/last is the latest block. */
|
/** Latest blocks on our chain. Note: tail/last is the latest block. */
|
||||||
private final Deque<BlockData> latestBlocks = new LinkedList<>();
|
private final Deque<BlockData> latestBlocks = new LinkedList<>();
|
||||||
|
|
||||||
@ -152,7 +151,7 @@ public class Controller extends Thread {
|
|||||||
private final LinkedHashMap<ByteArray, BlockMessage> blockMessageCache = new LinkedHashMap<>() {
|
private final LinkedHashMap<ByteArray, BlockMessage> blockMessageCache = new LinkedHashMap<>() {
|
||||||
@Override
|
@Override
|
||||||
protected boolean removeEldestEntry(Map.Entry<ByteArray, BlockMessage> eldest) {
|
protected boolean removeEldestEntry(Map.Entry<ByteArray, BlockMessage> eldest) {
|
||||||
return this.size() > BLOCK_CACHE_SIZE;
|
return this.size() > Settings.getInstance().getBlockCacheSize();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -319,11 +318,12 @@ public class Controller extends Thread {
|
|||||||
// Set initial chain height/tip
|
// Set initial chain height/tip
|
||||||
try (final Repository repository = RepositoryManager.getRepository()) {
|
try (final Repository repository = RepositoryManager.getRepository()) {
|
||||||
BlockData blockData = repository.getBlockRepository().getLastBlock();
|
BlockData blockData = repository.getBlockRepository().getLastBlock();
|
||||||
|
int blockCacheSize = Settings.getInstance().getBlockCacheSize();
|
||||||
|
|
||||||
synchronized (this.latestBlocks) {
|
synchronized (this.latestBlocks) {
|
||||||
this.latestBlocks.clear();
|
this.latestBlocks.clear();
|
||||||
|
|
||||||
for (int i = 0; i < BLOCK_CACHE_SIZE && blockData != null; ++i) {
|
for (int i = 0; i < blockCacheSize && blockData != null; ++i) {
|
||||||
this.latestBlocks.addFirst(blockData);
|
this.latestBlocks.addFirst(blockData);
|
||||||
blockData = repository.getBlockRepository().fromHeight(blockData.getHeight() - 1);
|
blockData = repository.getBlockRepository().fromHeight(blockData.getHeight() - 1);
|
||||||
}
|
}
|
||||||
@ -933,6 +933,7 @@ public class Controller extends Thread {
|
|||||||
public void onNewBlock(BlockData latestBlockData) {
|
public void onNewBlock(BlockData latestBlockData) {
|
||||||
// Protective copy
|
// Protective copy
|
||||||
BlockData blockDataCopy = new BlockData(latestBlockData);
|
BlockData blockDataCopy = new BlockData(latestBlockData);
|
||||||
|
int blockCacheSize = Settings.getInstance().getBlockCacheSize();
|
||||||
|
|
||||||
synchronized (this.latestBlocks) {
|
synchronized (this.latestBlocks) {
|
||||||
BlockData cachedChainTip = this.latestBlocks.peekLast();
|
BlockData cachedChainTip = this.latestBlocks.peekLast();
|
||||||
@ -942,7 +943,7 @@ public class Controller extends Thread {
|
|||||||
this.latestBlocks.addLast(latestBlockData);
|
this.latestBlocks.addLast(latestBlockData);
|
||||||
|
|
||||||
// Trim if necessary
|
// Trim if necessary
|
||||||
if (this.latestBlocks.size() >= BLOCK_CACHE_SIZE)
|
if (this.latestBlocks.size() >= blockCacheSize)
|
||||||
this.latestBlocks.pollFirst();
|
this.latestBlocks.pollFirst();
|
||||||
} else {
|
} else {
|
||||||
if (cachedChainTip != null)
|
if (cachedChainTip != null)
|
||||||
@ -1151,6 +1152,7 @@ public class Controller extends Thread {
|
|||||||
ByteArray signatureAsByteArray = new ByteArray(signature);
|
ByteArray signatureAsByteArray = new ByteArray(signature);
|
||||||
|
|
||||||
BlockMessage cachedBlockMessage = this.blockMessageCache.get(signatureAsByteArray);
|
BlockMessage cachedBlockMessage = this.blockMessageCache.get(signatureAsByteArray);
|
||||||
|
int blockCacheSize = Settings.getInstance().getBlockCacheSize();
|
||||||
|
|
||||||
// Check cached latest block message
|
// Check cached latest block message
|
||||||
if (cachedBlockMessage != null) {
|
if (cachedBlockMessage != null) {
|
||||||
@ -1193,7 +1195,7 @@ public class Controller extends Thread {
|
|||||||
peer.disconnect("failed to send block");
|
peer.disconnect("failed to send block");
|
||||||
|
|
||||||
// If request is for a recent block, cache it
|
// If request is for a recent block, cache it
|
||||||
if (getChainHeight() - blockData.getHeight() <= BLOCK_CACHE_SIZE) {
|
if (getChainHeight() - blockData.getHeight() <= blockCacheSize) {
|
||||||
this.stats.getBlockMessageStats.cacheFills.incrementAndGet();
|
this.stats.getBlockMessageStats.cacheFills.incrementAndGet();
|
||||||
|
|
||||||
this.blockMessageCache.put(new ByteArray(blockData.getSignature()), blockMessage);
|
this.blockMessageCache.put(new ByteArray(blockData.getSignature()), blockMessage);
|
||||||
|
@ -89,6 +89,8 @@ public class Settings {
|
|||||||
private long repositoryCheckpointInterval = 60 * 60 * 1000L; // 1 hour (ms) default
|
private long repositoryCheckpointInterval = 60 * 60 * 1000L; // 1 hour (ms) default
|
||||||
/** Whether to show a notification when we perform repository 'checkpoint'. */
|
/** Whether to show a notification when we perform repository 'checkpoint'. */
|
||||||
private boolean showCheckpointNotification = false;
|
private boolean showCheckpointNotification = false;
|
||||||
|
/* How many blocks to cache locally. Defaulted to 10, which covers a typical Synchronizer request + a few spare */
|
||||||
|
private int blockCacheSize = 10;
|
||||||
|
|
||||||
/** How long to keep old, full, AT state data (ms). */
|
/** How long to keep old, full, AT state data (ms). */
|
||||||
private long atStatesMaxLifetime = 2 * 7 * 24 * 60 * 60 * 1000L; // milliseconds
|
private long atStatesMaxLifetime = 2 * 7 * 24 * 60 * 60 * 1000L; // milliseconds
|
||||||
@ -361,6 +363,10 @@ public class Settings {
|
|||||||
return this.maxTransactionTimestampFuture;
|
return this.maxTransactionTimestampFuture;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getBlockCacheSize() {
|
||||||
|
return this.blockCacheSize;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isTestNet() {
|
public boolean isTestNet() {
|
||||||
return this.isTestNet;
|
return this.isTestNet;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user