Jelajahi Sumber

test(router): verify force-left nodes are purged quickly

Andrew Mayorov 1 tahun lalu
induk
melakukan
3056dca6b2

+ 1 - 1
apps/emqx/src/emqx_router_helper.erl

@@ -357,7 +357,7 @@ schedule_purge_left(Node) ->
 handle_purge(Node, State) ->
 handle_purge(Node, State) ->
     try purge_dead_node_trans(Node) of
     try purge_dead_node_trans(Node) of
         true ->
         true ->
-            ?tp(debug, emqx_router_node_purged, #{node => Node}),
+            ?tp(info, emqx_router_node_purged, #{node => Node}),
             forget_node(Node);
             forget_node(Node);
         false ->
         false ->
             ?tp(debug, emqx_router_node_purge_skipped, #{node => Node}),
             ?tp(debug, emqx_router_node_purge_skipped, #{node => Node}),

+ 30 - 1
apps/emqx/test/emqx_router_helper_SUITE.erl

@@ -37,6 +37,11 @@ groups() ->
     SmokeTCs = [t_monitor, t_message],
     SmokeTCs = [t_monitor, t_message],
     CleanupTCs = [t_membership_node_leaving],
     CleanupTCs = [t_membership_node_leaving],
     ClusterTCs = [
     ClusterTCs = [
+        t_cluster_node_leaving,
+        t_cluster_node_force_leave,
+        t_cluster_node_restart
+    ],
+    ClusterReplicantTCs = [
         t_cluster_node_leaving,
         t_cluster_node_leaving,
         t_cluster_node_down,
         t_cluster_node_down,
         t_cluster_node_restart
         t_cluster_node_restart
@@ -52,7 +57,7 @@ groups() ->
             {group, routing_schema_v2}
             {group, routing_schema_v2}
         ]},
         ]},
         {cluster, [], ClusterTCs},
         {cluster, [], ClusterTCs},
-        {cluster_replicant, [], ClusterTCs},
+        {cluster_replicant, [], ClusterReplicantTCs},
         {routing_schema_v1, [], SchemaTCs},
         {routing_schema_v1, [], SchemaTCs},
         {routing_schema_v2, [], SchemaTCs}
         {routing_schema_v2, [], SchemaTCs}
     ].
     ].
@@ -178,6 +183,30 @@ t_cluster_node_down(Config) ->
     {ok, _Event} = snabbkaffe:receive_events(SRef),
     {ok, _Event} = snabbkaffe:receive_events(SRef),
     ?assertEqual([<<"test/e/f">>], emqx_router:topics()).
     ?assertEqual([<<"test/e/f">>], emqx_router:topics()).
 
 
+t_cluster_node_force_leave('init', Config) ->
+    start_join_node(cluster_node_force_leave, Config);
+t_cluster_node_force_leave('end', Config) ->
+    stop_leave_node(Config).
+
+t_cluster_node_force_leave(Config) ->
+    ClusterNode = ?config(cluster_node, Config),
+    emqx_router:add_route(<<"forceleave/b/#">>, ClusterNode),
+    emqx_router:add_route(<<"test/e/f">>, node()),
+    ?assertMatch([_, _], emqx_router:topics()),
+    {ok, SRef} = snabbkaffe:subscribe(
+        ?match_event(#{?snk_kind := emqx_router_node_purged, node := ClusterNode}),
+        1,
+        10_000
+    ),
+    %% Simulate node crash.
+    ok = emqx_cth_peer:kill(ClusterNode),
+    %% Give Mria some time to recognize the node is down.
+    ok = timer:sleep(500),
+    %% Force-leave it.
+    ok = ekka:force_leave(ClusterNode),
+    {ok, _Event} = snabbkaffe:receive_events(SRef),
+    ?assertEqual([<<"test/e/f">>], emqx_router:topics()).
+
 t_cluster_node_restart('init', Config) ->
 t_cluster_node_restart('init', Config) ->
     start_join_node(cluster_node_restart, Config);
     start_join_node(cluster_node_restart, Config);
 t_cluster_node_restart('end', Config) ->
 t_cluster_node_restart('end', Config) ->