mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-06-02 17:24:58 +02:00
Merge bitcoin/bitcoin#28483: refactor: Return CAutoFile from BlockManager::Open*File()
fa56c421beReturn CAutoFile from BlockManager::Open*File() (MarcoFalke)9999b89cd3Make BufferedFile to be a CAutoFile wrapper (MarcoFalke)fa389d902frefactor: Drop unused fclose() from BufferedFile (MarcoFalke) Pull request description: This is required for https://github.com/bitcoin/bitcoin/pull/28052, but makes sense on its own, because offloading logic to `CAutoFile` instead of re-implementing it allows to delete code and complexity. ACKs for top commit: TheCharlatan: Re-ACKfa56c421bewillcl-ark: tACKfa56c421beTree-SHA512: fe4638f3a6bd3f9d968cfb9ae3259c9d6cd278fe2912cbc90289851311c8c781099db4c160e775960975c4739098d9af801a8d2d12603f371f8edfe134d8f85a
This commit is contained in:
@@ -74,13 +74,13 @@ BOOST_FIXTURE_TEST_CASE(blockmanager_scan_unlink_already_pruned_files, TestChain
|
||||
// Check that the file is not unlinked after ScanAndUnlinkAlreadyPrunedFiles
|
||||
// if m_have_pruned is not yet set
|
||||
WITH_LOCK(chainman->GetMutex(), blockman.ScanAndUnlinkAlreadyPrunedFiles());
|
||||
BOOST_CHECK(!AutoFile(blockman.OpenBlockFile(pos, true)).IsNull());
|
||||
BOOST_CHECK(!blockman.OpenBlockFile(pos, true).IsNull());
|
||||
|
||||
// Check that the file is unlinked after ScanAndUnlinkAlreadyPrunedFiles
|
||||
// once m_have_pruned is set
|
||||
blockman.m_have_pruned = true;
|
||||
WITH_LOCK(chainman->GetMutex(), blockman.ScanAndUnlinkAlreadyPrunedFiles());
|
||||
BOOST_CHECK(AutoFile(blockman.OpenBlockFile(pos, true)).IsNull());
|
||||
BOOST_CHECK(blockman.OpenBlockFile(pos, true).IsNull());
|
||||
|
||||
// Check that calling with already pruned files doesn't cause an error
|
||||
WITH_LOCK(chainman->GetMutex(), blockman.ScanAndUnlinkAlreadyPrunedFiles());
|
||||
@@ -90,7 +90,7 @@ BOOST_FIXTURE_TEST_CASE(blockmanager_scan_unlink_already_pruned_files, TestChain
|
||||
BOOST_CHECK_NE(old_tip, new_tip);
|
||||
const int new_file_number{WITH_LOCK(chainman->GetMutex(), return new_tip->GetBlockPos().nFile)};
|
||||
const FlatFilePos new_pos(new_file_number, 0);
|
||||
BOOST_CHECK(!AutoFile(blockman.OpenBlockFile(new_pos, true)).IsNull());
|
||||
BOOST_CHECK(!blockman.OpenBlockFile(new_pos, true).IsNull());
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(blockmanager_block_data_availability, TestChain100Setup)
|
||||
|
||||
@@ -19,15 +19,12 @@ FUZZ_TARGET(buffered_file)
|
||||
FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
|
||||
FuzzedFileProvider fuzzed_file_provider = ConsumeFile(fuzzed_data_provider);
|
||||
std::optional<BufferedFile> opt_buffered_file;
|
||||
FILE* fuzzed_file = fuzzed_file_provider.open();
|
||||
CAutoFile fuzzed_file{fuzzed_file_provider.open(), 0};
|
||||
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>());
|
||||
opt_buffered_file.emplace(fuzzed_file, fuzzed_data_provider.ConsumeIntegralInRange<uint64_t>(0, 4096), fuzzed_data_provider.ConsumeIntegralInRange<uint64_t>(0, 4096));
|
||||
} catch (const std::ios_base::failure&) {
|
||||
if (fuzzed_file != nullptr) {
|
||||
fclose(fuzzed_file);
|
||||
}
|
||||
}
|
||||
if (opt_buffered_file && fuzzed_file != nullptr) {
|
||||
if (opt_buffered_file && !fuzzed_file.IsNull()) {
|
||||
bool setpos_fail = false;
|
||||
LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) {
|
||||
CallOneOf(
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#include <chainparams.h>
|
||||
#include <clientversion.h>
|
||||
#include <flatfile.h>
|
||||
#include <test/fuzz/FuzzedDataProvider.h>
|
||||
#include <test/fuzz/fuzz.h>
|
||||
@@ -27,8 +28,8 @@ FUZZ_TARGET(load_external_block_file, .init = initialize_load_external_block_fil
|
||||
{
|
||||
FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
|
||||
FuzzedFileProvider fuzzed_file_provider = ConsumeFile(fuzzed_data_provider);
|
||||
FILE* fuzzed_block_file = fuzzed_file_provider.open();
|
||||
if (fuzzed_block_file == nullptr) {
|
||||
CAutoFile fuzzed_block_file{fuzzed_file_provider.open(), CLIENT_VERSION};
|
||||
if (fuzzed_block_file.IsNull()) {
|
||||
return;
|
||||
}
|
||||
if (fuzzed_data_provider.ConsumeBool()) {
|
||||
|
||||
@@ -249,18 +249,18 @@ BOOST_AUTO_TEST_CASE(streams_serializedata_xor)
|
||||
BOOST_AUTO_TEST_CASE(streams_buffered_file)
|
||||
{
|
||||
fs::path streams_test_filename = m_args.GetDataDirBase() / "streams_test_tmp";
|
||||
FILE* file = fsbridge::fopen(streams_test_filename, "w+b");
|
||||
CAutoFile file{fsbridge::fopen(streams_test_filename, "w+b"), 333};
|
||||
|
||||
// The value at each offset is the offset.
|
||||
for (uint8_t j = 0; j < 40; ++j) {
|
||||
fwrite(&j, 1, 1, file);
|
||||
file << j;
|
||||
}
|
||||
rewind(file);
|
||||
std::rewind(file.Get());
|
||||
|
||||
// The buffer size (second arg) must be greater than the rewind
|
||||
// amount (third arg).
|
||||
try {
|
||||
BufferedFile bfbad{file, 25, 25, 333};
|
||||
BufferedFile bfbad{file, 25, 25};
|
||||
BOOST_CHECK(false);
|
||||
} catch (const std::exception& e) {
|
||||
BOOST_CHECK(strstr(e.what(),
|
||||
@@ -268,7 +268,7 @@ BOOST_AUTO_TEST_CASE(streams_buffered_file)
|
||||
}
|
||||
|
||||
// The buffer is 25 bytes, allow rewinding 10 bytes.
|
||||
BufferedFile bf{file, 25, 10, 333};
|
||||
BufferedFile bf{file, 25, 10};
|
||||
BOOST_CHECK(!bf.eof());
|
||||
|
||||
// This member has no functional effect.
|
||||
@@ -375,7 +375,7 @@ BOOST_AUTO_TEST_CASE(streams_buffered_file)
|
||||
BOOST_CHECK(bf.GetPos() <= 30U);
|
||||
|
||||
// We can explicitly close the file, or the destructor will do it.
|
||||
bf.fclose();
|
||||
file.fclose();
|
||||
|
||||
fs::remove(streams_test_filename);
|
||||
}
|
||||
@@ -383,15 +383,15 @@ BOOST_AUTO_TEST_CASE(streams_buffered_file)
|
||||
BOOST_AUTO_TEST_CASE(streams_buffered_file_skip)
|
||||
{
|
||||
fs::path streams_test_filename = m_args.GetDataDirBase() / "streams_test_tmp";
|
||||
FILE* file = fsbridge::fopen(streams_test_filename, "w+b");
|
||||
CAutoFile file{fsbridge::fopen(streams_test_filename, "w+b"), 333};
|
||||
// The value at each offset is the byte offset (e.g. byte 1 in the file has the value 0x01).
|
||||
for (uint8_t j = 0; j < 40; ++j) {
|
||||
fwrite(&j, 1, 1, file);
|
||||
file << j;
|
||||
}
|
||||
rewind(file);
|
||||
std::rewind(file.Get());
|
||||
|
||||
// The buffer is 25 bytes, allow rewinding 10 bytes.
|
||||
BufferedFile bf{file, 25, 10, 333};
|
||||
BufferedFile bf{file, 25, 10};
|
||||
|
||||
uint8_t i;
|
||||
// This is like bf >> (7-byte-variable), in that it will cause data
|
||||
@@ -425,7 +425,7 @@ BOOST_AUTO_TEST_CASE(streams_buffered_file_skip)
|
||||
bf.SkipTo(13);
|
||||
BOOST_CHECK_EQUAL(bf.GetPos(), 13U);
|
||||
|
||||
bf.fclose();
|
||||
file.fclose();
|
||||
fs::remove(streams_test_filename);
|
||||
}
|
||||
|
||||
@@ -436,16 +436,16 @@ BOOST_AUTO_TEST_CASE(streams_buffered_file_rand)
|
||||
|
||||
fs::path streams_test_filename = m_args.GetDataDirBase() / "streams_test_tmp";
|
||||
for (int rep = 0; rep < 50; ++rep) {
|
||||
FILE* file = fsbridge::fopen(streams_test_filename, "w+b");
|
||||
CAutoFile file{fsbridge::fopen(streams_test_filename, "w+b"), 333};
|
||||
size_t fileSize = InsecureRandRange(256);
|
||||
for (uint8_t i = 0; i < fileSize; ++i) {
|
||||
fwrite(&i, 1, 1, file);
|
||||
file << i;
|
||||
}
|
||||
rewind(file);
|
||||
std::rewind(file.Get());
|
||||
|
||||
size_t bufSize = InsecureRandRange(300) + 1;
|
||||
size_t rewindSize = InsecureRandRange(bufSize);
|
||||
BufferedFile bf{file, bufSize, rewindSize, 333};
|
||||
BufferedFile bf{file, bufSize, rewindSize};
|
||||
size_t currentPos = 0;
|
||||
size_t maxPos = 0;
|
||||
for (int step = 0; step < 100; ++step) {
|
||||
|
||||
Reference in New Issue
Block a user