From e45918001555fb06fd5b10e487bfc26afb0ea99c Mon Sep 17 00:00:00 2001 From: Shawn <506895667@qq.com> Date: Mon, 30 Jan 2023 14:53:20 +0800 Subject: [PATCH] fix: restart oracle resources at relup --- .../src/emqx_rule_engine.appup.src | 17 ++++++++---- .../emqx_rule_engine/src/emqx_rule_engine.erl | 27 ++++++++++++------- src/emqx_relup.erl | 25 +++++++++++++++++ 3 files changed, 55 insertions(+), 14 deletions(-) diff --git a/apps/emqx_rule_engine/src/emqx_rule_engine.appup.src b/apps/emqx_rule_engine/src/emqx_rule_engine.appup.src index e9578168d..4ae9d3966 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_engine.appup.src +++ b/apps/emqx_rule_engine/src/emqx_rule_engine.appup.src @@ -1,10 +1,13 @@ %% -*- mode: erlang -*- %% Unless you know what you are doing, DO NOT edit manually!! {VSN, - [{"4.4.14",[{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]}]}, - {"4.4.13",[{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]}]}, + [{<<"4\\.4\\.1[3-4]">>, + [{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]}, + {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]} + ]}, {"4.4.12", [{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]}, + {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_engine_jwt_worker,brutal_purge,soft_purge,[]}, {update,emqx_rule_engine_jwt_sup,supervisor}, {load_module,emqx_rule_engine_jwt,brutal_purge,soft_purge,[]}]}, @@ -16,7 +19,8 @@ {load_module,emqx_rule_engine_sup,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]}, {apply,{emqx_rule_engine_sup,ensure_api_delegator_started,[]}}, - {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]}]}, + {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]} + ]}, {"4.4.10", [{add_module,emqx_rule_engine_jwt}, {add_module,emqx_rule_engine_jwt_worker}, @@ -222,10 +226,13 @@ {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]}]}, {<<".*">>,[]}], - [{"4.4.14",[{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]}]}, - {"4.4.13",[{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]}]}, + [{<<"4\\.4\\.1[3-4]">>, + [{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]}, + {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]} + ]}, {"4.4.12", [{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]}, + {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_engine_jwt_worker,brutal_purge,soft_purge,[]}, {update,emqx_rule_engine_jwt_sup,supervisor}, {load_module,emqx_rule_engine_jwt,brutal_purge,soft_purge,[]}]}, diff --git a/apps/emqx_rule_engine/src/emqx_rule_engine.erl b/apps/emqx_rule_engine/src/emqx_rule_engine.erl index 8f7e6bdbb..5b3570cf2 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_engine.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_engine.erl @@ -36,6 +36,7 @@ , create_resource/1 , test_resource/1 , start_resource/1 + , start_all_resources_of_type/1 , get_resource_status/1 , is_resource_alive/1 , is_resource_alive/2 @@ -354,19 +355,27 @@ do_check_and_update_resource(#{id := Id, type := Type, description := NewDescrip -spec(start_resource(resource_id()) -> ok | {error, Reason :: term()}). start_resource(ResId) -> case emqx_rule_registry:find_resource(ResId) of - {ok, #resource{type = ResType, config = Config}} -> - {ok, #resource_type{on_create = {Mod, Create}}} - = emqx_rule_registry:find_resource_type(ResType), - try - init_resource_with_retrier(Mod, Create, ResId, Config), - refresh_actions_of_a_resource(ResId) - catch - throw:Reason -> {error, Reason} - end; + {ok, Res} -> + do_start_resource(Res); not_found -> {error, {resource_not_found, ResId}} end. +do_start_resource(#resource{id = ResId, type = ResType, config = Config}) -> + {ok, #resource_type{on_create = {Mod, Create}}} + = emqx_rule_registry:find_resource_type(ResType), + try + init_resource_with_retrier(Mod, Create, ResId, Config), + refresh_actions_of_a_resource(ResId) + catch + throw:Reason -> {error, Reason} + end. + +-spec(start_all_resources_of_type(resource_type_name()) -> [{resource_id(), ok | {error, term()}}]). +start_all_resources_of_type(Type) -> + [{ResId, do_start_resource(Res)} + || #resource{id = ResId} = Res <- emqx_rule_registry:get_resources_by_type(Type)]. + -spec(test_resource(#{type := _, config := _, _ => _}) -> ok | {error, Reason :: term()}). test_resource(#{type := Type} = Params) -> case emqx_rule_registry:find_resource_type(Type) of diff --git a/src/emqx_relup.erl b/src/emqx_relup.erl index b26129828..dc453e7ff 100644 --- a/src/emqx_relup.erl +++ b/src/emqx_relup.erl @@ -32,6 +32,7 @@ post_release_upgrade(FromRelVsn, _) -> {_, CurrRelVsn} = ?EMQX_RELEASE, ?INFO("emqx has been upgraded from ~s to ~s!", [FromRelVsn, CurrRelVsn]), maybe_refresh_jwt_module(FromRelVsn), + _ = maybe_restart_oracle_resources(FromRelVsn), reload_components(). %% What to do after downgraded to an old release vsn. @@ -93,3 +94,27 @@ maybe_refresh_jwt_module(_) -> ok. -endif. + + +-ifdef(EMQX_ENTERPRISE). +maybe_restart_oracle_resources("4.4." ++ PatchVsn0) -> + try + case list_to_integer(PatchVsn0) of + PatchVsn when PatchVsn =< 14 -> + emqx_rule_engine:start_all_resources_of_type(backend_oracle); + _ -> ok + end + catch + Err:Reason:ST -> + ?INFO("maybe_restart_oracle_resources failed: ~p", [{Err, Reason, ST}]), + ok + end; +maybe_restart_oracle_resources(_) -> + ok. + +-else. + +maybe_restart_oracle_resources(_) -> + ok. + +-endif.