Skip to content

Commit 7dc6012

Browse files
committed
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 <[email protected]>
1 parent 9a5d55c commit 7dc6012

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed

src/test/osd/TestOSDMap.cc

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3016,6 +3016,78 @@ TEST_F(OSDMapTest, rb_osdsize_opt_score) {
30163016
return;
30173017
}
30183018

3019+
// Test pgtemp_primaryfirst and pgtemp_unfo_primaryfirst transforms
3020+
TEST_F(OSDMapTest, pgtemp_primaryfirst) {
3021+
set_up_map();
3022+
3023+
pg_pool_t pool;
3024+
pool.size = 6;
3025+
3026+
vector<int> set= { 0, 1, 2, 3, 4, 5 };
3027+
vector<int> encoded;
3028+
vector<int> decoded;
3029+
3030+
pg_t rawpg(0, my_ec_pool);
3031+
pg_t pgid = osdmap.raw_pg_to_pg(rawpg);
3032+
3033+
// Pool without EC optimizations, no pg_temp
3034+
encoded = osdmap.pgtemp_primaryfirst(pool, set);
3035+
ASSERT_EQ(set, encoded); // no change expected
3036+
decoded = osdmap.pgtemp_undo_primaryfirst(pool, pgid, encoded);
3037+
ASSERT_EQ(set, decoded);
3038+
3039+
// Pool with EC optimizations, no pg_temp
3040+
pool.set_flag(pg_pool_t::FLAG_EC_OPTIMIZATIONS);
3041+
encoded = osdmap.pgtemp_primaryfirst(pool, set);
3042+
ASSERT_EQ(set, encoded); // no change expected
3043+
decoded = osdmap.pgtemp_undo_primaryfirst(pool, pgid, encoded);
3044+
ASSERT_EQ(set, decoded);
3045+
3046+
// Pool without EC optimizations, with pg_temp
3047+
pool.unset_flag(pg_pool_t::FLAG_EC_OPTIMIZATIONS);
3048+
OSDMap::Incremental pgtemp_map(osdmap.get_epoch() + 1);
3049+
pgtemp_map.new_pg_temp[pgid] = mempool::osdmap::vector<int>(
3050+
set.begin(), set.end());
3051+
osdmap.apply_incremental(pgtemp_map);
3052+
3053+
encoded = osdmap.pgtemp_primaryfirst(pool, set);
3054+
ASSERT_EQ(set, encoded); // no change expected
3055+
decoded = osdmap.pgtemp_undo_primaryfirst(pool, pgid, encoded);
3056+
ASSERT_EQ(set, decoded);
3057+
3058+
// Pool with EC optimizations, with pg_temp
3059+
// No nonprimary_shards
3060+
pool.set_flag(pg_pool_t::FLAG_EC_OPTIMIZATIONS);
3061+
encoded = osdmap.pgtemp_primaryfirst(pool, set);
3062+
ASSERT_EQ(set, encoded); // no change expected
3063+
decoded = osdmap.pgtemp_undo_primaryfirst(pool, pgid, encoded);
3064+
ASSERT_EQ(set, decoded);
3065+
3066+
// With nonprimary_shards
3067+
for (int seed = 1; seed < 64; seed++) {
3068+
for (int osd = 0; osd < 6; osd++ ) {
3069+
if (seed & (1 << osd)) {
3070+
pool.nonprimary_shards.insert(shard_id_t(osd));
3071+
} else {
3072+
pool.nonprimary_shards.erase(shard_id_t(osd));
3073+
}
3074+
}
3075+
ASSERT_TRUE(pool.nonprimary_shards.size() > 0);
3076+
encoded = osdmap.pgtemp_primaryfirst(pool, set);
3077+
for (size_t osd = 0; osd < 6; osd++ ) {
3078+
if (osd < pool.size - pool.nonprimary_shards.size() ) {
3079+
// primary shards first
3080+
ASSERT_FALSE(pool.is_nonprimary_shard(shard_id_t(encoded[osd])));
3081+
} else {
3082+
// non-primary shards last
3083+
ASSERT_TRUE(pool.is_nonprimary_shard(shard_id_t(encoded[osd])));
3084+
}
3085+
}
3086+
decoded = osdmap.pgtemp_undo_primaryfirst(pool, pgid, encoded);
3087+
ASSERT_EQ(set, decoded);
3088+
}
3089+
}
3090+
30193091
INSTANTIATE_TEST_SUITE_P(
30203092
OSDMap,
30213093
OSDMapTest,

0 commit comments

Comments
 (0)