@@ -80,12 +80,11 @@ public class DefaultBlockchain implements MutableBlockchain {
8080
8181 private Comparator <BlockHeader > blockChoiceRule ;
8282
83- private final int numberOfBlocksToCache ;
84- private final Optional <Cache <Hash , BlockHeader >> blockHeadersCache ;
85- private final Optional <Cache <Hash , BlockBody >> blockBodiesCache ;
86- private final Optional <Cache <Hash , List <TransactionReceipt >>> transactionReceiptsCache ;
87- private final Optional <Cache <Hash , Difficulty >> totalDifficultyCache ;
88- private final Optional <Cache <Hash , BlockAccessList >> blockAccessListCache ;
83+ private Optional <Cache <Hash , BlockHeader >> blockHeadersCache ;
84+ private Optional <Cache <Hash , BlockBody >> blockBodiesCache ;
85+ private Optional <Cache <Hash , List <TransactionReceipt >>> transactionReceiptsCache ;
86+ private Optional <Cache <Hash , Difficulty >> totalDifficultyCache ;
87+ private Optional <Cache <Hash , BlockAccessList >> blockAccessListCache ;
8988
9089 private Counter gasUsedCounter = NoOpMetricsSystem .NO_OP_COUNTER ;
9190 private Counter numberOfTransactionsCounter = NoOpMetricsSystem .NO_OP_COUNTER ;
@@ -97,7 +96,7 @@ private DefaultBlockchain(
9796 final BlockchainStorage blockchainStorage ,
9897 final MetricsSystem metricsSystem ,
9998 final long reorgLoggingThreshold ) {
100- this (genesisBlock , blockchainStorage , metricsSystem , reorgLoggingThreshold , null , 0 );
99+ this (genesisBlock , blockchainStorage , metricsSystem , reorgLoggingThreshold , null , 0 , 0 );
101100 }
102101
103102 private DefaultBlockchain (
@@ -106,7 +105,8 @@ private DefaultBlockchain(
106105 final MetricsSystem metricsSystem ,
107106 final long reorgLoggingThreshold ,
108107 final String dataDirectory ,
109- final int numberOfBlocksToCache ) {
108+ final int numberOfBlocksToCache ,
109+ final int numberOfBlockHeadersToCache ) {
110110 checkNotNull (genesisBlock );
111111 checkNotNull (blockchainStorage );
112112 checkNotNull (metricsSystem );
@@ -127,40 +127,63 @@ private DefaultBlockchain(
127127
128128 this .reorgLoggingThreshold = reorgLoggingThreshold ;
129129 this .blockChoiceRule = heaviestChainBlockChoiceRule ;
130- this .numberOfBlocksToCache = numberOfBlocksToCache ;
131130
132- if (numberOfBlocksToCache != 0 ) {
133- blockHeadersCache =
134- Optional .of (
135- CacheBuilder .newBuilder ().recordStats ().maximumSize (numberOfBlocksToCache ).build ());
131+ initializeCaches (metricsSystem , numberOfBlockHeadersToCache , numberOfBlocksToCache );
132+ createCounters (metricsSystem );
133+ createGauges (metricsSystem );
134+ }
135+
136+ private void initializeCaches (
137+ final MetricsSystem metricsSystem , final int headersCacheSize , final int blocksCacheSize ) {
138+ if (headersCacheSize == 0 && blocksCacheSize == 0 ) {
139+ setAllCachesEmpty ();
140+ return ;
141+ }
142+
143+ final int headersSize = Math .max (headersCacheSize , blocksCacheSize );
144+ blockHeadersCache =
145+ Optional .of (CacheBuilder .newBuilder ().recordStats ().maximumSize (headersSize ).build ());
146+
147+ if (blocksCacheSize != 0 ) {
136148 blockBodiesCache =
137- Optional .of (
138- CacheBuilder .newBuilder ().recordStats ().maximumSize (numberOfBlocksToCache ).build ());
149+ Optional .of (CacheBuilder .newBuilder ().recordStats ().maximumSize (blocksCacheSize ).build ());
139150 transactionReceiptsCache =
140- Optional .of (
141- CacheBuilder .newBuilder ().recordStats ().maximumSize (numberOfBlocksToCache ).build ());
151+ Optional .of (CacheBuilder .newBuilder ().recordStats ().maximumSize (blocksCacheSize ).build ());
142152 totalDifficultyCache =
143- Optional .of (
144- CacheBuilder .newBuilder ().recordStats ().maximumSize (numberOfBlocksToCache ).build ());
153+ Optional .of (CacheBuilder .newBuilder ().recordStats ().maximumSize (blocksCacheSize ).build ());
145154 blockAccessListCache =
146- Optional .of (
147- CacheBuilder .newBuilder ().recordStats ().maximumSize (numberOfBlocksToCache ).build ());
148- metricsSystem .createGuavaCacheCollector (BLOCKCHAIN , "blockHeaders" , blockHeadersCache .get ());
149- metricsSystem .createGuavaCacheCollector (BLOCKCHAIN , "blockBodies" , blockBodiesCache .get ());
150- metricsSystem .createGuavaCacheCollector (
151- BLOCKCHAIN , "transactionReceipts" , transactionReceiptsCache .get ());
152- metricsSystem .createGuavaCacheCollector (
153- BLOCKCHAIN , "totalDifficulty" , totalDifficultyCache .get ());
155+ Optional .of (CacheBuilder .newBuilder ().recordStats ().maximumSize (blocksCacheSize ).build ());
156+ registerCacheMetrics (metricsSystem );
154157 } else {
155- blockHeadersCache = Optional .empty ();
156- blockBodiesCache = Optional .empty ();
157- transactionReceiptsCache = Optional .empty ();
158- totalDifficultyCache = Optional .empty ();
159- blockAccessListCache = Optional .empty ();
158+ // Only headers cache is created, rest are empty
159+ setBlockCachesEmpty ();
160+ registerHeadersCacheMetrics (metricsSystem );
160161 }
162+ }
161163
162- createCounters (metricsSystem );
163- createGauges (metricsSystem );
164+ private void setAllCachesEmpty () {
165+ blockHeadersCache = Optional .empty ();
166+ setBlockCachesEmpty ();
167+ }
168+
169+ private void setBlockCachesEmpty () {
170+ blockBodiesCache = Optional .empty ();
171+ transactionReceiptsCache = Optional .empty ();
172+ totalDifficultyCache = Optional .empty ();
173+ blockAccessListCache = Optional .empty ();
174+ }
175+
176+ private void registerCacheMetrics (final MetricsSystem metricsSystem ) {
177+ registerHeadersCacheMetrics (metricsSystem );
178+ metricsSystem .createGuavaCacheCollector (BLOCKCHAIN , "blockBodies" , blockBodiesCache .get ());
179+ metricsSystem .createGuavaCacheCollector (
180+ BLOCKCHAIN , "transactionReceipts" , transactionReceiptsCache .get ());
181+ metricsSystem .createGuavaCacheCollector (
182+ BLOCKCHAIN , "totalDifficulty" , totalDifficultyCache .get ());
183+ }
184+
185+ private void registerHeadersCacheMetrics (final MetricsSystem metricsSystem ) {
186+ metricsSystem .createGuavaCacheCollector (BLOCKCHAIN , "blockHeaders" , blockHeadersCache .get ());
164187 }
165188
166189 private void createCounters (final MetricsSystem metricsSystem ) {
@@ -237,6 +260,7 @@ public static MutableBlockchain createMutable(
237260 metricsSystem ,
238261 reorgLoggingThreshold ,
239262 null ,
263+ 0 ,
240264 0 );
241265 }
242266
@@ -253,6 +277,7 @@ public static MutableBlockchain createMutable(
253277 metricsSystem ,
254278 reorgLoggingThreshold ,
255279 dataDirectory ,
280+ 0 ,
256281 0 );
257282 }
258283
@@ -262,15 +287,17 @@ public static MutableBlockchain createMutable(
262287 final MetricsSystem metricsSystem ,
263288 final long reorgLoggingThreshold ,
264289 final String dataDirectory ,
265- final int numberOfBlocksToCache ) {
290+ final int numberOfBlocksToCache ,
291+ final int numberOgBlockHeadersToCache ) {
266292 checkNotNull (genesisBlock );
267293 return new DefaultBlockchain (
268294 Optional .of (genesisBlock ),
269295 blockchainStorage ,
270296 metricsSystem ,
271297 reorgLoggingThreshold ,
272298 dataDirectory ,
273- numberOfBlocksToCache );
299+ numberOfBlocksToCache ,
300+ numberOgBlockHeadersToCache );
274301 }
275302
276303 public static Blockchain create (
@@ -451,7 +478,7 @@ public synchronized void appendBlock(
451478 final Block block ,
452479 final List <TransactionReceipt > receipts ,
453480 final Optional <BlockAccessList > blockAccessList ) {
454- if ( numberOfBlocksToCache != 0 ) cacheBlockData (block , receipts , blockAccessList );
481+ cacheBlockData (block , receipts , blockAccessList );
455482 appendBlockHelper (new BlockWithReceipts (block , receipts ), false , true );
456483 }
457484
@@ -460,7 +487,7 @@ public synchronized void appendBlockWithoutIndexingTransactions(
460487 final Block block ,
461488 final List <TransactionReceipt > receipts ,
462489 final Optional <BlockAccessList > blockAccessList ) {
463- if ( numberOfBlocksToCache != 0 ) cacheBlockData (block , receipts , blockAccessList );
490+ cacheBlockData (block , receipts , blockAccessList );
464491 appendBlockHelper (new BlockWithReceipts (block , receipts ), false , false );
465492 }
466493
@@ -481,7 +508,7 @@ public synchronized void storeBlock(
481508 final Block block ,
482509 final List <TransactionReceipt > receipts ,
483510 final Optional <BlockAccessList > blockAccessList ) {
484- if ( numberOfBlocksToCache != 0 ) cacheBlockData (block , receipts , blockAccessList );
511+ cacheBlockData (block , receipts , blockAccessList );
485512 appendBlockHelper (new BlockWithReceipts (block , receipts ), true , true );
486513 }
487514
@@ -592,6 +619,7 @@ public synchronized void unsafeImportBlock(
592619 final Block block ,
593620 final List <TransactionReceipt > transactionReceipts ,
594621 final Optional <Difficulty > maybeTotalDifficulty ) {
622+ cacheBlockData (block , transactionReceipts , Optional .empty ());
595623 final BlockchainStorage .Updater updater = blockchainStorage .updater ();
596624 final Hash blockHash = block .getHash ();
597625 updater .putBlockHeader (blockHash , block .getHeader ());
0 commit comments