From 7dc60121e2b22c820f3d3c1fac2acd7bf1245eca Mon Sep 17 00:00:00 2001 From: Bill Scales Date: Mon, 31 Mar 2025 09:17:35 +0100 Subject: [PATCH] test: Add unittests for pgtemp_primaryfirst/pgtemp_undo_primaryfirst Add unittests for pgtemp_primaryfirst and pgtemp_undo_primaryfirst to prove the later is a reverse transform and that neither has any effect until an optimized EC pool configures non-primary shards. Signed-off-by: Bill Scales --- src/test/osd/TestOSDMap.cc | 72 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/src/test/osd/TestOSDMap.cc b/src/test/osd/TestOSDMap.cc index 48c4619d91916..33371c6d944c9 100644 --- a/src/test/osd/TestOSDMap.cc +++ b/src/test/osd/TestOSDMap.cc @@ -3016,6 +3016,78 @@ TEST_F(OSDMapTest, rb_osdsize_opt_score) { return; } +// Test pgtemp_primaryfirst and pgtemp_unfo_primaryfirst transforms +TEST_F(OSDMapTest, pgtemp_primaryfirst) { + set_up_map(); + + pg_pool_t pool; + pool.size = 6; + + vector set= { 0, 1, 2, 3, 4, 5 }; + vector encoded; + vector decoded; + + pg_t rawpg(0, my_ec_pool); + pg_t pgid = osdmap.raw_pg_to_pg(rawpg); + + // Pool without EC optimizations, no pg_temp + encoded = osdmap.pgtemp_primaryfirst(pool, set); + ASSERT_EQ(set, encoded); // no change expected + decoded = osdmap.pgtemp_undo_primaryfirst(pool, pgid, encoded); + ASSERT_EQ(set, decoded); + + // Pool with EC optimizations, no pg_temp + pool.set_flag(pg_pool_t::FLAG_EC_OPTIMIZATIONS); + encoded = osdmap.pgtemp_primaryfirst(pool, set); + ASSERT_EQ(set, encoded); // no change expected + decoded = osdmap.pgtemp_undo_primaryfirst(pool, pgid, encoded); + ASSERT_EQ(set, decoded); + + // Pool without EC optimizations, with pg_temp + pool.unset_flag(pg_pool_t::FLAG_EC_OPTIMIZATIONS); + OSDMap::Incremental pgtemp_map(osdmap.get_epoch() + 1); + pgtemp_map.new_pg_temp[pgid] = mempool::osdmap::vector( + set.begin(), set.end()); + osdmap.apply_incremental(pgtemp_map); + + encoded = osdmap.pgtemp_primaryfirst(pool, set); + ASSERT_EQ(set, encoded); // no change expected + decoded = osdmap.pgtemp_undo_primaryfirst(pool, pgid, encoded); + ASSERT_EQ(set, decoded); + + // Pool with EC optimizations, with pg_temp + // No nonprimary_shards + pool.set_flag(pg_pool_t::FLAG_EC_OPTIMIZATIONS); + encoded = osdmap.pgtemp_primaryfirst(pool, set); + ASSERT_EQ(set, encoded); // no change expected + decoded = osdmap.pgtemp_undo_primaryfirst(pool, pgid, encoded); + ASSERT_EQ(set, decoded); + + // With nonprimary_shards + for (int seed = 1; seed < 64; seed++) { + for (int osd = 0; osd < 6; osd++ ) { + if (seed & (1 << osd)) { + pool.nonprimary_shards.insert(shard_id_t(osd)); + } else { + pool.nonprimary_shards.erase(shard_id_t(osd)); + } + } + ASSERT_TRUE(pool.nonprimary_shards.size() > 0); + encoded = osdmap.pgtemp_primaryfirst(pool, set); + for (size_t osd = 0; osd < 6; osd++ ) { + if (osd < pool.size - pool.nonprimary_shards.size() ) { + // primary shards first + ASSERT_FALSE(pool.is_nonprimary_shard(shard_id_t(encoded[osd]))); + } else { + // non-primary shards last + ASSERT_TRUE(pool.is_nonprimary_shard(shard_id_t(encoded[osd]))); + } + } + decoded = osdmap.pgtemp_undo_primaryfirst(pool, pgid, encoded); + ASSERT_EQ(set, decoded); + } +} + INSTANTIATE_TEST_SUITE_P( OSDMap, OSDMapTest, -- 2.39.5