diff options
| author | Pieter Wuille <[email protected]> | 2012-08-16 02:21:28 +0200 |
|---|---|---|
| committer | Pieter Wuille <[email protected]> | 2012-10-20 23:08:57 +0200 |
| commit | bba89aa82a80f0373dcb7288d96d5b0fcb453d73 (patch) | |
| tree | f3b4fd8649021b52e19cfdf4620ffead5f30910e /src/main.cpp | |
| parent | Multiple blocks per file (diff) | |
| download | discoin-bba89aa82a80f0373dcb7288d96d5b0fcb453d73.tar.xz discoin-bba89aa82a80f0373dcb7288d96d5b0fcb453d73.zip | |
Pre-allocate block and undo files in chunks
Introduce a AllocateFileRange() function in util, which wipes or
at least allocates a given range of a file. It can be overriden
by more efficient OS-dependent versions if necessary.
Block and undo files are now allocated in chunks of 16 and 1 MiB,
respectively.
Diffstat (limited to 'src/main.cpp')
| -rw-r--r-- | src/main.cpp | 41 |
1 files changed, 32 insertions, 9 deletions
diff --git a/src/main.cpp b/src/main.cpp index 15a233137..616845e92 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1844,6 +1844,17 @@ bool FindBlockPos(CTxDB &txdb, CDiskBlockPos &pos, unsigned int nAddSize, unsign infoLastBlockFile.nSize += nAddSize; infoLastBlockFile.AddBlock(nHeight, nTime); + unsigned int nOldChunks = (pos.nPos + BLOCKFILE_CHUNK_SIZE - 1) / BLOCKFILE_CHUNK_SIZE; + unsigned int nNewChunks = (infoLastBlockFile.nSize + BLOCKFILE_CHUNK_SIZE - 1) / BLOCKFILE_CHUNK_SIZE; + if (nNewChunks > nOldChunks) { + FILE *file = OpenBlockFile(pos); + if (file) { + printf("Pre-allocating up to position 0x%x in blk%05u.dat\n", nNewChunks * BLOCKFILE_CHUNK_SIZE, pos.nFile); + AllocateFileRange(file, pos.nPos, nNewChunks * BLOCKFILE_CHUNK_SIZE - pos.nPos); + } + fclose(file); + } + if (!txdb.WriteBlockFileInfo(nLastBlockFile, infoLastBlockFile)) return error("FindBlockPos() : cannot write updated block info"); if (fUpdatedLast) @@ -1858,21 +1869,33 @@ bool FindUndoPos(CTxDB &txdb, int nFile, CDiskBlockPos &pos, unsigned int nAddSi LOCK(cs_LastBlockFile); + unsigned int nNewSize; if (nFile == nLastBlockFile) { pos.nPos = infoLastBlockFile.nUndoSize; - infoLastBlockFile.nUndoSize += nAddSize; + nNewSize = (infoLastBlockFile.nUndoSize += nAddSize); if (!txdb.WriteBlockFileInfo(nLastBlockFile, infoLastBlockFile)) return error("FindUndoPos() : cannot write updated block info"); - return true; + } else { + CBlockFileInfo info; + if (!txdb.ReadBlockFileInfo(nFile, info)) + return error("FindUndoPos() : cannot read block info"); + pos.nPos = info.nUndoSize; + nNewSize = (info.nUndoSize += nAddSize); + if (!txdb.WriteBlockFileInfo(nFile, info)) + return error("FindUndoPos() : cannot write updated block info"); + } + + unsigned int nOldChunks = (pos.nPos + UNDOFILE_CHUNK_SIZE - 1) / UNDOFILE_CHUNK_SIZE; + unsigned int nNewChunks = (nNewSize + UNDOFILE_CHUNK_SIZE - 1) / UNDOFILE_CHUNK_SIZE; + if (nNewChunks > nOldChunks) { + FILE *file = OpenUndoFile(pos); + if (file) { + printf("Pre-allocating up to position 0x%x in rev%05u.dat\n", nNewChunks * UNDOFILE_CHUNK_SIZE, pos.nFile); + AllocateFileRange(file, pos.nPos, nNewChunks * UNDOFILE_CHUNK_SIZE - pos.nPos); + } + fclose(file); } - CBlockFileInfo info; - if (!txdb.ReadBlockFileInfo(nFile, info)) - return error("FindUndoPos() : cannot read block info"); - pos.nPos = info.nUndoSize; - info.nUndoSize += nAddSize; - if (!txdb.WriteBlockFileInfo(nFile, info)) - return error("FindUndoPos() : cannot write updated block info"); return true; } |