@@ -183,6 +183,9 @@ TEST_F(MigrationStrategyTest, TestInCacheConfig) {
183183 "migration_config": {
184184 "copy_max_concurrency": 6,
185185 "mark_clear_policy": 1,
186+ "copy_connect_timeout_ms": 750,
187+ "copy_submit_timeout_ms": 2500,
188+ "copy_query_timeout_ms": 2800,
186189 "strategies": [
187190 {
188191 "source_storage_name": "pace_mempool_01",
@@ -204,6 +207,9 @@ TEST_F(MigrationStrategyTest, TestInCacheConfig) {
204207 ASSERT_TRUE (cache_config.FromJsonString (json));
205208 ASSERT_EQ (6 , cache_config.migration_copy_max_concurrency ());
206209 ASSERT_EQ (MigrationMarkClearPolicy::CLEAR_ON_FULL_BLOCK_COVERED , cache_config.migration_mark_clear_policy ());
210+ ASSERT_EQ (750 , cache_config.migration_copy_connect_timeout_ms ());
211+ ASSERT_EQ (2500 , cache_config.migration_copy_submit_timeout_ms ());
212+ ASSERT_EQ (2800 , cache_config.migration_copy_query_timeout_ms ());
207213 ASSERT_EQ (2u , cache_config.migration_strategies ().size ());
208214 ASSERT_EQ (" pace_mempool_01" , cache_config.migration_strategies ()[0 ]->source_storage_name ());
209215 ASSERT_EQ (" pace_ssd_02" , cache_config.migration_strategies ()[1 ]->target_storage_name ());
@@ -214,6 +220,9 @@ TEST_F(MigrationStrategyTest, TestInCacheConfig) {
214220 ASSERT_TRUE (parsed.FromJsonString (cache_config.ToJsonString ()));
215221 ASSERT_EQ (6 , parsed.migration_copy_max_concurrency ());
216222 ASSERT_EQ (MigrationMarkClearPolicy::CLEAR_ON_FULL_BLOCK_COVERED , parsed.migration_mark_clear_policy ());
223+ ASSERT_EQ (750 , parsed.migration_copy_connect_timeout_ms ());
224+ ASSERT_EQ (2500 , parsed.migration_copy_submit_timeout_ms ());
225+ ASSERT_EQ (2800 , parsed.migration_copy_query_timeout_ms ());
217226 ASSERT_EQ (2u , parsed.migration_strategies ().size ());
218227 ASSERT_DOUBLE_EQ (0.70 , parsed.migration_strategies ()[0 ]->trigger_threshold ());
219228 ASSERT_EQ (120000 , parsed.migration_strategies ()[1 ]->methods ().mark ().timeout_ms ());
@@ -228,9 +237,66 @@ TEST_F(MigrationStrategyTest, TestInCacheConfig) {
228237 ASSERT_TRUE (no_migration.FromJsonString (json2));
229238 ASSERT_EQ (CacheConfig::kDefaultMigrationCopyMaxConcurrency , no_migration.migration_copy_max_concurrency ());
230239 ASSERT_EQ (MigrationMarkClearPolicy::CLEAR_ON_NEXT_WRITE_SUCCESS , no_migration.migration_mark_clear_policy ());
240+ ASSERT_EQ (MigrationConfig::kDefaultCopyConnectTimeoutMs ,
241+ no_migration.migration_copy_connect_timeout_ms ());
242+ ASSERT_EQ (MigrationConfig::kDefaultCopySubmitTimeoutMs ,
243+ no_migration.migration_copy_submit_timeout_ms ());
244+ ASSERT_EQ (MigrationConfig::kDefaultCopyQueryTimeoutMs , no_migration.migration_copy_query_timeout_ms ());
231245 ASSERT_TRUE (no_migration.migration_strategies ().empty ());
232246}
233247
248+ TEST_F (MigrationStrategyTest, TestMigrationConfigRejectsInvalidAsyncHttpTiming) {
249+ const auto expect_invalid = [](const MigrationConfig &config) {
250+ std::string invalid_fields;
251+ EXPECT_FALSE (config.ValidateRequiredFields (invalid_fields));
252+ EXPECT_NE (std::string::npos, invalid_fields.find (" copy_async_http_timing" ));
253+ };
254+
255+ MigrationConfig config;
256+ std::string invalid_fields;
257+ ASSERT_TRUE (config.ValidateRequiredFields (invalid_fields)) << invalid_fields;
258+
259+ config.set_copy_connect_timeout_ms (0 );
260+ expect_invalid (config);
261+
262+ config = MigrationConfig ();
263+ config.set_copy_submit_timeout_ms (config.copy_connect_timeout_ms () - 1 );
264+ expect_invalid (config);
265+
266+ config = MigrationConfig ();
267+ config.set_copy_query_timeout_ms (config.copy_connect_timeout_ms () - 1 );
268+ expect_invalid (config);
269+
270+ config = MigrationConfig ();
271+ config.set_copy_operation_deadline_ms (config.copy_submit_timeout_ms ());
272+ expect_invalid (config);
273+
274+ config = MigrationConfig ();
275+ config.set_copy_operation_deadline_ms (config.copy_query_timeout_ms ());
276+ expect_invalid (config);
277+
278+ config = MigrationConfig ();
279+ config.set_copy_submit_timeout_ms (
280+ config.copy_operation_deadline_ms () /
281+ MigrationConfig::kMinCopyHttpTimeoutWindowsPerDeadline +
282+ 1 );
283+ expect_invalid (config);
284+
285+ config = MigrationConfig ();
286+ config.set_copy_query_timeout_ms (
287+ config.copy_operation_deadline_ms () /
288+ MigrationConfig::kMinCopyHttpTimeoutWindowsPerDeadline +
289+ 1 );
290+ expect_invalid (config);
291+
292+ config = MigrationConfig ();
293+ config.set_copy_operation_deadline_ms (
294+ config.copy_query_timeout_ms () *
295+ MigrationConfig::kMinCopyHttpTimeoutWindowsPerDeadline );
296+ invalid_fields.clear ();
297+ EXPECT_TRUE (config.ValidateRequiredFields (invalid_fields)) << invalid_fields;
298+ }
299+
234300TEST_F (MigrationStrategyTest, TestCacheConfigRejectsInvalidMigrationCopyConcurrency) {
235301 CacheConfig cache_config;
236302 cache_config.set_cache_prefer_strategy (CachePreferStrategy::CPS_ALWAYS_TAIR_MEMPOOL );
0 commit comments