@@ -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+
30193091INSTANTIATE_TEST_SUITE_P (
30203092 OSDMap,
30213093 OSDMapTest,
0 commit comments