mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-03-04 13:55:23 -05:00
Merge bitcoin/bitcoin#28458: refactor: Remove unused GetType() from CBufferedFile and CAutoFile
fa19c914f7
scripted-diff: Rename CBufferedFile to BufferedFile (MarcoFalke)fa2f2413b8
Remove unused GetType() from CBufferedFile and CAutoFile (MarcoFalke)5c2b3cd4b8
dbwrapper: Use DataStream for batch operations (TheCharlatan) Pull request description: This refactor is required for https://github.com/bitcoin/bitcoin/pull/28052 and https://github.com/bitcoin/bitcoin/pull/28451 Thus, split it out. ACKs for top commit: ajtowns: utACKfa19c914f7
TheCharlatan: ACKfa19c914f7
Tree-SHA512: d9c232324702512e45fd73ec3e3170f1e8a8c8f9c49cb613a6b693a9f83358914155527ace2517a2cd626a0cedcada56ef70a2a7812edafb1888fd6765eebba2
This commit is contained in:
commit
8209e86eeb
10 changed files with 31 additions and 38 deletions
|
@ -16,7 +16,7 @@ static void FindByte(benchmark::Bench& bench)
|
||||||
data[file_size-1] = 1;
|
data[file_size-1] = 1;
|
||||||
fwrite(&data, sizeof(uint8_t), file_size, file);
|
fwrite(&data, sizeof(uint8_t), file_size, file);
|
||||||
rewind(file);
|
rewind(file);
|
||||||
CBufferedFile bf(file, /*nBufSize=*/file_size + 1, /*nRewindIn=*/file_size, 0, 0);
|
BufferedFile bf{file, /*nBufSize=*/file_size + 1, /*nRewindIn=*/file_size, 0};
|
||||||
|
|
||||||
bench.run([&] {
|
bench.run([&] {
|
||||||
bf.SetPos(0);
|
bf.SetPos(0);
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
|
|
||||||
#include <dbwrapper.h>
|
#include <dbwrapper.h>
|
||||||
|
|
||||||
#include <clientversion.h>
|
|
||||||
#include <logging.h>
|
#include <logging.h>
|
||||||
#include <random.h>
|
#include <random.h>
|
||||||
#include <serialize.h>
|
#include <serialize.h>
|
||||||
|
@ -156,9 +155,9 @@ struct CDBBatch::WriteBatchImpl {
|
||||||
leveldb::WriteBatch batch;
|
leveldb::WriteBatch batch;
|
||||||
};
|
};
|
||||||
|
|
||||||
CDBBatch::CDBBatch(const CDBWrapper& _parent) : parent(_parent),
|
CDBBatch::CDBBatch(const CDBWrapper& _parent)
|
||||||
m_impl_batch{std::make_unique<CDBBatch::WriteBatchImpl>()},
|
: parent{_parent},
|
||||||
ssValue(SER_DISK, CLIENT_VERSION){};
|
m_impl_batch{std::make_unique<CDBBatch::WriteBatchImpl>()} {};
|
||||||
|
|
||||||
CDBBatch::~CDBBatch() = default;
|
CDBBatch::~CDBBatch() = default;
|
||||||
|
|
||||||
|
@ -168,7 +167,7 @@ void CDBBatch::Clear()
|
||||||
size_estimate = 0;
|
size_estimate = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDBBatch::WriteImpl(Span<const std::byte> key, CDataStream& ssValue)
|
void CDBBatch::WriteImpl(Span<const std::byte> key, DataStream& ssValue)
|
||||||
{
|
{
|
||||||
leveldb::Slice slKey(CharCast(key.data()), key.size());
|
leveldb::Slice slKey(CharCast(key.data()), key.size());
|
||||||
ssValue.Xor(dbwrapper_private::GetObfuscateKey(parent));
|
ssValue.Xor(dbwrapper_private::GetObfuscateKey(parent));
|
||||||
|
|
|
@ -80,11 +80,11 @@ private:
|
||||||
const std::unique_ptr<WriteBatchImpl> m_impl_batch;
|
const std::unique_ptr<WriteBatchImpl> m_impl_batch;
|
||||||
|
|
||||||
DataStream ssKey{};
|
DataStream ssKey{};
|
||||||
CDataStream ssValue;
|
DataStream ssValue{};
|
||||||
|
|
||||||
size_t size_estimate{0};
|
size_t size_estimate{0};
|
||||||
|
|
||||||
void WriteImpl(Span<const std::byte> key, CDataStream& ssValue);
|
void WriteImpl(Span<const std::byte> key, DataStream& ssValue);
|
||||||
void EraseImpl(Span<const std::byte> key);
|
void EraseImpl(Span<const std::byte> key);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -79,7 +79,7 @@ bool TxIndex::FindTx(const uint256& tx_hash, uint256& block_hash, CTransactionRe
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
CAutoFile file(m_chainstate->m_blockman.OpenBlockFile(postx, true), SER_DISK, CLIENT_VERSION);
|
CAutoFile file{m_chainstate->m_blockman.OpenBlockFile(postx, true), CLIENT_VERSION};
|
||||||
if (file.IsNull()) {
|
if (file.IsNull()) {
|
||||||
return error("%s: OpenBlockFile failed", __func__);
|
return error("%s: OpenBlockFile failed", __func__);
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,7 +41,7 @@ bool LoadMempool(CTxMemPool& pool, const fs::path& load_path, Chainstate& active
|
||||||
if (load_path.empty()) return false;
|
if (load_path.empty()) return false;
|
||||||
|
|
||||||
FILE* filestr{opts.mockable_fopen_function(load_path, "rb")};
|
FILE* filestr{opts.mockable_fopen_function(load_path, "rb")};
|
||||||
CAutoFile file(filestr, SER_DISK, CLIENT_VERSION);
|
CAutoFile file{filestr, CLIENT_VERSION};
|
||||||
if (file.IsNull()) {
|
if (file.IsNull()) {
|
||||||
LogPrintf("Failed to open mempool file from disk. Continuing anyway.\n");
|
LogPrintf("Failed to open mempool file from disk. Continuing anyway.\n");
|
||||||
return false;
|
return false;
|
||||||
|
@ -157,7 +157,7 @@ bool DumpMempool(const CTxMemPool& pool, const fs::path& dump_path, FopenFn mock
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
CAutoFile file(filestr, SER_DISK, CLIENT_VERSION);
|
CAutoFile file{filestr, CLIENT_VERSION};
|
||||||
|
|
||||||
uint64_t version = MEMPOOL_DUMP_VERSION;
|
uint64_t version = MEMPOOL_DUMP_VERSION;
|
||||||
file << version;
|
file << version;
|
||||||
|
|
|
@ -822,7 +822,7 @@ bool BlockManager::FindUndoPos(BlockValidationState& state, int nFile, FlatFileP
|
||||||
bool BlockManager::WriteBlockToDisk(const CBlock& block, FlatFilePos& pos) const
|
bool BlockManager::WriteBlockToDisk(const CBlock& block, FlatFilePos& pos) const
|
||||||
{
|
{
|
||||||
// Open history file to append
|
// Open history file to append
|
||||||
CAutoFile fileout(OpenBlockFile(pos), SER_DISK, CLIENT_VERSION);
|
CAutoFile fileout{OpenBlockFile(pos), CLIENT_VERSION};
|
||||||
if (fileout.IsNull()) {
|
if (fileout.IsNull()) {
|
||||||
return error("WriteBlockToDisk: OpenBlockFile failed");
|
return error("WriteBlockToDisk: OpenBlockFile failed");
|
||||||
}
|
}
|
||||||
|
@ -878,7 +878,7 @@ bool BlockManager::ReadBlockFromDisk(CBlock& block, const FlatFilePos& pos) cons
|
||||||
block.SetNull();
|
block.SetNull();
|
||||||
|
|
||||||
// Open history file to read
|
// Open history file to read
|
||||||
CAutoFile filein(OpenBlockFile(pos, true), SER_DISK, CLIENT_VERSION);
|
CAutoFile filein{OpenBlockFile(pos, true), CLIENT_VERSION};
|
||||||
if (filein.IsNull()) {
|
if (filein.IsNull()) {
|
||||||
return error("ReadBlockFromDisk: OpenBlockFile failed for %s", pos.ToString());
|
return error("ReadBlockFromDisk: OpenBlockFile failed for %s", pos.ToString());
|
||||||
}
|
}
|
||||||
|
|
|
@ -550,12 +550,10 @@ public:
|
||||||
class CAutoFile : public AutoFile
|
class CAutoFile : public AutoFile
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
const int nType;
|
|
||||||
const int nVersion;
|
const int nVersion;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit CAutoFile(std::FILE* file, int type, int version, std::vector<std::byte> data_xor = {}) : AutoFile{file, std::move(data_xor)}, nType{type}, nVersion{version} {}
|
explicit CAutoFile(std::FILE* file, int version, std::vector<std::byte> data_xor = {}) : AutoFile{file, std::move(data_xor)}, nVersion{version} {}
|
||||||
int GetType() const { return nType; }
|
|
||||||
int GetVersion() const { return nVersion; }
|
int GetVersion() const { return nVersion; }
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
|
@ -579,10 +577,9 @@ public:
|
||||||
* Will automatically close the file when it goes out of scope if not null.
|
* Will automatically close the file when it goes out of scope if not null.
|
||||||
* If you need to close the file early, use file.fclose() instead of fclose(file).
|
* If you need to close the file early, use file.fclose() instead of fclose(file).
|
||||||
*/
|
*/
|
||||||
class CBufferedFile
|
class BufferedFile
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
const int nType;
|
|
||||||
const int nVersion;
|
const int nVersion;
|
||||||
|
|
||||||
FILE *src; //!< source file
|
FILE *src; //!< source file
|
||||||
|
@ -603,7 +600,7 @@ private:
|
||||||
return false;
|
return false;
|
||||||
size_t nBytes = fread((void*)&vchBuf[pos], 1, readNow, src);
|
size_t nBytes = fread((void*)&vchBuf[pos], 1, readNow, src);
|
||||||
if (nBytes == 0) {
|
if (nBytes == 0) {
|
||||||
throw std::ios_base::failure(feof(src) ? "CBufferedFile::Fill: end of file" : "CBufferedFile::Fill: fread failed");
|
throw std::ios_base::failure(feof(src) ? "BufferedFile::Fill: end of file" : "BufferedFile::Fill: fread failed");
|
||||||
}
|
}
|
||||||
nSrcPos += nBytes;
|
nSrcPos += nBytes;
|
||||||
return true;
|
return true;
|
||||||
|
@ -632,25 +629,24 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CBufferedFile(FILE* fileIn, uint64_t nBufSize, uint64_t nRewindIn, int nTypeIn, int nVersionIn)
|
BufferedFile(FILE* fileIn, uint64_t nBufSize, uint64_t nRewindIn, int nVersionIn)
|
||||||
: nType(nTypeIn), nVersion(nVersionIn), nReadLimit(std::numeric_limits<uint64_t>::max()), nRewind(nRewindIn), vchBuf(nBufSize, std::byte{0})
|
: nVersion{nVersionIn}, nReadLimit{std::numeric_limits<uint64_t>::max()}, nRewind{nRewindIn}, vchBuf(nBufSize, std::byte{0})
|
||||||
{
|
{
|
||||||
if (nRewindIn >= nBufSize)
|
if (nRewindIn >= nBufSize)
|
||||||
throw std::ios_base::failure("Rewind limit must be less than buffer size");
|
throw std::ios_base::failure("Rewind limit must be less than buffer size");
|
||||||
src = fileIn;
|
src = fileIn;
|
||||||
}
|
}
|
||||||
|
|
||||||
~CBufferedFile()
|
~BufferedFile()
|
||||||
{
|
{
|
||||||
fclose();
|
fclose();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Disallow copies
|
// Disallow copies
|
||||||
CBufferedFile(const CBufferedFile&) = delete;
|
BufferedFile(const BufferedFile&) = delete;
|
||||||
CBufferedFile& operator=(const CBufferedFile&) = delete;
|
BufferedFile& operator=(const BufferedFile&) = delete;
|
||||||
|
|
||||||
int GetVersion() const { return nVersion; }
|
int GetVersion() const { return nVersion; }
|
||||||
int GetType() const { return nType; }
|
|
||||||
|
|
||||||
void fclose()
|
void fclose()
|
||||||
{
|
{
|
||||||
|
@ -715,7 +711,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
CBufferedFile& operator>>(T&& obj) {
|
BufferedFile& operator>>(T&& obj) {
|
||||||
::Unserialize(*this, obj);
|
::Unserialize(*this, obj);
|
||||||
return (*this);
|
return (*this);
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,10 +18,10 @@ FUZZ_TARGET(buffered_file)
|
||||||
{
|
{
|
||||||
FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
|
FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
|
||||||
FuzzedFileProvider fuzzed_file_provider = ConsumeFile(fuzzed_data_provider);
|
FuzzedFileProvider fuzzed_file_provider = ConsumeFile(fuzzed_data_provider);
|
||||||
std::optional<CBufferedFile> opt_buffered_file;
|
std::optional<BufferedFile> opt_buffered_file;
|
||||||
FILE* fuzzed_file = fuzzed_file_provider.open();
|
FILE* fuzzed_file = fuzzed_file_provider.open();
|
||||||
try {
|
try {
|
||||||
opt_buffered_file.emplace(fuzzed_file, fuzzed_data_provider.ConsumeIntegralInRange<uint64_t>(0, 4096), fuzzed_data_provider.ConsumeIntegralInRange<uint64_t>(0, 4096), fuzzed_data_provider.ConsumeIntegral<int>(), fuzzed_data_provider.ConsumeIntegral<int>());
|
opt_buffered_file.emplace(fuzzed_file, fuzzed_data_provider.ConsumeIntegralInRange<uint64_t>(0, 4096), fuzzed_data_provider.ConsumeIntegralInRange<uint64_t>(0, 4096), fuzzed_data_provider.ConsumeIntegral<int>());
|
||||||
} catch (const std::ios_base::failure&) {
|
} catch (const std::ios_base::failure&) {
|
||||||
if (fuzzed_file != nullptr) {
|
if (fuzzed_file != nullptr) {
|
||||||
fclose(fuzzed_file);
|
fclose(fuzzed_file);
|
||||||
|
@ -62,7 +62,6 @@ FUZZ_TARGET(buffered_file)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
opt_buffered_file->GetPos();
|
opt_buffered_file->GetPos();
|
||||||
opt_buffered_file->GetType();
|
|
||||||
opt_buffered_file->GetVersion();
|
opt_buffered_file->GetVersion();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -260,7 +260,7 @@ BOOST_AUTO_TEST_CASE(streams_buffered_file)
|
||||||
// The buffer size (second arg) must be greater than the rewind
|
// The buffer size (second arg) must be greater than the rewind
|
||||||
// amount (third arg).
|
// amount (third arg).
|
||||||
try {
|
try {
|
||||||
CBufferedFile bfbad(file, 25, 25, 222, 333);
|
BufferedFile bfbad{file, 25, 25, 333};
|
||||||
BOOST_CHECK(false);
|
BOOST_CHECK(false);
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::exception& e) {
|
||||||
BOOST_CHECK(strstr(e.what(),
|
BOOST_CHECK(strstr(e.what(),
|
||||||
|
@ -268,11 +268,10 @@ BOOST_AUTO_TEST_CASE(streams_buffered_file)
|
||||||
}
|
}
|
||||||
|
|
||||||
// The buffer is 25 bytes, allow rewinding 10 bytes.
|
// The buffer is 25 bytes, allow rewinding 10 bytes.
|
||||||
CBufferedFile bf(file, 25, 10, 222, 333);
|
BufferedFile bf{file, 25, 10, 333};
|
||||||
BOOST_CHECK(!bf.eof());
|
BOOST_CHECK(!bf.eof());
|
||||||
|
|
||||||
// These two members have no functional effect.
|
// This member has no functional effect.
|
||||||
BOOST_CHECK_EQUAL(bf.GetType(), 222);
|
|
||||||
BOOST_CHECK_EQUAL(bf.GetVersion(), 333);
|
BOOST_CHECK_EQUAL(bf.GetVersion(), 333);
|
||||||
|
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
|
@ -357,7 +356,7 @@ BOOST_AUTO_TEST_CASE(streams_buffered_file)
|
||||||
BOOST_CHECK(false);
|
BOOST_CHECK(false);
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::exception& e) {
|
||||||
BOOST_CHECK(strstr(e.what(),
|
BOOST_CHECK(strstr(e.what(),
|
||||||
"CBufferedFile::Fill: end of file") != nullptr);
|
"BufferedFile::Fill: end of file") != nullptr);
|
||||||
}
|
}
|
||||||
// Attempting to read beyond the end sets the EOF indicator.
|
// Attempting to read beyond the end sets the EOF indicator.
|
||||||
BOOST_CHECK(bf.eof());
|
BOOST_CHECK(bf.eof());
|
||||||
|
@ -392,7 +391,7 @@ BOOST_AUTO_TEST_CASE(streams_buffered_file_skip)
|
||||||
rewind(file);
|
rewind(file);
|
||||||
|
|
||||||
// The buffer is 25 bytes, allow rewinding 10 bytes.
|
// The buffer is 25 bytes, allow rewinding 10 bytes.
|
||||||
CBufferedFile bf(file, 25, 10, 222, 333);
|
BufferedFile bf{file, 25, 10, 333};
|
||||||
|
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
// This is like bf >> (7-byte-variable), in that it will cause data
|
// This is like bf >> (7-byte-variable), in that it will cause data
|
||||||
|
@ -446,7 +445,7 @@ BOOST_AUTO_TEST_CASE(streams_buffered_file_rand)
|
||||||
|
|
||||||
size_t bufSize = InsecureRandRange(300) + 1;
|
size_t bufSize = InsecureRandRange(300) + 1;
|
||||||
size_t rewindSize = InsecureRandRange(bufSize);
|
size_t rewindSize = InsecureRandRange(bufSize);
|
||||||
CBufferedFile bf(file, bufSize, rewindSize, 222, 333);
|
BufferedFile bf{file, bufSize, rewindSize, 333};
|
||||||
size_t currentPos = 0;
|
size_t currentPos = 0;
|
||||||
size_t maxPos = 0;
|
size_t maxPos = 0;
|
||||||
for (int step = 0; step < 100; ++step) {
|
for (int step = 0; step < 100; ++step) {
|
||||||
|
|
|
@ -4588,8 +4588,8 @@ void ChainstateManager::LoadExternalBlockFile(
|
||||||
|
|
||||||
int nLoaded = 0;
|
int nLoaded = 0;
|
||||||
try {
|
try {
|
||||||
// This takes over fileIn and calls fclose() on it in the CBufferedFile destructor
|
// This takes over fileIn and calls fclose() on it in the BufferedFile destructor
|
||||||
CBufferedFile blkdat(fileIn, 2*MAX_BLOCK_SERIALIZED_SIZE, MAX_BLOCK_SERIALIZED_SIZE+8, SER_DISK, CLIENT_VERSION);
|
BufferedFile blkdat{fileIn, 2 * MAX_BLOCK_SERIALIZED_SIZE, MAX_BLOCK_SERIALIZED_SIZE + 8, CLIENT_VERSION};
|
||||||
// nRewind indicates where to resume scanning in case something goes wrong,
|
// nRewind indicates where to resume scanning in case something goes wrong,
|
||||||
// such as a block fails to deserialize.
|
// such as a block fails to deserialize.
|
||||||
uint64_t nRewind = blkdat.GetPos();
|
uint64_t nRewind = blkdat.GetPos();
|
||||||
|
|
Loading…
Add table
Reference in a new issue