Merge "Fix cow v3 size estimation errors" into main

This commit is contained in:
Treehugger Robot 2023-12-06 06:32:13 +00:00 committed by Gerrit Code Review
commit 442990fc5c
2 changed files with 23 additions and 5 deletions

View file

@ -15,17 +15,15 @@
#include <sys/stat.h>
#include <cstdio>
#include <iostream>
#include <memory>
#include <string_view>
#include <android-base/file.h>
#include <android-base/logging.h>
#include <android-base/unique_fd.h>
#include <gtest/gtest.h>
#include <libsnapshot/cow_format.h>
#include <libsnapshot/cow_reader.h>
#include <libsnapshot/cow_writer.h>
#include "cow_decompress.h"
#include "libsnapshot/cow_format.h"
#include "writer_v2.h"
#include "writer_v3.h"
@ -658,5 +656,20 @@ TEST_F(CowTestV3, SetTypeSourceInverleave) {
ASSERT_EQ(op.type(), kCowReplaceOp);
}
TEST_F(CowTestV3, CowSizeEstimate) {
CowOptions options{};
options.compression = "none";
auto estimator = android::snapshot::CreateCowEstimator(3, options);
ASSERT_TRUE(estimator->AddZeroBlocks(0, 1024 * 1024));
const auto cow_size = estimator->GetCowSize();
options.op_count_max = 1024 * 1024;
options.max_blocks = 1024 * 1024;
CowWriterV3 writer(options, GetCowFd());
ASSERT_TRUE(writer.Initialize());
ASSERT_TRUE(writer.AddZeroBlocks(0, 1024 * 1024));
ASSERT_LE(writer.GetCowSize(), cow_size);
}
} // namespace snapshot
} // namespace android

View file

@ -327,7 +327,12 @@ bool CowWriterV3::EmitSequenceData(size_t num_ops, const uint32_t* data) {
bool CowWriterV3::WriteOperation(const CowOperationV3& op, const void* data, size_t size) {
if (IsEstimating()) {
header_.op_count++;
header_.op_count_max++;
if (header_.op_count > header_.op_count_max) {
// If we increment op_count_max, the offset of data section would
// change. So need to update |next_data_pos_|
next_data_pos_ += (header_.op_count - header_.op_count_max) * sizeof(CowOperationV3);
header_.op_count_max = header_.op_count;
}
next_data_pos_ += op.data_length;
return true;
}