1616#include < gtest/gtest.h>
1717
1818
19- TEST (TestRGWReshard, dynamic_reshard_shard_count )
19+ TEST (TestRGWReshard, max_prime_shards )
2020{
2121 // assuming we have prime numbers up to 1999
2222 ASSERT_EQ (1999u , RGWBucketReshard::get_max_prime_shards ()) <<
2323 " initial list has primes up to 1999" ;
24+ }
2425
26+ TEST (TestRGWReshard, prime_lookups)
27+ {
2528 ASSERT_EQ (1u , RGWBucketReshard::get_prime_shards_greater_or_equal (1 )) <<
2629 " we allow for 1 shard even though it's not prime" ;
2730 ASSERT_EQ (809u , RGWBucketReshard::get_prime_shards_greater_or_equal (808 )) <<
@@ -47,24 +50,72 @@ TEST(TestRGWReshard, dynamic_reshard_shard_count)
4750 " 811 is prime" ;
4851 ASSERT_EQ (811u , RGWBucketReshard::get_prime_shards_less_or_equal (812 )) <<
4952 " 821 is prime" ;
53+ }
5054
55+ TEST (TestRGWReshard, nearest_prime)
56+ {
5157 // tests when max dynamic shards is equal to end of prime list
52- ASSERT_EQ (1999u , RGWBucketReshard::get_prime_shard_count (1998 , 1999 , 11 ));
53- ASSERT_EQ (1999u , RGWBucketReshard::get_prime_shard_count (1999 , 1999 , 11 ));
54- ASSERT_EQ (1999u , RGWBucketReshard::get_prime_shard_count (2000 , 1999 , 11 ));
55-
56- // tests when max dynamic shards is above end of prime list
57- ASSERT_EQ (1999u , RGWBucketReshard::get_prime_shard_count (1998 , 3000 , 11 ));
58- ASSERT_EQ (1999u , RGWBucketReshard::get_prime_shard_count (1999 , 3000 , 11 ));
59- ASSERT_EQ (2000u , RGWBucketReshard::get_prime_shard_count (2000 , 3000 , 11 ));
60- ASSERT_EQ (2001u , RGWBucketReshard::get_prime_shard_count (2001 , 3000 , 11 ));
61-
62- // tests when max dynamic shards is below end of prime list
63- ASSERT_EQ (500u , RGWBucketReshard::get_prime_shard_count (1998 , 500 , 11 ));
64- ASSERT_EQ (500u , RGWBucketReshard::get_prime_shard_count (2001 , 500 , 11 ));
65-
66- // tests when max dynamic shards is below end of prime list
67- ASSERT_EQ (499u , RGWBucketReshard::get_prime_shard_count (498 , 1999 , 499 ));
68- ASSERT_EQ (499u , RGWBucketReshard::get_prime_shard_count (499 , 1999 , 499 ));
69- ASSERT_EQ (503u , RGWBucketReshard::get_prime_shard_count (500 , 1999 , 499 ));
58+
59+ ASSERT_EQ (239u , RGWBucketReshard::nearest_prime (238 ));
60+ ASSERT_EQ (239u , RGWBucketReshard::nearest_prime (239 ));
61+ ASSERT_EQ (241u , RGWBucketReshard::nearest_prime (240 ));
62+ ASSERT_EQ (241u , RGWBucketReshard::nearest_prime (241 ));
63+ ASSERT_EQ (251u , RGWBucketReshard::nearest_prime (242 ));
64+
65+ ASSERT_EQ (1997u , RGWBucketReshard::nearest_prime (1995 ));
66+ ASSERT_EQ (1997u , RGWBucketReshard::nearest_prime (1996 ));
67+ ASSERT_EQ (1997u , RGWBucketReshard::nearest_prime (1997 ));
68+ ASSERT_EQ (1999u , RGWBucketReshard::nearest_prime (1998 ));
69+ ASSERT_EQ (1999u , RGWBucketReshard::nearest_prime (1999 ));
70+ ASSERT_EQ (2000u , RGWBucketReshard::nearest_prime (2000 ));
71+ }
72+
73+ TEST (TestRGWReshard, calculate_preferred_shards)
74+ {
75+ bool needs_resharding;
76+ uint32_t suggested_shard_count = 0 ;
77+
78+ RGWBucketReshard::calculate_preferred_shards (nullptr , 1999 , 101 , 100000 , false , 10000000 , 200 ,
79+ needs_resharding, &suggested_shard_count);
80+
81+ ASSERT_EQ (false , needs_resharding) << " no need to reshard when shards are half-used" ;
82+
83+
84+ RGWBucketReshard::calculate_preferred_shards (nullptr , 1999 , 101 , 100000 , false , 20200000 , 200 ,
85+ needs_resharding, &suggested_shard_count, false );
86+ ASSERT_EQ (true , needs_resharding);
87+ ASSERT_EQ (404 , suggested_shard_count) << " number of shards when primes are not preferred" ;
88+
89+ RGWBucketReshard::calculate_preferred_shards (nullptr , 1999 , 101 , 100000 , false , 20200000 , 200 ,
90+ needs_resharding, &suggested_shard_count, true );
91+ ASSERT_EQ (true , needs_resharding);
92+ ASSERT_EQ (409 , suggested_shard_count) << " number of shards when primes are preferred" ;
93+
94+ RGWBucketReshard::calculate_preferred_shards (nullptr , 1999 , 101 , 100000 , true , 20200000 , 200 ,
95+ needs_resharding, &suggested_shard_count, true );
96+ ASSERT_EQ (true , needs_resharding);
97+ ASSERT_EQ (1619 , suggested_shard_count) <<
98+ " number of shards under multisite with primes preferred since "
99+ " multisite quadruples number of shards to reduce need to reshaard" ;
100+
101+ RGWBucketReshard::calculate_preferred_shards (nullptr , 1999 , 3 , 100000 , false , 650000 , 700 ,
102+ needs_resharding, &suggested_shard_count, true );
103+ // 650,000 objs across 700 shards -> <1000 objs per shard; 650000 /
104+ // 50000 = 13
105+ ASSERT_EQ (true , needs_resharding);
106+ ASSERT_EQ (13 , suggested_shard_count) << " shard reduction without hitting min_layout_shards" ;
107+
108+ RGWBucketReshard::calculate_preferred_shards (nullptr , 1999 , 3 , 100000 , false , 350000 , 400 ,
109+ needs_resharding, &suggested_shard_count, true );
110+ // 350,000 objs across 400 shards -> <1000 objs per shard; 350000 /
111+ // 50000 = 7, but hard-coded minimum of 11
112+ ASSERT_EQ (true , needs_resharding);
113+ ASSERT_EQ (11 , suggested_shard_count) << " shard reduction and hitting hard-coded minimum of 11" ;
114+
115+ RGWBucketReshard::calculate_preferred_shards (nullptr , 1999 , 51 , 100000 , false , 650000 , 700 ,
116+ needs_resharding, &suggested_shard_count, true );
117+ // 650,000 objs across 700 shards -> <1000 objs per shard; 650000 /
118+ // 50000 = 13, but bucket min of 51
119+ ASSERT_EQ (true , needs_resharding);
120+ ASSERT_EQ (51 , suggested_shard_count) << " shard reduction and hitting min_layout_shards" ;
70121}
0 commit comments