Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8cc1a791 authored by Daniel Zheng's avatar Daniel Zheng Committed by Automerger Merge Worker
Browse files

Merge "libsnapshot: Implement CowWriterV3::EmitCopy" into main am: c7c6605c

parents 1030ce46 c7c6605c
Loading
Loading
Loading
Loading
+36 −0
Original line number Diff line number Diff line
@@ -206,5 +206,41 @@ TEST_F(CowTestV3, ConsecutiveReplaceOp) {
    ASSERT_EQ(i, 5);
}

TEST_F(CowTestV3, CopyOp) {
    CowOptions options;
    options.op_count_max = 100;
    auto writer = CreateCowWriter(3, options, GetCowFd());

    ASSERT_TRUE(writer->AddCopy(10, 1000, 100));
    ASSERT_TRUE(writer->Finalize());
    ASSERT_EQ(lseek(cow_->fd, 0, SEEK_SET), 0);

    CowReader reader;
    ASSERT_TRUE(reader.Parse(cow_->fd));

    const auto& header = reader.GetHeader();
    ASSERT_EQ(header.prefix.magic, kCowMagicNumber);
    ASSERT_EQ(header.prefix.major_version, 3);
    ASSERT_EQ(header.prefix.minor_version, kCowVersionMinor);
    ASSERT_EQ(header.block_size, options.block_size);

    auto iter = reader.GetOpIter();
    ASSERT_NE(iter, nullptr);
    ASSERT_FALSE(iter->AtEnd());

    size_t i = 0;
    while (!iter->AtEnd()) {
        auto op = iter->Get();
        ASSERT_EQ(op->type, kCowCopyOp);
        ASSERT_EQ(op->data_length, 0);
        ASSERT_EQ(op->new_block, 10 + i);
        ASSERT_EQ(GetCowOpSourceInfoData(*op), 1000 + i);
        iter->Next();
        i += 1;
    }

    ASSERT_EQ(i, 100);
}

}  // namespace snapshot
}  // namespace android
+11 −3
Original line number Diff line number Diff line
@@ -168,10 +168,18 @@ bool CowWriterV3::OpenForWrite() {
}

bool CowWriterV3::EmitCopy(uint64_t new_block, uint64_t old_block, uint64_t num_blocks) {
    LOG(ERROR) << __LINE__ << " " << __FILE__ << " <- function here should never be called";
    if (new_block || old_block || num_blocks) return false;
    for (size_t i = 0; i < num_blocks; i++) {
        CowOperationV3 op = {};
        op.type = kCowCopyOp;
        op.new_block = new_block + i;
        op.source_info = old_block + i;
        if (!WriteOperation(op)) {
            return false;
        }
    }

    return true;
}

bool CowWriterV3::EmitRawBlocks(uint64_t new_block_start, const void* data, size_t size) {
    return EmitBlocks(new_block_start, data, size, 0, 0, kCowReplaceOp);