Skip to content

Commit

Permalink
[PIE-2322] Create file if logBloom-current.cache is missing (#438)
Browse files Browse the repository at this point in the history
* create file if logBloom-current.cache is missing

Signed-off-by: Karim TAAM <[email protected]>

* update populateLatestSegment in order to resolve the missing logs issue

Signed-off-by: Karim TAAM <[email protected]>

* add lock for populateLatestSegment

Signed-off-by: Karim TAAM <[email protected]>
  • Loading branch information
matkt authored Mar 3, 2020
1 parent 634404c commit 9c576cc
Showing 1 changed file with 29 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ public class TransactionLogBloomCacher {
private final Map<Long, Boolean> cachedSegments;

private final Lock submissionLock = new ReentrantLock();
private final Lock populateLastFragmentLock = new ReentrantLock();

private final EthScheduler scheduler;
private final Blockchain blockchain;
Expand Down Expand Up @@ -170,27 +171,36 @@ private void cacheSingleBlock(final BlockHeader blockHeader, final File cacheFil

private boolean populateLatestSegment() {
try {
long blockNumber = blockchain.getChainHeadBlockNumber();
final File currentFile = calculateCacheFileName(CURRENT, cacheDir);
final long segmentNumber = blockNumber / BLOCKS_PER_BLOOM_CACHE;
try (final OutputStream out = new FileOutputStream(currentFile)) {
fillCacheFile(segmentNumber * BLOCKS_PER_BLOOM_CACHE, blockNumber, out);
}
while (blockNumber <= blockchain.getChainHeadBlockNumber()
&& (blockNumber % BLOCKS_PER_BLOOM_CACHE != 0)) {
cacheSingleBlock(blockchain.getBlockHeader(blockNumber).orElseThrow(), currentFile);
blockNumber++;
if (populateLastFragmentLock.tryLock(100, TimeUnit.MILLISECONDS)) {
try {
final File currentFile = calculateCacheFileName(CURRENT, cacheDir);

final long segmentNumber = blockchain.getChainHeadBlockNumber() / BLOCKS_PER_BLOOM_CACHE;
long blockNumber = segmentNumber / BLOCKS_PER_BLOOM_CACHE;
try (final OutputStream out = new FileOutputStream(currentFile)) {
fillCacheFile(segmentNumber * BLOCKS_PER_BLOOM_CACHE, blockNumber, out);
}
while (blockNumber <= blockchain.getChainHeadBlockNumber()
&& (blockNumber % BLOCKS_PER_BLOOM_CACHE != 0)) {
cacheSingleBlock(blockchain.getBlockHeader(blockNumber).orElseThrow(), currentFile);
blockNumber++;
}
Files.move(
currentFile.toPath(),
calculateCacheFileName(blockNumber, cacheDir).toPath(),
StandardCopyOption.REPLACE_EXISTING,
StandardCopyOption.ATOMIC_MOVE);
return true;
} catch (final IOException e) {
LOG.error("Unhandled caching exception.", e);
} finally {
populateLastFragmentLock.unlock();
}
}
Files.move(
currentFile.toPath(),
calculateCacheFileName(blockNumber, cacheDir).toPath(),
StandardCopyOption.REPLACE_EXISTING,
StandardCopyOption.ATOMIC_MOVE);
return true;
} catch (final IOException e) {
LOG.error("Unhandled caching exception.", e);
return false;
} catch (final InterruptedException e) {
// ignore
}
return false;
}

private void ensurePreviousSegmentsArePresent(final long blockNumber) {
Expand Down

0 comments on commit 9c576cc

Please sign in to comment.