Browse Source

Keep information about all block files in memory

0.10
Pieter Wuille 10 years ago
parent
commit
ed6d1a2c7b
  1. 72
      src/main.cpp

72
src/main.cpp

@ -108,7 +108,7 @@ namespace {
set<CBlockIndex*, CBlockIndexWorkComparator> setBlockIndexValid; set<CBlockIndex*, CBlockIndexWorkComparator> setBlockIndexValid;
CCriticalSection cs_LastBlockFile; CCriticalSection cs_LastBlockFile;
CBlockFileInfo infoLastBlockFile; std::vector<CBlockFileInfo> vinfoBlockFile;
int nLastBlockFile = 0; int nLastBlockFile = 0;
// Every received block is assigned a unique and increasing identifier, so we // Every received block is assigned a unique and increasing identifier, so we
@ -1522,7 +1522,7 @@ void static FlushBlockFile(bool fFinalize = false)
FILE *fileOld = OpenBlockFile(posOld); FILE *fileOld = OpenBlockFile(posOld);
if (fileOld) { if (fileOld) {
if (fFinalize) if (fFinalize)
TruncateFile(fileOld, infoLastBlockFile.nSize); TruncateFile(fileOld, vinfoBlockFile[nLastBlockFile].nSize);
FileCommit(fileOld); FileCommit(fileOld);
fclose(fileOld); fclose(fileOld);
} }
@ -1530,7 +1530,7 @@ void static FlushBlockFile(bool fFinalize = false)
fileOld = OpenUndoFile(posOld); fileOld = OpenUndoFile(posOld);
if (fileOld) { if (fileOld) {
if (fFinalize) if (fFinalize)
TruncateFile(fileOld, infoLastBlockFile.nUndoSize); TruncateFile(fileOld, vinfoBlockFile[nLastBlockFile].nUndoSize);
FileCommit(fileOld); FileCommit(fileOld);
fclose(fileOld); fclose(fileOld);
} }
@ -2107,32 +2107,32 @@ bool FindBlockPos(CValidationState &state, CDiskBlockPos &pos, unsigned int nAdd
LOCK(cs_LastBlockFile); LOCK(cs_LastBlockFile);
if (fKnown) { unsigned int nFile = fKnown ? pos.nFile : nLastBlockFile;
if (nLastBlockFile != pos.nFile) { if (vinfoBlockFile.size() <= nFile) {
nLastBlockFile = pos.nFile; vinfoBlockFile.resize(nFile + 1);
infoLastBlockFile.SetNull();
pblocktree->ReadBlockFileInfo(nLastBlockFile, infoLastBlockFile);
fUpdatedLast = true;
} }
} else {
while (infoLastBlockFile.nSize + nAddSize >= MAX_BLOCKFILE_SIZE) { if (!fKnown) {
LogPrintf("Leaving block file %i: %s\n", nLastBlockFile, infoLastBlockFile.ToString()); while (vinfoBlockFile[nFile].nSize + nAddSize >= MAX_BLOCKFILE_SIZE) {
LogPrintf("Leaving block file %i: %s\n", nFile, vinfoBlockFile[nFile].ToString());
FlushBlockFile(true); FlushBlockFile(true);
nLastBlockFile++; nFile++;
infoLastBlockFile.SetNull(); if (vinfoBlockFile.size() <= nFile) {
pblocktree->ReadBlockFileInfo(nLastBlockFile, infoLastBlockFile); // check whether data for the new file somehow already exist; can fail just fine vinfoBlockFile.resize(nFile + 1);
}
fUpdatedLast = true; fUpdatedLast = true;
} }
pos.nFile = nLastBlockFile; pos.nFile = nFile;
pos.nPos = infoLastBlockFile.nSize; pos.nPos = vinfoBlockFile[nFile].nSize;
} }
infoLastBlockFile.nSize += nAddSize; nLastBlockFile = nFile;
infoLastBlockFile.AddBlock(nHeight, nTime); vinfoBlockFile[nFile].nSize += nAddSize;
vinfoBlockFile[nFile].AddBlock(nHeight, nTime);
if (!fKnown) { if (!fKnown) {
unsigned int nOldChunks = (pos.nPos + BLOCKFILE_CHUNK_SIZE - 1) / BLOCKFILE_CHUNK_SIZE; unsigned int nOldChunks = (pos.nPos + BLOCKFILE_CHUNK_SIZE - 1) / BLOCKFILE_CHUNK_SIZE;
unsigned int nNewChunks = (infoLastBlockFile.nSize + BLOCKFILE_CHUNK_SIZE - 1) / BLOCKFILE_CHUNK_SIZE; unsigned int nNewChunks = (vinfoBlockFile[nFile].nSize + BLOCKFILE_CHUNK_SIZE - 1) / BLOCKFILE_CHUNK_SIZE;
if (nNewChunks > nOldChunks) { if (nNewChunks > nOldChunks) {
if (CheckDiskSpace(nNewChunks * BLOCKFILE_CHUNK_SIZE - pos.nPos)) { if (CheckDiskSpace(nNewChunks * BLOCKFILE_CHUNK_SIZE - pos.nPos)) {
FILE *file = OpenBlockFile(pos); FILE *file = OpenBlockFile(pos);
@ -2147,7 +2147,7 @@ bool FindBlockPos(CValidationState &state, CDiskBlockPos &pos, unsigned int nAdd
} }
} }
if (!pblocktree->WriteBlockFileInfo(nLastBlockFile, infoLastBlockFile)) if (!pblocktree->WriteBlockFileInfo(nLastBlockFile, vinfoBlockFile[nFile]))
return state.Abort("Failed to write file info"); return state.Abort("Failed to write file info");
if (fUpdatedLast) if (fUpdatedLast)
pblocktree->WriteLastBlockFile(nLastBlockFile); pblocktree->WriteLastBlockFile(nLastBlockFile);
@ -2162,18 +2162,9 @@ bool FindUndoPos(CValidationState &state, int nFile, CDiskBlockPos &pos, unsigne
LOCK(cs_LastBlockFile); LOCK(cs_LastBlockFile);
unsigned int nNewSize; unsigned int nNewSize;
if (nFile == nLastBlockFile) { pos.nPos = vinfoBlockFile[nFile].nUndoSize;
pos.nPos = infoLastBlockFile.nUndoSize; nNewSize = vinfoBlockFile[nFile].nUndoSize += nAddSize;
nNewSize = (infoLastBlockFile.nUndoSize += nAddSize); if (!pblocktree->WriteBlockFileInfo(nLastBlockFile, vinfoBlockFile[nLastBlockFile])) {
if (!pblocktree->WriteBlockFileInfo(nLastBlockFile, infoLastBlockFile))
return state.Abort("Failed to write block info");
} else {
CBlockFileInfo info;
if (!pblocktree->ReadBlockFileInfo(nFile, info))
return state.Abort("Failed to read block info");
pos.nPos = info.nUndoSize;
nNewSize = (info.nUndoSize += nAddSize);
if (!pblocktree->WriteBlockFileInfo(nFile, info))
return state.Abort("Failed to write block info"); return state.Abort("Failed to write block info");
} }
@ -2826,9 +2817,20 @@ bool static LoadBlockIndexDB()
// Load block file info // Load block file info
pblocktree->ReadLastBlockFile(nLastBlockFile); pblocktree->ReadLastBlockFile(nLastBlockFile);
vinfoBlockFile.resize(nLastBlockFile + 1);
LogPrintf("LoadBlockIndexDB(): last block file = %i\n", nLastBlockFile); LogPrintf("LoadBlockIndexDB(): last block file = %i\n", nLastBlockFile);
if (pblocktree->ReadBlockFileInfo(nLastBlockFile, infoLastBlockFile)) for (int nFile = 0; nFile <= nLastBlockFile; nFile++) {
LogPrintf("LoadBlockIndexDB(): last block file info: %s\n", infoLastBlockFile.ToString()); pblocktree->ReadBlockFileInfo(nFile, vinfoBlockFile[nFile]);
}
LogPrintf("LoadBlockIndexDB(): last block file info: %s\n", vinfoBlockFile[nLastBlockFile].ToString());
for (int nFile = nLastBlockFile + 1; true; nFile++) {
CBlockFileInfo info;
if (pblocktree->ReadBlockFileInfo(nFile, info)) {
vinfoBlockFile.push_back(info);
} else {
break;
}
}
// Check presence of blk files // Check presence of blk files
LogPrintf("Checking all blk files are present...\n"); LogPrintf("Checking all blk files are present...\n");

Loading…
Cancel
Save