@@ -81,11 +81,12 @@ public class DefaultBlockchain implements MutableBlockchain {
8181 private Comparator <BlockHeader > blockChoiceRule ;
8282
8383 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 ;
84+ private final int numberOfBlockHeadersToCache ;
85+ private Optional <Cache <Hash , BlockHeader >> blockHeadersCache ;
86+ private Optional <Cache <Hash , BlockBody >> blockBodiesCache ;
87+ private Optional <Cache <Hash , List <TransactionReceipt >>> transactionReceiptsCache ;
88+ private Optional <Cache <Hash , Difficulty >> totalDifficultyCache ;
89+ private Optional <Cache <Hash , BlockAccessList >> blockAccessListCache ;
8990
9091 private Counter gasUsedCounter = NoOpMetricsSystem .NO_OP_COUNTER ;
9192 private Counter numberOfTransactionsCounter = NoOpMetricsSystem .NO_OP_COUNTER ;
@@ -97,7 +98,7 @@ private DefaultBlockchain(
9798 final BlockchainStorage blockchainStorage ,
9899 final MetricsSystem metricsSystem ,
99100 final long reorgLoggingThreshold ) {
100- this (genesisBlock , blockchainStorage , metricsSystem , reorgLoggingThreshold , null , 0 );
101+ this (genesisBlock , blockchainStorage , metricsSystem , reorgLoggingThreshold , null , 0 , 0 );
101102 }
102103
103104 private DefaultBlockchain (
@@ -106,7 +107,8 @@ private DefaultBlockchain(
106107 final MetricsSystem metricsSystem ,
107108 final long reorgLoggingThreshold ,
108109 final String dataDirectory ,
109- final int numberOfBlocksToCache ) {
110+ final int numberOfBlocksToCache ,
111+ final int numberOfBlockHeadersToCache ) {
110112 checkNotNull (genesisBlock );
111113 checkNotNull (blockchainStorage );
112114 checkNotNull (metricsSystem );
@@ -128,39 +130,70 @@ private DefaultBlockchain(
128130 this .reorgLoggingThreshold = reorgLoggingThreshold ;
129131 this .blockChoiceRule = heaviestChainBlockChoiceRule ;
130132 this .numberOfBlocksToCache = numberOfBlocksToCache ;
133+ this .numberOfBlockHeadersToCache = numberOfBlockHeadersToCache ;
131134
132- if (numberOfBlocksToCache != 0 ) {
133- blockHeadersCache =
134- Optional .of (
135- CacheBuilder .newBuilder ().recordStats ().maximumSize (numberOfBlocksToCache ).build ());
135+ initializeCaches (metricsSystem , numberOfBlockHeadersToCache , numberOfBlocksToCache );
136+ createCounters (metricsSystem );
137+ createGauges (metricsSystem );
138+ }
139+
140+ private void initializeCaches (
141+ final MetricsSystem metricsSystem , final int headersCacheSize , final int blocksCacheSize ) {
142+ if (headersCacheSize == 0 && blocksCacheSize == 0 ) {
143+ setAllCachesEmpty ();
144+ return ;
145+ }
146+
147+ int headersSize =
148+ (headersCacheSize != 0 ) ? Math .max (headersCacheSize , blocksCacheSize ) : blocksCacheSize ;
149+ blockHeadersCache =
150+ Optional .of (CacheBuilder .newBuilder ().recordStats ().maximumSize (headersSize ).build ());
151+ ;
152+
153+ if (blocksCacheSize != 0 ) {
136154 blockBodiesCache =
137- Optional .of (
138- CacheBuilder . newBuilder (). recordStats (). maximumSize ( numberOfBlocksToCache ). build ()) ;
155+ Optional .of (CacheBuilder . newBuilder (). recordStats (). maximumSize ( blocksCacheSize ). build ());
156+ ;
139157 transactionReceiptsCache =
140- Optional .of (
141- CacheBuilder . newBuilder (). recordStats (). maximumSize ( numberOfBlocksToCache ). build ()) ;
158+ Optional .of (CacheBuilder . newBuilder (). recordStats (). maximumSize ( blocksCacheSize ). build ());
159+ ;
142160 totalDifficultyCache =
143- Optional .of (
144- CacheBuilder . newBuilder (). recordStats (). maximumSize ( numberOfBlocksToCache ). build ()) ;
161+ Optional .of (CacheBuilder . newBuilder (). recordStats (). maximumSize ( blocksCacheSize ). build ());
162+ ;
145163 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 ());
164+ Optional .of (CacheBuilder .newBuilder ().recordStats ().maximumSize (blocksCacheSize ).build ());
165+ ;
166+ registerCacheMetrics (metricsSystem );
154167 } else {
155- blockHeadersCache = Optional .empty ();
156- blockBodiesCache = Optional .empty ();
157- transactionReceiptsCache = Optional .empty ();
158- totalDifficultyCache = Optional .empty ();
159- blockAccessListCache = Optional .empty ();
168+ // Only headers cache is created, rest are empty
169+ setBlockCachesEmpty ();
170+ registerHeadersCacheMetrics (metricsSystem );
160171 }
172+ }
161173
162- createCounters (metricsSystem );
163- createGauges (metricsSystem );
174+ private void setAllCachesEmpty () {
175+ blockHeadersCache = Optional .empty ();
176+ setBlockCachesEmpty ();
177+ }
178+
179+ private void setBlockCachesEmpty () {
180+ blockBodiesCache = Optional .empty ();
181+ transactionReceiptsCache = Optional .empty ();
182+ totalDifficultyCache = Optional .empty ();
183+ blockAccessListCache = Optional .empty ();
184+ }
185+
186+ private void registerCacheMetrics (final MetricsSystem metricsSystem ) {
187+ metricsSystem .createGuavaCacheCollector (BLOCKCHAIN , "blockHeaders" , blockHeadersCache .get ());
188+ metricsSystem .createGuavaCacheCollector (BLOCKCHAIN , "blockBodies" , blockBodiesCache .get ());
189+ metricsSystem .createGuavaCacheCollector (
190+ BLOCKCHAIN , "transactionReceipts" , transactionReceiptsCache .get ());
191+ metricsSystem .createGuavaCacheCollector (
192+ BLOCKCHAIN , "totalDifficulty" , totalDifficultyCache .get ());
193+ }
194+
195+ private void registerHeadersCacheMetrics (final MetricsSystem metricsSystem ) {
196+ metricsSystem .createGuavaCacheCollector (BLOCKCHAIN , "blockHeaders" , blockHeadersCache .get ());
164197 }
165198
166199 private void createCounters (final MetricsSystem metricsSystem ) {
@@ -237,6 +270,7 @@ public static MutableBlockchain createMutable(
237270 metricsSystem ,
238271 reorgLoggingThreshold ,
239272 null ,
273+ 0 ,
240274 0 );
241275 }
242276
@@ -253,6 +287,7 @@ public static MutableBlockchain createMutable(
253287 metricsSystem ,
254288 reorgLoggingThreshold ,
255289 dataDirectory ,
290+ 0 ,
256291 0 );
257292 }
258293
@@ -262,15 +297,17 @@ public static MutableBlockchain createMutable(
262297 final MetricsSystem metricsSystem ,
263298 final long reorgLoggingThreshold ,
264299 final String dataDirectory ,
265- final int numberOfBlocksToCache ) {
300+ final int numberOfBlocksToCache ,
301+ final int numberOgBlockHeadersToCache ) {
266302 checkNotNull (genesisBlock );
267303 return new DefaultBlockchain (
268304 Optional .of (genesisBlock ),
269305 blockchainStorage ,
270306 metricsSystem ,
271307 reorgLoggingThreshold ,
272308 dataDirectory ,
273- numberOfBlocksToCache );
309+ numberOfBlocksToCache ,
310+ numberOgBlockHeadersToCache );
274311 }
275312
276313 public static Blockchain create (
@@ -451,7 +488,7 @@ public synchronized void appendBlock(
451488 final Block block ,
452489 final List <TransactionReceipt > receipts ,
453490 final Optional <BlockAccessList > blockAccessList ) {
454- if ( numberOfBlocksToCache != 0 ) cacheBlockData (block , receipts , blockAccessList );
491+ cacheBlockData (block , receipts , blockAccessList );
455492 appendBlockHelper (new BlockWithReceipts (block , receipts ), false , true );
456493 }
457494
@@ -460,7 +497,7 @@ public synchronized void appendBlockWithoutIndexingTransactions(
460497 final Block block ,
461498 final List <TransactionReceipt > receipts ,
462499 final Optional <BlockAccessList > blockAccessList ) {
463- if ( numberOfBlocksToCache != 0 ) cacheBlockData (block , receipts , blockAccessList );
500+ cacheBlockData (block , receipts , blockAccessList );
464501 appendBlockHelper (new BlockWithReceipts (block , receipts ), false , false );
465502 }
466503
@@ -481,7 +518,7 @@ public synchronized void storeBlock(
481518 final Block block ,
482519 final List <TransactionReceipt > receipts ,
483520 final Optional <BlockAccessList > blockAccessList ) {
484- if ( numberOfBlocksToCache != 0 ) cacheBlockData (block , receipts , blockAccessList );
521+ cacheBlockData (block , receipts , blockAccessList );
485522 appendBlockHelper (new BlockWithReceipts (block , receipts ), true , true );
486523 }
487524
@@ -510,6 +547,10 @@ private void cacheBlockData(
510547 cache -> blockAccessList .ifPresent (t -> cache .put (block .getHash (), t )));
511548 }
512549
550+ private void cacheBlockHeader (final BlockHeader blockHeader ) {
551+ blockHeadersCache .ifPresent (cache -> cache .put (blockHeader .getHash (), blockHeader ));
552+ }
553+
513554 private boolean blockShouldBeProcessed (
514555 final Block block , final List <TransactionReceipt > receipts ) {
515556 checkArgument (
0 commit comments