Мне кажется, я знаю, что происходит за кулисами.
Мой код Erlang (secret_function/2
) возвращал {ok, pid ()}, а не просто ok.Даже если это концептуально неправильно с тех пор, как я объявил функцию oneway_void
, мне потребовалось некоторое время, чтобы определить причину проблемы.Возможно, мы могли бы настроить функцию handle_succes
в Thrift, чтобы она работала так же, как h andle_function_catch
уже.Вот как выглядит handle_function_catch
на данный момент:
...
case {ErrType, ErrData} of
_ when IsOneway ->
Stack = erlang:get_stacktrace(),
error_logger:warning_msg(
"oneway void ~p threw error which must be ignored: ~p",
[Function, {ErrType, ErrData, Stack}]),
{State, ok};
...
Даже если функция объявлена как oneway_void
, когда возникает исключение, сообщается о проблеме.Потенциальная новая функция handle_success, следуя тому же рассуждению, может выглядеть следующим образом:
handle_success(State = #thrift_processor{service = Service},
Function,
Result) ->
ReplyType = Service:function_info(Function, reply_type),
StructName = atom_to_list(Function) ++ "_result",
case Result of
{reply, ReplyData} when ReplyType =:= oneway_void ->
Stack = erlang:get_stacktrace(),
error_logger:warning_msg(
"oneway void ~p sent reply which must be ignored: ~p",
[Function, {ReplyData, Stack}]),
{State, ok};
{reply, ReplyData} ->
Reply = {{struct, [{0, ReplyType}]}, {StructName, ReplyData}},
send_reply(State, Function, ?tMessageType_REPLY, Reply);
ok when ReplyType == {struct, []} ->
send_reply(State, Function, ?tMessageType_REPLY, {ReplyType, {StructName}});
ok when ReplyType == oneway_void ->
%% no reply for oneway void
{State, ok}
end.
Здесь я просто проверяю, определена ли функция как oneway_void
и верно ли это, и я до сих порполучить возвращаемое значение, отличное от атома ok
, я сообщаю об аварии, все еще игнорируя возвращаемое значение.
Это то, что разработчик увидел бы с обновленной функцией handle_success
:
=ERROR REPORT==== 7-Sep-2010::11:06:43 ===
oneway void secret_function sent reply which must be ignored: {{ok,
<0.262.0>},
[]}
И это может спасти вашу жизнь хотя бы один раз (цит.).