libsnapshot: Set default cluster size to 200

Grouping metadata into clusters decreases the overhead occured by extra
reads. Assuming a constant added cost with reads, we currently measure
this to be around 1.2 microseconds. For an entire OTA, this can add up
to several seconds of time. Setting the cluster size to 200 removes
99.5% of that extra time, while adding 20 bytes per 200 ops, as well as
up to 200*20 byes (4kb) unused space near the end of the file, although
it would be half of that on average. We save 99.5% of the overhead of
separate reads for a 0.5% space increase.

We've opted for a change to the default so that tools that estimate cow
size and any others will automatically be kept up to date, without
needing to update the value everywhere.

Bug: 172026020
Test: cow_api_test
Change-Id: Id4525cf2abfecf4691b46588823cb3cb4f6234d9
This commit is contained in:
Daniel Rosenberg 2021-01-11 21:10:21 -08:00
parent bedae3910c
commit db03c5a18e
2 changed files with 10 additions and 1 deletions

View File

@ -60,6 +60,7 @@ class StringSink : public IByteSink {
TEST_F(CowTest, ReadWrite) {
CowOptions options;
options.cluster_ops = 0;
CowWriter writer(options);
ASSERT_TRUE(writer.Initialize(cow_->fd));
@ -137,6 +138,7 @@ TEST_F(CowTest, ReadWrite) {
TEST_F(CowTest, CompressGz) {
CowOptions options;
options.cluster_ops = 0;
options.compression = "gz";
CowWriter writer(options);
@ -238,6 +240,7 @@ TEST_F(CowTest, ClusterCompressGz) {
TEST_F(CowTest, CompressTwoBlocks) {
CowOptions options;
options.compression = "gz";
options.cluster_ops = 0;
CowWriter writer(options);
ASSERT_TRUE(writer.Initialize(cow_->fd));
@ -280,6 +283,7 @@ class CompressionTest : public CowTest, public testing::WithParamInterface<const
TEST_P(CompressionTest, HorribleSink) {
CowOptions options;
options.compression = GetParam();
options.cluster_ops = 0;
CowWriter writer(options);
ASSERT_TRUE(writer.Initialize(cow_->fd));
@ -309,6 +313,7 @@ INSTANTIATE_TEST_SUITE_P(CowApi, CompressionTest, testing::Values("none", "gz",
TEST_F(CowTest, GetSize) {
CowOptions options;
options.cluster_ops = 0;
CowWriter writer(options);
if (ftruncate(cow_->fd, 0) < 0) {
perror("Fails to set temp file size");
@ -334,6 +339,7 @@ TEST_F(CowTest, GetSize) {
TEST_F(CowTest, AppendLabelSmall) {
CowOptions options;
options.cluster_ops = 0;
auto writer = std::make_unique<CowWriter>(options);
ASSERT_TRUE(writer->Initialize(cow_->fd));
@ -399,6 +405,7 @@ TEST_F(CowTest, AppendLabelSmall) {
TEST_F(CowTest, AppendLabelMissing) {
CowOptions options;
options.cluster_ops = 0;
auto writer = std::make_unique<CowWriter>(options);
ASSERT_TRUE(writer->Initialize(cow_->fd));
@ -452,6 +459,7 @@ TEST_F(CowTest, AppendLabelMissing) {
TEST_F(CowTest, AppendExtendedCorrupted) {
CowOptions options;
options.cluster_ops = 0;
auto writer = std::make_unique<CowWriter>(options);
ASSERT_TRUE(writer->Initialize(cow_->fd));
@ -504,6 +512,7 @@ TEST_F(CowTest, AppendExtendedCorrupted) {
TEST_F(CowTest, AppendbyLabel) {
CowOptions options;
options.cluster_ops = 0;
auto writer = std::make_unique<CowWriter>(options);
ASSERT_TRUE(writer->Initialize(cow_->fd));

View File

@ -35,7 +35,7 @@ struct CowOptions {
std::optional<uint64_t> max_blocks;
// Number of CowOperations in a cluster. 0 for no clustering. Cannot be 1.
uint32_t cluster_ops = 0;
uint32_t cluster_ops = 200;
};
// Interface for writing to a snapuserd COW. All operations are ordered; merges