Merge pull request #10918 from thalesmg/fix-ecpool-empty-unrecoverable-v50
fix(ecpool,bridge): treat `{error, ecpool_empty}` as a retriable error
This commit is contained in:
commit
74ffd9ef96
|
@ -1,6 +1,6 @@
|
||||||
{application, emqx_bridge_cassandra, [
|
{application, emqx_bridge_cassandra, [
|
||||||
{description, "EMQX Enterprise Cassandra Bridge"},
|
{description, "EMQX Enterprise Cassandra Bridge"},
|
||||||
{vsn, "0.1.1"},
|
{vsn, "0.1.2"},
|
||||||
{registered, []},
|
{registered, []},
|
||||||
{applications, [kernel, stdlib, ecql]},
|
{applications, [kernel, stdlib, ecql]},
|
||||||
{env, []},
|
{env, []},
|
||||||
|
|
|
@ -480,6 +480,8 @@ prepare_cql_to_conn(Conn, [{Key, SQL} | PrepareList], Statements) when is_pid(Co
|
||||||
|
|
||||||
handle_result({error, disconnected}) ->
|
handle_result({error, disconnected}) ->
|
||||||
{error, {recoverable_error, disconnected}};
|
{error, {recoverable_error, disconnected}};
|
||||||
|
handle_result({error, ecpool_empty}) ->
|
||||||
|
{error, {recoverable_error, ecpool_empty}};
|
||||||
handle_result({error, Error}) ->
|
handle_result({error, Error}) ->
|
||||||
{error, {unrecoverable_error, Error}};
|
{error, {unrecoverable_error, Error}};
|
||||||
handle_result(Res) ->
|
handle_result(Res) ->
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{application, emqx_bridge_clickhouse, [
|
{application, emqx_bridge_clickhouse, [
|
||||||
{description, "EMQX Enterprise ClickHouse Bridge"},
|
{description, "EMQX Enterprise ClickHouse Bridge"},
|
||||||
{vsn, "0.2.0"},
|
{vsn, "0.2.1"},
|
||||||
{registered, []},
|
{registered, []},
|
||||||
{applications, [kernel, stdlib, clickhouse, emqx_resource]},
|
{applications, [kernel, stdlib, clickhouse, emqx_resource]},
|
||||||
{env, []},
|
{env, []},
|
||||||
|
|
|
@ -464,7 +464,12 @@ transform_and_log_clickhouse_result(ClickhouseErrorResult, ResourceID, SQL) ->
|
||||||
sql => SQL,
|
sql => SQL,
|
||||||
reason => ClickhouseErrorResult
|
reason => ClickhouseErrorResult
|
||||||
}),
|
}),
|
||||||
{error, ClickhouseErrorResult}.
|
case ClickhouseErrorResult of
|
||||||
|
{error, ecpool_empty} ->
|
||||||
|
{error, {recoverable_error, ecpool_empty}};
|
||||||
|
_ ->
|
||||||
|
{error, ClickhouseErrorResult}
|
||||||
|
end.
|
||||||
|
|
||||||
snabbkaffe_log_return(_Result) ->
|
snabbkaffe_log_return(_Result) ->
|
||||||
?tp(
|
?tp(
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{application, emqx_bridge_dynamo, [
|
{application, emqx_bridge_dynamo, [
|
||||||
{description, "EMQX Enterprise Dynamo Bridge"},
|
{description, "EMQX Enterprise Dynamo Bridge"},
|
||||||
{vsn, "0.1.1"},
|
{vsn, "0.1.2"},
|
||||||
{registered, []},
|
{registered, []},
|
||||||
{applications, [kernel, stdlib, erlcloud]},
|
{applications, [kernel, stdlib, erlcloud]},
|
||||||
{env, []},
|
{env, []},
|
||||||
|
|
|
@ -170,7 +170,12 @@ do_query(
|
||||||
query => Query,
|
query => Query,
|
||||||
reason => Reason
|
reason => Reason
|
||||||
}),
|
}),
|
||||||
Result;
|
case Reason of
|
||||||
|
ecpool_empty ->
|
||||||
|
{error, {recoverable_error, Reason}};
|
||||||
|
_ ->
|
||||||
|
Result
|
||||||
|
end;
|
||||||
_ ->
|
_ ->
|
||||||
?tp(
|
?tp(
|
||||||
dynamo_connector_query_return,
|
dynamo_connector_query_return,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{application, emqx_bridge_opents, [
|
{application, emqx_bridge_opents, [
|
||||||
{description, "EMQX Enterprise OpenTSDB Bridge"},
|
{description, "EMQX Enterprise OpenTSDB Bridge"},
|
||||||
{vsn, "0.1.0"},
|
{vsn, "0.1.1"},
|
||||||
{registered, []},
|
{registered, []},
|
||||||
{applications, [
|
{applications, [
|
||||||
kernel,
|
kernel,
|
||||||
|
|
|
@ -142,7 +142,12 @@ do_query(InstanceId, Query, #{pool_name := PoolName} = State) ->
|
||||||
query => Query,
|
query => Query,
|
||||||
reason => Reason
|
reason => Reason
|
||||||
}),
|
}),
|
||||||
Result;
|
case Reason of
|
||||||
|
ecpool_empty ->
|
||||||
|
{error, {recoverable_error, Reason}};
|
||||||
|
_ ->
|
||||||
|
Result
|
||||||
|
end;
|
||||||
_ ->
|
_ ->
|
||||||
?tp(
|
?tp(
|
||||||
opents_connector_query_return,
|
opents_connector_query_return,
|
||||||
|
|
|
@ -431,11 +431,12 @@ on_query(
|
||||||
state => emqx_utils:redact(State)
|
state => emqx_utils:redact(State)
|
||||||
}),
|
}),
|
||||||
MessageData = format_data(PayloadTemplate, Data),
|
MessageData = format_data(PayloadTemplate, Data),
|
||||||
ecpool:pick_and_do(
|
Res = ecpool:pick_and_do(
|
||||||
PoolName,
|
PoolName,
|
||||||
{?MODULE, publish_messages, [Config, [MessageData]]},
|
{?MODULE, publish_messages, [Config, [MessageData]]},
|
||||||
no_handover
|
no_handover
|
||||||
).
|
),
|
||||||
|
handle_result(Res).
|
||||||
|
|
||||||
%% emqx_resource callback that is called when a batch query is received
|
%% emqx_resource callback that is called when a batch query is received
|
||||||
|
|
||||||
|
@ -467,11 +468,12 @@ on_batch_query(
|
||||||
|| Data <- MessagesToInsert
|
|| Data <- MessagesToInsert
|
||||||
],
|
],
|
||||||
%% Publish the messages
|
%% Publish the messages
|
||||||
ecpool:pick_and_do(
|
Res = ecpool:pick_and_do(
|
||||||
PoolName,
|
PoolName,
|
||||||
{?MODULE, publish_messages, [Config, FormattedMessages]},
|
{?MODULE, publish_messages, [Config, FormattedMessages]},
|
||||||
no_handover
|
no_handover
|
||||||
).
|
),
|
||||||
|
handle_result(Res).
|
||||||
|
|
||||||
publish_messages(
|
publish_messages(
|
||||||
{_Connection, Channel},
|
{_Connection, Channel},
|
||||||
|
@ -543,3 +545,8 @@ format_data([], Msg) ->
|
||||||
emqx_utils_json:encode(Msg);
|
emqx_utils_json:encode(Msg);
|
||||||
format_data(Tokens, Msg) ->
|
format_data(Tokens, Msg) ->
|
||||||
emqx_plugin_libs_rule:proc_tmpl(Tokens, Msg).
|
emqx_plugin_libs_rule:proc_tmpl(Tokens, Msg).
|
||||||
|
|
||||||
|
handle_result({error, ecpool_empty}) ->
|
||||||
|
{error, {recoverable_error, ecpool_empty}};
|
||||||
|
handle_result(Res) ->
|
||||||
|
Res.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{application, emqx_bridge_sqlserver, [
|
{application, emqx_bridge_sqlserver, [
|
||||||
{description, "EMQX Enterprise SQL Server Bridge"},
|
{description, "EMQX Enterprise SQL Server Bridge"},
|
||||||
{vsn, "0.1.0"},
|
{vsn, "0.1.1"},
|
||||||
{registered, []},
|
{registered, []},
|
||||||
{applications, [kernel, stdlib, odbc]},
|
{applications, [kernel, stdlib, odbc]},
|
||||||
{env, []},
|
{env, []},
|
||||||
|
|
|
@ -336,6 +336,7 @@ conn_str([{_, _} | Opts], Acc) ->
|
||||||
) ->
|
) ->
|
||||||
{ok, list()}
|
{ok, list()}
|
||||||
| {error, {recoverable_error, term()}}
|
| {error, {recoverable_error, term()}}
|
||||||
|
| {error, {unrecoverable_error, term()}}
|
||||||
| {error, term()}.
|
| {error, term()}.
|
||||||
do_query(
|
do_query(
|
||||||
ResourceId,
|
ResourceId,
|
||||||
|
@ -374,7 +375,12 @@ do_query(
|
||||||
query => Query,
|
query => Query,
|
||||||
reason => Reason
|
reason => Reason
|
||||||
}),
|
}),
|
||||||
Result;
|
case Reason of
|
||||||
|
ecpool_empty ->
|
||||||
|
{error, {recoverable_error, Reason}};
|
||||||
|
_ ->
|
||||||
|
Result
|
||||||
|
end;
|
||||||
_ ->
|
_ ->
|
||||||
?tp(
|
?tp(
|
||||||
sqlserver_connector_query_return,
|
sqlserver_connector_query_return,
|
||||||
|
|
|
@ -200,7 +200,12 @@ do_query_job(InstanceId, Job, #{pool_name := PoolName} = State) ->
|
||||||
job => Job,
|
job => Job,
|
||||||
reason => Reason
|
reason => Reason
|
||||||
}),
|
}),
|
||||||
Result;
|
case Reason of
|
||||||
|
ecpool_empty ->
|
||||||
|
{error, {recoverable_error, Reason}};
|
||||||
|
_ ->
|
||||||
|
Result
|
||||||
|
end;
|
||||||
_ ->
|
_ ->
|
||||||
?tp(
|
?tp(
|
||||||
tdengine_connector_query_return,
|
tdengine_connector_query_return,
|
||||||
|
|
|
@ -135,11 +135,16 @@ on_query(InstId, {search, Base, Filter, Attributes}, #{pool_name := PoolName} =
|
||||||
request => Request,
|
request => Request,
|
||||||
connector => InstId,
|
connector => InstId,
|
||||||
reason => Reason
|
reason => Reason
|
||||||
});
|
}),
|
||||||
|
case Reason of
|
||||||
|
ecpool_empty ->
|
||||||
|
{error, {recoverable_error, Reason}};
|
||||||
|
_ ->
|
||||||
|
Result
|
||||||
|
end;
|
||||||
_ ->
|
_ ->
|
||||||
ok
|
Result
|
||||||
end,
|
end.
|
||||||
Result.
|
|
||||||
|
|
||||||
on_get_status(_InstId, _State) -> connected.
|
on_get_status(_InstId, _State) -> connected.
|
||||||
|
|
||||||
|
|
|
@ -233,6 +233,8 @@ on_query(
|
||||||
connector => InstId
|
connector => InstId
|
||||||
}),
|
}),
|
||||||
{error, Reason};
|
{error, Reason};
|
||||||
|
{error, ecpool_empty} ->
|
||||||
|
{error, {recoverable_error, ecpool_empty}};
|
||||||
{{true, _Info}, _Document} ->
|
{{true, _Info}, _Document} ->
|
||||||
ok
|
ok
|
||||||
end;
|
end;
|
||||||
|
@ -261,7 +263,12 @@ on_query(
|
||||||
reason => Reason,
|
reason => Reason,
|
||||||
connector => InstId
|
connector => InstId
|
||||||
}),
|
}),
|
||||||
{error, Reason};
|
case Reason of
|
||||||
|
ecpool_empty ->
|
||||||
|
{error, {recoverable_error, Reason}};
|
||||||
|
_ ->
|
||||||
|
{error, Reason}
|
||||||
|
end;
|
||||||
{ok, Cursor} when is_pid(Cursor) ->
|
{ok, Cursor} when is_pid(Cursor) ->
|
||||||
{ok, mc_cursor:foldl(fun(O, Acc2) -> [O | Acc2] end, [], Cursor, 1000)};
|
{ok, mc_cursor:foldl(fun(O, Acc2) -> [O | Acc2] end, [], Cursor, 1000)};
|
||||||
Result ->
|
Result ->
|
||||||
|
|
|
@ -241,7 +241,12 @@ on_sql_query(InstId, PoolName, Type, NameOrSQL, Data) ->
|
||||||
sql => NameOrSQL,
|
sql => NameOrSQL,
|
||||||
reason => Reason
|
reason => Reason
|
||||||
}),
|
}),
|
||||||
Result;
|
case Reason of
|
||||||
|
ecpool_empty ->
|
||||||
|
{error, {recoverable_error, Reason}};
|
||||||
|
_ ->
|
||||||
|
Result
|
||||||
|
end;
|
||||||
Result ->
|
Result ->
|
||||||
?tp(
|
?tp(
|
||||||
pgsql_connector_query_return,
|
pgsql_connector_query_return,
|
||||||
|
|
|
@ -220,6 +220,8 @@ do_query(InstId, Query, #{pool_name := PoolName, type := Type} = State) ->
|
||||||
case is_unrecoverable_error(Reason) of
|
case is_unrecoverable_error(Reason) of
|
||||||
true ->
|
true ->
|
||||||
{error, {unrecoverable_error, Reason}};
|
{error, {unrecoverable_error, Reason}};
|
||||||
|
false when Reason =:= ecpool_empty ->
|
||||||
|
{error, {recoverable_error, Reason}};
|
||||||
false ->
|
false ->
|
||||||
Result
|
Result
|
||||||
end;
|
end;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{application, emqx_oracle, [
|
{application, emqx_oracle, [
|
||||||
{description, "EMQX Enterprise Oracle Database Connector"},
|
{description, "EMQX Enterprise Oracle Database Connector"},
|
||||||
{vsn, "0.1.1"},
|
{vsn, "0.1.2"},
|
||||||
{registered, []},
|
{registered, []},
|
||||||
{applications, [
|
{applications, [
|
||||||
kernel,
|
kernel,
|
||||||
|
|
|
@ -222,7 +222,12 @@ on_sql_query(InstId, PoolName, Type, ApplyMode, NameOrSQL, Data) ->
|
||||||
sql => NameOrSQL,
|
sql => NameOrSQL,
|
||||||
reason => Reason
|
reason => Reason
|
||||||
}),
|
}),
|
||||||
Result;
|
case Reason of
|
||||||
|
ecpool_empty ->
|
||||||
|
{error, {recoverable_error, Reason}};
|
||||||
|
_ ->
|
||||||
|
Result
|
||||||
|
end;
|
||||||
Result ->
|
Result ->
|
||||||
?tp(
|
?tp(
|
||||||
oracle_connector_query_return,
|
oracle_connector_query_return,
|
||||||
|
|
Loading…
Reference in New Issue