|
25 | 25 |
|
26 | 26 | registry_general_usage/1, |
27 | 27 | registry_concurrent_reloads/1, |
| 28 | + try_to_deadlock_in_registry_reload/1, |
28 | 29 | enable_feature_flag_in_a_healthy_situation/1, |
29 | 30 | enable_unsupported_feature_flag_in_a_healthy_situation/1, |
30 | 31 | enable_feature_flag_when_ff_file_is_unwritable/1, |
@@ -100,7 +101,8 @@ groups() -> |
100 | 101 | {registry, [], |
101 | 102 | [ |
102 | 103 | registry_general_usage, |
103 | | - registry_concurrent_reloads |
| 104 | + registry_concurrent_reloads, |
| 105 | + try_to_deadlock_in_registry_reload |
104 | 106 | ]}, |
105 | 107 | {feature_flags_v2, [], Groups} |
106 | 108 | ]. |
@@ -557,6 +559,46 @@ registry_spammer1(FeatureNames) -> |
557 | 559 | ?assertEqual(FeatureNames, ?list_ff(all)), |
558 | 560 | registry_spammer1(FeatureNames). |
559 | 561 |
|
| 562 | +try_to_deadlock_in_registry_reload(_Config) -> |
| 563 | + rabbit_ff_registry_factory:purge_old_registry(rabbit_ff_registry), |
| 564 | + _ = code:delete(rabbit_ff_registry), |
| 565 | + ?assertEqual(false, code:is_loaded(rabbit_ff_registry)), |
| 566 | + |
| 567 | + FeatureName = ?FUNCTION_NAME, |
| 568 | + FeatureProps = #{provided_by => rabbit, |
| 569 | + stability => stable}, |
| 570 | + |
| 571 | + Lock = rabbit_ff_registry_factory:registry_loading_lock(), |
| 572 | + global:set_lock(Lock, [node()]), |
| 573 | + |
| 574 | + Parent = self(), |
| 575 | + ProcessA = spawn_link( |
| 576 | + fun() -> |
| 577 | + FF = rabbit_ff_registry:get(FeatureName), |
| 578 | + erlang:unlink(Parent), |
| 579 | + Parent ! {self(), FF} |
| 580 | + end), |
| 581 | + timer:sleep(1000), |
| 582 | + |
| 583 | + ct:pal("Inject arbitrary feature flag to reload registry"), |
| 584 | + rabbit_feature_flags:inject_test_feature_flags( |
| 585 | + #{FeatureName => FeatureProps}), |
| 586 | + |
| 587 | + ct:pal("Release registry loading lock"), |
| 588 | + global:del_lock(Lock, [node()]), |
| 589 | + |
| 590 | + ct:pal("Waiting for process A to exit"), |
| 591 | + receive |
| 592 | + {ProcessA, FF} -> |
| 593 | + ?assertEqual(FeatureProps, FF), |
| 594 | + ok |
| 595 | + after 10000 -> |
| 596 | + {_, Stacktrace} = erlang:process_info( |
| 597 | + ProcessA, current_stacktrace), |
| 598 | + ct:pal("Process A stuck; stacktrace: ~p", [Stacktrace]), |
| 599 | + error(registry_reload_deadlock) |
| 600 | + end. |
| 601 | + |
560 | 602 | enable_feature_flag_in_a_healthy_situation(Config) -> |
561 | 603 | FeatureName = ff_from_testsuite, |
562 | 604 | ClusterSize = ?config(rmq_nodes_count, Config), |
|
0 commit comments