|
|
@ -11,21 +11,6 @@ |
|
|
|
, terminate/3 |
|
|
|
]). |
|
|
|
|
|
|
|
-record(srvState, { |
|
|
|
poolName :: poolName(), |
|
|
|
serverName :: serverName(), |
|
|
|
userPassWord :: binary(), |
|
|
|
host :: binary(), |
|
|
|
dbName :: binary(), |
|
|
|
rn :: binary:cp(), |
|
|
|
rnrn :: binary:cp(), |
|
|
|
reconnectState :: undefined | reconnectState(), |
|
|
|
socket :: undefined | inet:socket(), |
|
|
|
timerRef :: undefined | reference() |
|
|
|
}). |
|
|
|
|
|
|
|
-type srvState() :: #srvState{}. |
|
|
|
|
|
|
|
-spec init(term()) -> no_return(). |
|
|
|
init({PoolName, AgencyName, #agencyOpts{reconnect = Reconnect, backlogSize = BacklogSize, reconnectTimeMin = Min, reconnectTimeMax = Max}}) -> |
|
|
|
ReconnectState = agAgencyUtils:initReconnectState(Reconnect, Min, Max), |
|
|
@ -50,6 +35,7 @@ handleMsg(#miRequest{method = Method, path = Path, headers = Headers, body = Bod |
|
|
|
case Status of |
|
|
|
leisure -> %% 空闲模式 |
|
|
|
Request = agHttpProtocol:request(IsSystem, Body, Method, Host, DbName, Path, [{<<"Authorization">>, UserPassWord} | Headers]), |
|
|
|
io:format("IMY*******************************~n~p ~n",[Request]), |
|
|
|
case gen_tcp:send(Socket, Request) of |
|
|
|
ok -> |
|
|
|
TimerRef = |
|
|
@ -63,8 +49,8 @@ handleMsg(#miRequest{method = Method, path = Path, headers = Headers, body = Bod |
|
|
|
{error, Reason} -> |
|
|
|
?WARN(ServerName, ":send error: ~p ~p ~p ~n", [Reason, FromPid, RequestId]), |
|
|
|
gen_tcp:close(Socket), |
|
|
|
agAgencyUtils:agencyReply(FromPid, RequestId, undefined, {error, socket_send_error}), |
|
|
|
dealClose(SrvState, CliState, {error, {socket_send_error, Reason}}) |
|
|
|
agAgencyUtils:agencyReply(FromPid, RequestId, undefined, {error, {socket_send_error, Reason}}), |
|
|
|
agAgencyUtils:dealClose(SrvState, CliState, {error, {socket_send_error, Reason}}) |
|
|
|
end; |
|
|
|
_ -> |
|
|
|
agAgencyUtils:addQueue(RequestsIn, MiRequest), |
|
|
@ -89,12 +75,12 @@ handleMsg({tcp, Socket, Data}, |
|
|
|
{error, Reason} -> |
|
|
|
?WARN(ServerName, "handle tcp data error: ~p ~p ~n", [Reason, CurInfo]), |
|
|
|
gen_tcp:close(Socket), |
|
|
|
dealClose(SrvState, CliState, {error, {tcp_data_error, Reason}}) |
|
|
|
agAgencyUtils:dealClose(SrvState, CliState, {error, {tcp_data_error, Reason}}) |
|
|
|
catch |
|
|
|
E:R:S -> |
|
|
|
?WARN(ServerName, "handle tcp data crash: ~p:~p~n~p~n ~p ~n ", [E, R, S, CurInfo]), |
|
|
|
gen_tcp:close(Socket), |
|
|
|
dealClose(SrvState, CliState, {error, agency_handledata_error}) |
|
|
|
agAgencyUtils:dealClose(SrvState, CliState, {error, agency_handledata_error}) |
|
|
|
end; |
|
|
|
handleMsg({timeout, TimerRef, waiting_over}, |
|
|
|
#srvState{socket = Socket} = SrvState, |
|
|
@ -108,13 +94,13 @@ handleMsg({tcp_closed, Socket}, |
|
|
|
#srvState{socket = Socket, serverName = ServerName} = SrvState, |
|
|
|
CliState) -> |
|
|
|
?WARN(ServerName, "connection closed~n", []), |
|
|
|
dealClose(SrvState, CliState, {error, tcp_closed}); |
|
|
|
agAgencyUtils:dealClose(SrvState, CliState, {error, tcp_closed}); |
|
|
|
handleMsg({tcp_error, Socket, Reason}, |
|
|
|
#srvState{socket = Socket, serverName = ServerName} = SrvState, |
|
|
|
CliState) -> |
|
|
|
?WARN(ServerName, "connection error: ~p~n", [Reason]), |
|
|
|
gen_tcp:close(Socket), |
|
|
|
dealClose(SrvState, CliState, {error, {tcp_error, Reason}}); |
|
|
|
agAgencyUtils:dealClose(SrvState, CliState, {error, {tcp_error, Reason}}); |
|
|
|
handleMsg(?miDoNetConnect, |
|
|
|
#srvState{poolName = PoolName, serverName = ServerName, reconnectState = ReconnectState} = SrvState, |
|
|
|
#cliState{requestsOut = RequestsOut} = CliState) -> |
|
|
@ -132,7 +118,7 @@ handleMsg(?miDoNetConnect, |
|
|
|
dealQueueRequest(MiRequest, SrvState#srvState{socket = Socket, reconnectState = NewReconnectState}, NewCliState) |
|
|
|
end; |
|
|
|
{error, _Reason} -> |
|
|
|
reconnectTimer(SrvState, CliState) |
|
|
|
agAgencyUtils:reconnectTimer(SrvState, CliState) |
|
|
|
end; |
|
|
|
_Ret -> |
|
|
|
?WARN(ServerName, "deal connect not found agBeamPool:get(~p) ret ~p is error ~n", [PoolName, _Ret]) |
|
|
@ -143,10 +129,10 @@ handleMsg(Msg, #srvState{serverName = ServerName} = SrvState, CliState) -> |
|
|
|
|
|
|
|
-spec terminate(term(), srvState(), cliState()) -> ok. |
|
|
|
terminate(_Reason, |
|
|
|
#srvState{timerRef = TimerRef}, |
|
|
|
_CliState) -> |
|
|
|
#srvState{timerRef = TimerRef} = SrvState, |
|
|
|
_CliState = CliState) -> |
|
|
|
agAgencyUtils:cancelTimer(TimerRef), |
|
|
|
agAgencyUtils:agencyReplyAll({error, shutdown}), |
|
|
|
agAgencyUtils:dealClose(SrvState, CliState, {error, shutdown}), |
|
|
|
ok. |
|
|
|
|
|
|
|
dealConnect(ServerName, HostName, Port, SocketOptions) -> |
|
|
@ -165,18 +151,6 @@ dealConnect(ServerName, HostName, Port, SocketOptions) -> |
|
|
|
{error, Reason} |
|
|
|
end. |
|
|
|
|
|
|
|
dealClose(SrvState, ClientState, Reply) -> |
|
|
|
agAgencyUtils:agencyReplyAll(Reply), |
|
|
|
reconnectTimer(SrvState, ClientState). |
|
|
|
|
|
|
|
reconnectTimer(#srvState{reconnectState = undefined} = SrvState, CliState) -> |
|
|
|
{ok, {SrvState#srvState{socket = undefined}, CliState}}; |
|
|
|
reconnectTimer(#srvState{reconnectState = ReconnectState} = SrvState, CliState) -> |
|
|
|
#reconnectState{current = Current} = MewReconnectState = agAgencyUtils:updateReconnectState(ReconnectState), |
|
|
|
TimerRef = erlang:send_after(Current, self(), ?miDoNetConnect), |
|
|
|
{ok, SrvState#srvState{reconnectState = MewReconnectState, socket = undefined, timerRef = TimerRef}, CliState}. |
|
|
|
|
|
|
|
|
|
|
|
dealQueueRequest(#miRequest{method = Method, path = Path, headers = Headers, body = Body, requestId = RequestId, fromPid = FromPid, overTime = OverTime, isSystem = IsSystem}, |
|
|
|
#srvState{serverName = ServerName, host = Host, userPassWord = UserPassWord, dbName = DbName, socket = Socket} = SrvState, |
|
|
|
#cliState{requestsOut = RequestsOut} = CliState) -> |
|
|
@ -207,7 +181,7 @@ dealQueueRequest(#miRequest{method = Method, path = Path, headers = Headers, bod |
|
|
|
?WARN(ServerName, ":send error: ~p~n", [Reason]), |
|
|
|
gen_tcp:close(Socket), |
|
|
|
agAgencyUtils:agencyReply(FromPid, RequestId, undefined, {error, socket_send_error}), |
|
|
|
dealClose(SrvState, CliState, {error, socket_send_error}) |
|
|
|
agAgencyUtils:dealClose(SrvState, CliState, {error, socket_send_error}) |
|
|
|
end |
|
|
|
end. |
|
|
|
|