Skip to content

Commit f48a0cc

Browse files
authored
Null Piece data (#560)
* Add null piece_data. Signed-off-by: Markuu-s <[email protected]> * Add test for null piece_data. Signed-off-by: Markuu-s <[email protected]> * Fix sealing_test. Fix comments from pull request. Signed-off-by: Markuu-s <[email protected]> * Fixed constructors. Added test. Signed-off-by: Markuu-s <[email protected]> * Changed the getting of Null PieceData. Signed-off-by: Markuu-s <[email protected]>
1 parent 1a1c039 commit f48a0cc

File tree

8 files changed

+153
-19
lines changed

8 files changed

+153
-19
lines changed

core/miner/storage_fsm/impl/sealing_impl.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ namespace fc::mining {
223223
for (const auto &pad : sector_and_padding.pads) {
224224
OUTCOME_TRY(addPiece(sector_and_padding.sector,
225225
pad.unpadded(),
226-
PieceData("/dev/zero"),
226+
PieceData::makeNull(),
227227
boost::none));
228228
}
229229

@@ -900,7 +900,7 @@ namespace fc::mining {
900900
OUTCOME_TRY(
901901
piece_info,
902902
sealer_->addPieceSync(
903-
sector, existing_piece_sizes, size, PieceData("/dev/zero"), 0));
903+
sector, existing_piece_sizes, size, PieceData::makeNull(), 0));
904904

905905
existing_piece_sizes.push_back(size);
906906

core/primitives/piece/impl/piece_data.cpp

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,25 @@
88
#include <boost/filesystem.hpp>
99

1010
namespace fc::primitives::piece {
11-
PieceData::PieceData(const std::string &path_to_file, int flags) {
11+
PieceData::PieceData(const std::string &path_to_file, int flags)
12+
: is_null_data_(false) {
1213
fd_ = open(path_to_file.c_str(), flags, 0644);
1314
}
1415

16+
PieceData::PieceData(PieceData &&other) noexcept
17+
: fd_(other.fd_), is_null_data_(other.is_null_data_) {
18+
other.fd_ = kUnopenedFileDescriptor;
19+
other.is_null_data_ = false;
20+
}
21+
22+
PieceData::PieceData(int &pipe_fd) : fd_(pipe_fd), is_null_data_(false) {
23+
pipe_fd = kUnopenedFileDescriptor;
24+
}
25+
26+
PieceData::PieceData() : fd_(kUnopenedFileDescriptor), is_null_data_(false) {}
27+
1528
int PieceData::getFd() const {
29+
assert(not is_null_data_);
1630
return fd_;
1731
}
1832

@@ -26,19 +40,25 @@ namespace fc::primitives::piece {
2640
return fd_ != kUnopenedFileDescriptor;
2741
}
2842

29-
PieceData::PieceData(PieceData &&other) noexcept
30-
: fd_(kUnopenedFileDescriptor) {
31-
fd_ = other.fd_;
32-
other.fd_ = kUnopenedFileDescriptor;
43+
bool PieceData::isNullData() const {
44+
return is_null_data_;
3345
}
3446

35-
PieceData::PieceData(int &pipe_fd) : fd_(pipe_fd) {
36-
pipe_fd = kUnopenedFileDescriptor;
47+
PieceData PieceData::makeNull() {
48+
PieceData temp = PieceData();
49+
temp.is_null_data_ = true;
50+
return temp;
3751
}
3852

3953
PieceData &PieceData::operator=(PieceData &&other) noexcept {
54+
if (fd_ != kUnopenedFileDescriptor) {
55+
close(fd_);
56+
}
4057
fd_ = other.fd_;
58+
is_null_data_ = other.is_null_data_;
59+
4160
other.fd_ = kUnopenedFileDescriptor;
61+
other.is_null_data_ = false;
4262
return *this;
4363
}
4464
} // namespace fc::primitives::piece

core/primitives/piece/piece_data.hpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ namespace fc::primitives::piece {
1515
class PieceData {
1616
public:
1717
explicit PieceData(const std::string &path_to_file, int flags = O_RDWR);
18-
explicit PieceData(int &pipe_fd);
18+
explicit PieceData(int &pipe_fd); // pipe_fd is out parameter and is
19+
// expected to be set -1 after call.
1920

2021
PieceData(const PieceData &) = delete;
2122
PieceData &operator=(const PieceData &) = delete;
@@ -28,8 +29,15 @@ namespace fc::primitives::piece {
2829

2930
bool isOpened() const;
3031

32+
bool isNullData() const;
33+
34+
static PieceData makeNull();
35+
3136
private:
37+
PieceData();
38+
3239
int fd_;
40+
bool is_null_data_;
3341
};
3442

3543
} // namespace fc::primitives::piece

core/primitives/sector_file/sector_file.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "primitives/rle_bitset/runs_utils.hpp"
1616
#include "primitives/sector/sector.hpp"
1717
#include "proofs/impl/proof_engine_impl.hpp"
18+
#include "sector_storage/zerocomm/zerocomm.hpp"
1819

1920
namespace fc::primitives::sector_file {
2021

@@ -350,6 +351,10 @@ namespace fc::primitives::sector_file {
350351
PaddedByteIndex offset,
351352
PaddedPieceSize size,
352353
const boost::optional<RegisteredSealProof> &maybe_seal_proof_type) {
354+
if (data.isNullData()) {
355+
return writeNull(offset, size, maybe_seal_proof_type.has_value());
356+
}
357+
353358
if (not data.isOpened()) {
354359
return SectorFileError::kPipeNotOpen;
355360
}
@@ -454,6 +459,32 @@ namespace fc::primitives::sector_file {
454459
};
455460
}
456461

462+
outcome::result<boost::optional<PieceInfo>> SectorFile::writeNull(
463+
PaddedByteIndex offset, PaddedPieceSize size, bool need_piece_info) {
464+
if (not file_.good()) {
465+
return SectorFileError::kInvalidFile;
466+
}
467+
468+
const auto piece = runsAnd(runs_, std::vector<uint64_t>({offset, size}));
469+
OUTCOME_TRY(allocated_size, runsCount(piece));
470+
471+
assert(allocated_size == 0 && "Overwriting with zeros is not available");
472+
// TODO (@Markuu-s) Overwriting with zeros
473+
// here we write zeros. but file already zero-filled, so do nothing
474+
475+
OUTCOME_TRY(markAllocated(offset, size));
476+
477+
if (not need_piece_info) {
478+
return boost::none;
479+
}
480+
481+
OUTCOME_TRY(
482+
cid,
483+
fc::sector_storage::zerocomm::getZeroPieceCommitment(size.unpadded()));
484+
485+
return PieceInfo{.size = size, .cid = cid};
486+
}
487+
457488
outcome::result<bool> SectorFile::read(const PieceData &output,
458489
PaddedByteIndex offset,
459490
PaddedPieceSize size) {

core/primitives/sector_file/sector_file.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#pragma once
77

88
#include <fstream>
9+
#include <map>
910
#include <string>
1011
#include <unordered_map>
1112

@@ -122,6 +123,9 @@ namespace fc::primitives::sector_file {
122123
outcome::result<void> markAllocated(PaddedByteIndex offset,
123124
PaddedPieceSize size);
124125

126+
outcome::result<boost::optional<PieceInfo>> writeNull(
127+
PaddedByteIndex offset, PaddedPieceSize size, bool need_piece_info);
128+
125129
struct PadWriter {
126130
public:
127131
explicit PadWriter(std::fstream &output);

test/core/miner/sealing_test.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -424,8 +424,9 @@ namespace fc::mining {
424424
* @then SealingError::kUpgradeSeveralPieces occurs
425425
*/
426426
TEST_F(SealingTest, MarkForUpgradeSeveralPieces) {
427-
UnpaddedPieceSize piece_size(127);
427+
const UnpaddedPieceSize piece_size(127);
428428
PieceData piece("/dev/random");
429+
PieceData piece2("/dev/random");
429430
DealInfo deal{
430431
.publish_cid = "010001020001"_cid,
431432
.deal_id = 0,
@@ -471,7 +472,7 @@ namespace fc::mining {
471472
EXPECT_OUTCOME_TRUE_1(
472473
sealing_->addPieceToAnySector(piece_size, std::move(piece), deal));
473474
EXPECT_OUTCOME_TRUE_1(
474-
sealing_->addPieceToAnySector(piece_size, std::move(piece), deal));
475+
sealing_->addPieceToAnySector(piece_size, std::move(piece2), deal));
475476

476477
EXPECT_OUTCOME_TRUE_1(
477478
sealing_->forceSectorState(sector, SealingState::kProving));
@@ -887,12 +888,12 @@ namespace fc::mining {
887888

888889
SectorRef sector_ref{.id = sector_id, .proof_type = seal_proof_type_};
889890
std::vector<UnpaddedPieceSize> exist_pieces = {};
890-
EXPECT_CALL(*manager_,
891-
doAddPieceSync(sector_ref,
892-
gsl::span<const UnpaddedPieceSize>(exist_pieces),
893-
PaddedPieceSize(sector_size_).unpadded(),
894-
_,
895-
0))
891+
EXPECT_CALL(
892+
*manager_,
893+
doNullAddPieceSync(sector_ref,
894+
gsl::span<const UnpaddedPieceSize>(exist_pieces),
895+
PaddedPieceSize(sector_size_).unpadded(),
896+
0))
896897
.WillOnce(testing::Return(outcome::success(info)));
897898

898899
ASSERT_EQ(sealing_->getListSectors().size(), 1);

test/core/primitives/sector_file/sector_file_test.cpp

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "primitives/sector_file/sector_file.hpp"
77

88
#include <gtest/gtest.h>
9+
#include "sector_storage/zerocomm/zerocomm.hpp"
910
#include "testutil/outcome.hpp"
1011
#include "testutil/read_file.hpp"
1112
#include "testutil/resources/resources.hpp"
@@ -240,9 +241,67 @@ namespace fc::primitives::sector_file {
240241
EXPECT_OUTCOME_TRUE(
241242
sector_size,
242243
fc::primitives::sector::getSectorSize(min_seal_proof_type));
243-
uint64_t result =
244+
const uint64_t result =
244245
kOverheadSeal.at(file_type) * sector_size / kOverheadDenominator;
245246
EXPECT_OUTCOME_TRUE(seal_size, sealSpaceUse(file_type, sector_size));
246247
ASSERT_EQ(result, seal_size);
247248
}
249+
250+
TEST_F(SectorFileTest, checkFlag) {
251+
EXPECT_TRUE(PieceData::makeNull().isNullData());
252+
}
253+
254+
/*
255+
* TODO (@Markuu-s) add tests: CannotMoveCursor and checkAssertGetFd
256+
* Problem: ASAN-build doesn't pass these tests
257+
*/
258+
259+
TEST_F(SectorFileTest, WriteNullPiece) {
260+
EXPECT_OUTCOME_TRUE(
261+
sector_size,
262+
fc::primitives::sector::getSectorSize(min_seal_proof_type));
263+
const SectorId sector{
264+
.miner = 1,
265+
.sector = 1,
266+
};
267+
268+
const PaddedPieceSize piece_size(128);
269+
270+
EXPECT_OUTCOME_TRUE(result_cid,
271+
fc::sector_storage::zerocomm::getZeroPieceCommitment(
272+
piece_size.unpadded()));
273+
EXPECT_OUTCOME_TRUE(
274+
file,
275+
SectorFile::createFile(
276+
(base_path / fc::primitives::sector_file::sectorName(sector))
277+
.string(),
278+
PaddedPieceSize(sector_size)));
279+
280+
EXPECT_OUTCOME_TRUE(
281+
piece_info,
282+
file->write(PieceData::makeNull(), 0, piece_size, min_seal_proof_type));
283+
284+
ASSERT_EQ(piece_info->size, piece_size);
285+
EXPECT_EQ(piece_info->cid, result_cid);
286+
EXPECT_OUTCOME_EQ(file->hasAllocated(0, piece_size.unpadded()), true);
287+
288+
EXPECT_OUTCOME_TRUE(cid,
289+
fc::sector_storage::zerocomm::getZeroPieceCommitment(
290+
piece_size.unpadded()));
291+
292+
EXPECT_EQ(piece_info->cid, cid);
293+
294+
const boost::filesystem::path read_file_path =
295+
base_path / fs::unique_path();
296+
EXPECT_OUTCOME_TRUE_1(file->read(
297+
PieceData(read_file_path.string(), O_WRONLY | O_CREAT), 0, piece_size));
298+
const std::vector<unsigned char> read_data = readFile(read_file_path);
299+
300+
ASSERT_EQ(read_data.size(), piece_size.unpadded());
301+
const std::string result_data = std::string(piece_size.unpadded(), '\0');
302+
ASSERT_EQ(
303+
read_data,
304+
std::vector<unsigned char>(result_data.begin(), result_data.end()));
305+
}
306+
248307
} // namespace fc::primitives::sector_file

test/testutil/mocks/sector_storage/manager_mock.hpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,12 +172,23 @@ namespace fc::sector_storage {
172172
int,
173173
uint64_t priority));
174174

175+
MOCK_METHOD4(doNullAddPieceSync,
176+
outcome::result<PieceInfo>(
177+
const SectorRef &sector,
178+
gsl::span<const UnpaddedPieceSize> piece_sizes,
179+
const UnpaddedPieceSize &new_piece_size,
180+
uint64_t priority));
181+
175182
outcome::result<PieceInfo> addPieceSync(
176183
const SectorRef &sector,
177184
gsl::span<const UnpaddedPieceSize> piece_sizes,
178185
const UnpaddedPieceSize &new_piece_size,
179186
proofs::PieceData piece_data,
180187
uint64_t priority) override {
188+
if (piece_data.isNullData()) {
189+
return doNullAddPieceSync(
190+
sector, piece_sizes, new_piece_size, priority);
191+
}
181192
return doAddPieceSync(
182193
sector, piece_sizes, new_piece_size, piece_data.getFd(), priority);
183194
}

0 commit comments

Comments
 (0)