|
|
@ -1,5 +1,5 @@ |
|
|
|
-module(agTcpAgencyIns). |
|
|
|
-include("agHttpCli.hrl"). |
|
|
|
-include("agVstCli.hrl"). |
|
|
|
-include("eArango.hrl"). |
|
|
|
|
|
|
|
-compile(inline). |
|
|
@ -15,102 +15,97 @@ |
|
|
|
-spec init(term()) -> no_return(). |
|
|
|
init({PoolName, AgencyName, #agencyOpts{reconnect = Reconnect, backlogSize = BacklogSize, reconnectTimeMin = Min, reconnectTimeMax = Max}}) -> |
|
|
|
ReconnectState = agAgencyUtils:initReconnectState(Reconnect, Min, Max), |
|
|
|
self() ! ?miDoNetConnect, |
|
|
|
{ok, #srvState{poolName = PoolName, serverName = AgencyName, rn = binary:compile_pattern(<<"\r\n">>), rnrn = binary:compile_pattern(<<"\r\n\r\n">>), reconnectState = ReconnectState}, #cliState{backlogSize = BacklogSize}}. |
|
|
|
self() ! ?AgMDoNetConn, |
|
|
|
{ok, #srvState{poolName = PoolName, serverName = AgencyName, reconnectState = ReconnectState}, #cliState{backlogSize = BacklogSize}}. |
|
|
|
|
|
|
|
-spec handleMsg(term(), srvState(), cliState()) -> {ok, term(), term()}. |
|
|
|
handleMsg(#miRequest{method = Method, path = Path, headers = Headers, body = Body, requestId = RequestId, fromPid = FromPid, overTime = OverTime, isSystem = IsSystem} = MiRequest, |
|
|
|
#srvState{serverName = ServerName, host = Host, userPassWord = UserPassWord, dbName = DbName, socket = Socket} = SrvState, |
|
|
|
#cliState{backlogNum = BacklogNum, backlogSize = BacklogSize, requestsIns = RequestsIns, status = Status} = CliState) -> |
|
|
|
handleMsg(#miRequest{method = Method, path = Path, queryPars = QueryPars, headers = Headers, body = Body, messageId = MessageId, fromPid = FromPid, overTime = OverTime, isSystem = IsSystem} = MiRequest, |
|
|
|
#srvState{serverName = ServerName, host = Host, dbName = DbName, socket = Socket} = SrvState, |
|
|
|
#cliState{backlogNum = BacklogNum, backlogSize = BacklogSize} = CliState) -> |
|
|
|
case Socket of |
|
|
|
undefined -> |
|
|
|
agAgencyUtils:agencyReply(FromPid, RequestId, undefined, {error, noSocket}), |
|
|
|
agAgencyUtils:agencyReply(FromPid, MessageId, undefined, {error, noSocket}), |
|
|
|
{ok, SrvState, CliState}; |
|
|
|
_ -> |
|
|
|
case BacklogNum >= BacklogSize of |
|
|
|
true -> |
|
|
|
?WARN(ServerName, ":backlog full curNum:~p Total: ~p ~n", [BacklogNum, BacklogSize]), |
|
|
|
agAgencyUtils:agencyReply(FromPid, RequestId, undefined, {error, backlogFull}), |
|
|
|
?AgWarn(ServerName, ":backlog full curNum:~p Total: ~p ~n", [BacklogNum, BacklogSize]), |
|
|
|
agAgencyUtils:agencyReply(FromPid, MessageId, undefined, {error, backlogFull}), |
|
|
|
{ok, SrvState, CliState}; |
|
|
|
_ -> |
|
|
|
case Status of |
|
|
|
leisure -> %% 空闲模式 |
|
|
|
Request = agHttpProtocol:request(IsSystem, Body, Method, Host, DbName, Path, [UserPassWord | Headers]), |
|
|
|
case gen_tcp:send(Socket, Request) of |
|
|
|
ok -> |
|
|
|
TimerRef = |
|
|
|
case OverTime of |
|
|
|
infinity -> |
|
|
|
undefined; |
|
|
|
_ -> |
|
|
|
erlang:start_timer(OverTime, self(), waiting_over, [{abs, true}]) |
|
|
|
end, |
|
|
|
{ok, SrvState, CliState#cliState{isHeadMethod = Method == ?AgHead, status = waiting, backlogNum = BacklogNum + 1, curInfo = {FromPid, RequestId, TimerRef}}}; |
|
|
|
{error, Reason} -> |
|
|
|
?WARN(ServerName, ":send error: ~p ~p ~p ~n", [Reason, FromPid, RequestId]), |
|
|
|
gen_tcp:close(Socket), |
|
|
|
agAgencyUtils:agencyReply(FromPid, RequestId, undefined, {error, {socketSendError, Reason}}), |
|
|
|
agAgencyUtils:dealClose(SrvState, CliState, {error, {socketSendError, Reason}}) |
|
|
|
end; |
|
|
|
_ -> |
|
|
|
{ok, SrvState, CliState#cliState{requestsIns = [MiRequest | RequestsIns], backlogNum = BacklogNum + 1}} |
|
|
|
Request = agVstProtocol:request(IsSystem, Method, DbName, Path, QueryPars, Headers, Body), |
|
|
|
case gen_tcp:send(Socket, Request) of |
|
|
|
ok -> |
|
|
|
TimerRef = case OverTime of |
|
|
|
infinity -> |
|
|
|
undefined; |
|
|
|
_ -> |
|
|
|
erlang:start_timer(OverTime, self(), {mWaitingOver, MessageId}, [{abs, true}]) |
|
|
|
end, |
|
|
|
erlang:put(MessageId, {TimerRef, 0, <<>>}), |
|
|
|
{ok, SrvState, CliState#cliState{backlogNum = BacklogNum + 1}}; |
|
|
|
{error, Reason} -> |
|
|
|
?AgWarn(ServerName, ":send error: ~p ~p ~p ~n", [Reason, FromPid, MessageId]), |
|
|
|
gen_tcp:close(Socket), |
|
|
|
agAgencyUtils:agencyReply(FromPid, MessageId, undefined, {error, {socketSendError, Reason}}), |
|
|
|
agAgencyUtils:dealClose(SrvState, CliState, {error, {socketSendError, Reason}}) |
|
|
|
end |
|
|
|
end |
|
|
|
end; |
|
|
|
handleMsg({tcp, Socket, Data}, |
|
|
|
#srvState{serverName = ServerName, rn = Rn, rnrn = RnRn, socket = Socket} = SrvState, |
|
|
|
#cliState{isHeadMethod = IsHeadMethod, backlogNum = BacklogNum, curInfo = CurInfo, requestsIns = RequestsIns, requestsOuts = RequestsOuts, recvState = RecvState} = CliState) -> |
|
|
|
try agHttpProtocol:response(RecvState, Rn, RnRn, Data, IsHeadMethod) of |
|
|
|
#srvState{serverName = ServerName, socket = Socket} = SrvState, |
|
|
|
#cliState{revStatus = RevStatus, backlogNum = BacklogNum, buffer = Buffer} = CliState) -> |
|
|
|
try agVstProtocol:response(RevStatus, Buffer, Data) of |
|
|
|
{done, #recvState{statusCode = StatusCode, headers = Headers, body = Body}} -> |
|
|
|
agAgencyUtils:agencyReply(CurInfo, {StatusCode, Body, Headers}), |
|
|
|
case RequestsOuts of |
|
|
|
[] -> |
|
|
|
case RequestsIns of |
|
|
|
[] -> |
|
|
|
{ok, SrvState, CliState#cliState{backlogNum = BacklogNum - 1, status = leisure, curInfo = undefined, recvState = undefined}}; |
|
|
|
{ok, SrvState, CliState#cliState{backlogNum = BacklogNum - 1, revStatus = leisure, curInfo = undefined, recvState = undefined}}; |
|
|
|
[MiRequest] -> |
|
|
|
dealQueueRequest(MiRequest, SrvState, CliState#cliState{requestsIns = [], backlogNum = BacklogNum - 1, status = leisure, curInfo = undefined, recvState = undefined}); |
|
|
|
dealQueueRequest(MiRequest, SrvState, CliState#cliState{requestsIns = [], backlogNum = BacklogNum - 1, revStatus = leisure, curInfo = undefined, recvState = undefined}); |
|
|
|
MiRLists -> |
|
|
|
[MiRequest | Outs] = lists:reverse(MiRLists), |
|
|
|
dealQueueRequest(MiRequest, SrvState, CliState#cliState{requestsIns = [], requestsOuts = Outs, backlogNum = BacklogNum - 1, status = leisure, curInfo = undefined, recvState = undefined}) |
|
|
|
dealQueueRequest(MiRequest, SrvState, CliState#cliState{requestsIns = [], requestsOuts = Outs, backlogNum = BacklogNum - 1, revStatus = leisure, curInfo = undefined, recvState = undefined}) |
|
|
|
end; |
|
|
|
[MiRequest] -> |
|
|
|
dealQueueRequest(MiRequest, SrvState, CliState#cliState{requestsOuts = [], backlogNum = BacklogNum - 1, status = leisure, curInfo = undefined, recvState = undefined}); |
|
|
|
dealQueueRequest(MiRequest, SrvState, CliState#cliState{requestsOuts = [], backlogNum = BacklogNum - 1, revStatus = leisure, curInfo = undefined, recvState = undefined}); |
|
|
|
[MiRequest | Outs] -> |
|
|
|
dealQueueRequest(MiRequest, SrvState, CliState#cliState{requestsOuts = Outs, backlogNum = BacklogNum - 1, status = leisure, curInfo = undefined, recvState = undefined}) |
|
|
|
dealQueueRequest(MiRequest, SrvState, CliState#cliState{requestsOuts = Outs, backlogNum = BacklogNum - 1, revStatus = leisure, curInfo = undefined, recvState = undefined}) |
|
|
|
end; |
|
|
|
{ok, NewRecvState} -> |
|
|
|
{ok, SrvState, CliState#cliState{recvState = NewRecvState}}; |
|
|
|
{error, Reason} -> |
|
|
|
?WARN(ServerName, "handle tcp data error: ~p ~p ~n", [Reason, CurInfo]), |
|
|
|
?AgWarn(ServerName, "handle tcp data error: ~p ~p ~n", [Reason, CurInfo]), |
|
|
|
gen_tcp:close(Socket), |
|
|
|
agAgencyUtils:dealClose(SrvState, CliState, {error, {tcpDataError, Reason}}) |
|
|
|
catch |
|
|
|
E:R:S -> |
|
|
|
?WARN(ServerName, "handle tcp data crash: ~p:~p~n~p~n ~p ~n ", [E, R, S, CurInfo]), |
|
|
|
?AgWarn(ServerName, "handle tcp data crash: ~p:~p~n~p~n ~p ~n ", [E, R, S, CurInfo]), |
|
|
|
gen_tcp:close(Socket), |
|
|
|
agAgencyUtils:dealClose(SrvState, CliState, {error, agencyHandledataError}) |
|
|
|
end; |
|
|
|
handleMsg({timeout, TimerRef, waiting_over}, |
|
|
|
handleMsg({timeout, TimerRef, mWaitingOver}, |
|
|
|
#srvState{socket = Socket} = SrvState, |
|
|
|
#cliState{backlogNum = BacklogNum, curInfo = {FromPid, RequestId, TimerRef}} = CliState) -> |
|
|
|
agAgencyUtils:agencyReply(FromPid, RequestId, undefined, {error, timeout}), |
|
|
|
%% 之前的数据超时之后 要关闭tcp 然后重新建立连接 以免后面该tcp收到该次超时数据 影响后面请求的接收数据 导致数据错乱 |
|
|
|
gen_tcp:close(Socket), |
|
|
|
handleMsg(?miDoNetConnect, SrvState#srvState{socket = undefined}, CliState#cliState{backlogNum = BacklogNum - 1}); |
|
|
|
handleMsg(?AgMDoNetConn, SrvState#srvState{socket = undefined}, CliState#cliState{backlogNum = BacklogNum - 1}); |
|
|
|
handleMsg({tcp_closed, Socket}, |
|
|
|
#srvState{socket = Socket, serverName = ServerName} = SrvState, |
|
|
|
CliState) -> |
|
|
|
?WARN(ServerName, "connection closed~n", []), |
|
|
|
?AgWarn(ServerName, "connection closed~n", []), |
|
|
|
gen_tcp:close(Socket), |
|
|
|
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]), |
|
|
|
?AgWarn(ServerName, "connection error: ~p~n", [Reason]), |
|
|
|
gen_tcp:close(Socket), |
|
|
|
agAgencyUtils:dealClose(SrvState, CliState, {error, {tcp_error, Reason}}); |
|
|
|
handleMsg(?miDoNetConnect, |
|
|
|
handleMsg(?AgMDoNetConn, |
|
|
|
#srvState{poolName = PoolName, serverName = ServerName, reconnectState = ReconnectState} = SrvState, |
|
|
|
#cliState{requestsIns = RequestsIns, requestsOuts = RequestsOuts} = CliState) -> |
|
|
|
case ?agBeamPool:getv(PoolName) of |
|
|
@ -123,26 +118,26 @@ handleMsg(?miDoNetConnect, |
|
|
|
[] -> |
|
|
|
case RequestsIns of |
|
|
|
[] -> |
|
|
|
{ok, SrvState#srvState{userPassWord = UserPassword, dbName = DbName, host = Host, reconnectState = NewReconnectState, socket = Socket}, CliState#cliState{status = leisure, curInfo = undefined, recvState = undefined}}; |
|
|
|
{ok, SrvState#srvState{userPassWord = UserPassword, dbName = DbName, host = Host, reconnectState = NewReconnectState, socket = Socket}, CliState#cliState{revStatus = leisure, curInfo = undefined, recvState = undefined}}; |
|
|
|
[MiRequest] -> |
|
|
|
dealQueueRequest(MiRequest, SrvState#srvState{socket = Socket, reconnectState = NewReconnectState}, CliState#cliState{requestsIns = [], status = leisure, curInfo = undefined, recvState = undefined}); |
|
|
|
dealQueueRequest(MiRequest, SrvState#srvState{socket = Socket, reconnectState = NewReconnectState}, CliState#cliState{requestsIns = [], revStatus = leisure, curInfo = undefined, recvState = undefined}); |
|
|
|
MiRLists -> |
|
|
|
[MiRequest | Outs] = lists:reverse(MiRLists), |
|
|
|
dealQueueRequest(MiRequest, SrvState#srvState{socket = Socket, reconnectState = NewReconnectState}, CliState#cliState{requestsIns = [], requestsOuts = Outs, status = leisure, curInfo = undefined, recvState = undefined}) |
|
|
|
dealQueueRequest(MiRequest, SrvState#srvState{socket = Socket, reconnectState = NewReconnectState}, CliState#cliState{requestsIns = [], requestsOuts = Outs, revStatus = leisure, curInfo = undefined, recvState = undefined}) |
|
|
|
end; |
|
|
|
[MiRequest] -> |
|
|
|
dealQueueRequest(MiRequest, SrvState#srvState{socket = Socket, reconnectState = NewReconnectState}, CliState#cliState{requestsOuts = [], status = leisure, curInfo = undefined, recvState = undefined}); |
|
|
|
dealQueueRequest(MiRequest, SrvState#srvState{socket = Socket, reconnectState = NewReconnectState}, CliState#cliState{requestsOuts = [], revStatus = leisure, curInfo = undefined, recvState = undefined}); |
|
|
|
[MiRequest | Outs] -> |
|
|
|
dealQueueRequest(MiRequest, SrvState#srvState{socket = Socket, reconnectState = NewReconnectState}, CliState#cliState{requestsOuts = Outs, status = leisure, curInfo = undefined, recvState = undefined}) |
|
|
|
dealQueueRequest(MiRequest, SrvState#srvState{socket = Socket, reconnectState = NewReconnectState}, CliState#cliState{requestsOuts = Outs, revStatus = leisure, curInfo = undefined, recvState = undefined}) |
|
|
|
end; |
|
|
|
{error, _Reason} -> |
|
|
|
agAgencyUtils:reconnectTimer(SrvState, CliState) |
|
|
|
end; |
|
|
|
_Ret -> |
|
|
|
?WARN(ServerName, "deal connect not found agBeamPool:getv(~p) ret ~p is error ~n", [PoolName, _Ret]) |
|
|
|
?AgWarn(ServerName, "deal connect not found agBeamPool:getv(~p) ret ~p is error ~n", [PoolName, _Ret]) |
|
|
|
end; |
|
|
|
handleMsg(Msg, #srvState{serverName = ServerName} = SrvState, CliState) -> |
|
|
|
?WARN(ServerName, "unknown msg: ~p~n", [Msg]), |
|
|
|
?AgWarn(ServerName, "unknown msg: ~p~n", [Msg]), |
|
|
|
{ok, SrvState, CliState}. |
|
|
|
|
|
|
|
-spec terminate(term(), srvState(), cliState()) -> ok. |
|
|
@ -155,7 +150,7 @@ terminate(_Reason, |
|
|
|
ok. |
|
|
|
|
|
|
|
-spec overAllWork(srvState(), cliState()) -> {ok, srvState(), cliState()}. |
|
|
|
overAllWork(SrvState, #cliState{requestsIns = RequestsIns, requestsOuts = RequestsOuts, status = Status} = CliState) -> |
|
|
|
overAllWork(SrvState, #cliState{requestsIns = RequestsIns, requestsOuts = RequestsOuts, revStatus = Status} = CliState) -> |
|
|
|
case Status of |
|
|
|
leisure -> |
|
|
|
case RequestsOuts of |
|
|
@ -179,7 +174,7 @@ overAllWork(SrvState, #cliState{requestsIns = RequestsIns, requestsOuts = Reques |
|
|
|
end. |
|
|
|
|
|
|
|
-spec overDealQueueRequest(miRequest(), srvState(), cliState()) -> {ok, srvState(), cliState()}. |
|
|
|
overDealQueueRequest(#miRequest{method = Method, path = Path, headers = Headers, body = Body, requestId = RequestId, fromPid = FromPid, overTime = OverTime, isSystem = IsSystem}, |
|
|
|
overDealQueueRequest(#miRequest{method = Method, path = Path, headers = Headers, body = Body, messageId = RequestId, fromPid = FromPid, overTime = OverTime, isSystem = IsSystem}, |
|
|
|
#srvState{serverName = ServerName, host = Host, userPassWord = UserPassWord, dbName = DbName, socket = Socket} = SrvState, |
|
|
|
#cliState{requestsIns = RequestsIns, requestsOuts = RequestsOuts, backlogNum = BacklogNum} = CliState) -> |
|
|
|
case erlang:monotonic_time(millisecond) > OverTime of |
|
|
@ -203,7 +198,7 @@ overDealQueueRequest(#miRequest{method = Method, path = Path, headers = Headers, |
|
|
|
overDealQueueRequest(MiRequest, SrvState, CliState#cliState{requestsOuts = Outs, backlogNum = BacklogNum - 1}) |
|
|
|
end; |
|
|
|
_ -> |
|
|
|
Request = agHttpProtocol:request(IsSystem, Body, Method, Host, DbName, Path, [UserPassWord | Headers]), |
|
|
|
Request = agVstProtocol:request(IsSystem, Body, Method, Host, DbName, Path, [UserPassWord | Headers]), |
|
|
|
case gen_tcp:send(Socket, Request) of |
|
|
|
ok -> |
|
|
|
TimerRef = |
|
|
@ -211,11 +206,11 @@ overDealQueueRequest(#miRequest{method = Method, path = Path, headers = Headers, |
|
|
|
infinity -> |
|
|
|
undefined; |
|
|
|
_ -> |
|
|
|
erlang:start_timer(OverTime, self(), waiting_over, [{abs, true}]) |
|
|
|
erlang:start_timer(OverTime, self(), mWaitingOver, [{abs, true}]) |
|
|
|
end, |
|
|
|
overReceiveTcpData(SrvState, CliState#cliState{isHeadMethod = Method == ?AgHead, status = waiting, curInfo = {FromPid, RequestId, TimerRef}}); |
|
|
|
overReceiveTcpData(SrvState, CliState#cliState{isHeadMethod = Method == ?AgHead, revStatus = waiting, curInfo = {FromPid, RequestId, TimerRef}}); |
|
|
|
{error, Reason} -> |
|
|
|
?WARN(ServerName, ":send error: ~p~n", [Reason]), |
|
|
|
?AgWarn(ServerName, ":send error: ~p~n", [Reason]), |
|
|
|
gen_tcp:close(Socket), |
|
|
|
agAgencyUtils:agencyReply(FromPid, RequestId, undefined, {error, socketSendError}), |
|
|
|
agAgencyUtils:dealClose(SrvState, CliState, {error, socketSendError}) |
|
|
@ -227,38 +222,38 @@ overReceiveTcpData(#srvState{poolName = PoolName, serverName = ServerName, rn = |
|
|
|
#cliState{isHeadMethod = IsHeadMethod, backlogNum = BacklogNum, curInfo = CurInfo, requestsIns = RequestsIns, requestsOuts = RequestsOuts, recvState = RecvState} = CliState) -> |
|
|
|
receive |
|
|
|
{tcp, Socket, Data} -> |
|
|
|
try agHttpProtocol:response(RecvState, Rn, RnRn, Data, IsHeadMethod) of |
|
|
|
try agVstProtocol:response(RecvState, Rn, RnRn, Data, IsHeadMethod) of |
|
|
|
{done, #recvState{statusCode = StatusCode, headers = Headers, body = Body}} -> |
|
|
|
agAgencyUtils:agencyReply(CurInfo, {StatusCode, Body, Headers}), |
|
|
|
case RequestsOuts of |
|
|
|
[] -> |
|
|
|
case RequestsIns of |
|
|
|
[] -> |
|
|
|
{ok, SrvState, CliState#cliState{backlogNum = BacklogNum - 1, status = leisure, curInfo = undefined, recvState = undefined}}; |
|
|
|
{ok, SrvState, CliState#cliState{backlogNum = BacklogNum - 1, revStatus = leisure, curInfo = undefined, recvState = undefined}}; |
|
|
|
[MiRequest] -> |
|
|
|
dealQueueRequest(MiRequest, SrvState, CliState#cliState{requestsIns = [], backlogNum = BacklogNum - 1, status = leisure, curInfo = undefined, recvState = undefined}); |
|
|
|
dealQueueRequest(MiRequest, SrvState, CliState#cliState{requestsIns = [], backlogNum = BacklogNum - 1, revStatus = leisure, curInfo = undefined, recvState = undefined}); |
|
|
|
MiRLists -> |
|
|
|
[MiRequest | Outs] = lists:reverse(MiRLists), |
|
|
|
dealQueueRequest(MiRequest, SrvState, CliState#cliState{requestsIns = [], requestsOuts = Outs, backlogNum = BacklogNum - 1, status = leisure, curInfo = undefined, recvState = undefined}) |
|
|
|
dealQueueRequest(MiRequest, SrvState, CliState#cliState{requestsIns = [], requestsOuts = Outs, backlogNum = BacklogNum - 1, revStatus = leisure, curInfo = undefined, recvState = undefined}) |
|
|
|
end; |
|
|
|
[MiRequest] -> |
|
|
|
dealQueueRequest(MiRequest, SrvState, CliState#cliState{requestsOuts = [], backlogNum = BacklogNum - 1, status = leisure, curInfo = undefined, recvState = undefined}); |
|
|
|
dealQueueRequest(MiRequest, SrvState, CliState#cliState{requestsOuts = [], backlogNum = BacklogNum - 1, revStatus = leisure, curInfo = undefined, recvState = undefined}); |
|
|
|
[MiRequest | Outs] -> |
|
|
|
dealQueueRequest(MiRequest, SrvState, CliState#cliState{requestsOuts = Outs, backlogNum = BacklogNum - 1, status = leisure, curInfo = undefined, recvState = undefined}) |
|
|
|
dealQueueRequest(MiRequest, SrvState, CliState#cliState{requestsOuts = Outs, backlogNum = BacklogNum - 1, revStatus = leisure, curInfo = undefined, recvState = undefined}) |
|
|
|
end; |
|
|
|
{ok, NewRecvState} -> |
|
|
|
overReceiveTcpData(SrvState, CliState#cliState{recvState = NewRecvState}); |
|
|
|
{error, Reason} -> |
|
|
|
?WARN(overReceiveTcpData, "handle tcp data error: ~p ~n", [Reason]), |
|
|
|
?AgWarn(overReceiveTcpData, "handle tcp data error: ~p ~n", [Reason]), |
|
|
|
gen_tcp:close(Socket), |
|
|
|
agAgencyUtils:dealClose(SrvState, CliState, {error, {tcpDataError, Reason}}) |
|
|
|
catch |
|
|
|
E:R:S -> |
|
|
|
?WARN(overReceiveTcpData, "handle tcp data crash: ~p:~p~n~p ~n ", [E, R, S]), |
|
|
|
?AgWarn(overReceiveTcpData, "handle tcp data crash: ~p:~p~n~p ~n ", [E, R, S]), |
|
|
|
gen_tcp:close(Socket), |
|
|
|
agAgencyUtils:dealClose(SrvState, CliState, {error, {tcp_error, handledataError}}) |
|
|
|
end; |
|
|
|
{timeout, TimerRef, waiting_over} -> |
|
|
|
{timeout, TimerRef, mWaitingOver} -> |
|
|
|
case CurInfo of |
|
|
|
{_PidForm, _RequestId, TimerRef} -> |
|
|
|
gen_tcp:close(Socket), |
|
|
@ -268,13 +263,13 @@ overReceiveTcpData(#srvState{poolName = PoolName, serverName = ServerName, rn = |
|
|
|
[] -> |
|
|
|
case RequestsIns of |
|
|
|
[] -> |
|
|
|
{ok, SrvState, CliState#cliState{backlogNum = BacklogNum - 1, status = leisure, curInfo = undefined, recvState = undefined}}; |
|
|
|
{ok, SrvState, CliState#cliState{backlogNum = BacklogNum - 1, revStatus = leisure, curInfo = undefined, recvState = undefined}}; |
|
|
|
[MiRequest] -> |
|
|
|
case ?agBeamPool:getv(PoolName) of |
|
|
|
#dbOpts{port = Port, hostname = HostName, socketOpts = SocketOpts} -> |
|
|
|
case dealConnect(ServerName, HostName, Port, SocketOpts) of |
|
|
|
{ok, NewSocket} -> |
|
|
|
overDealQueueRequest(MiRequest, SrvState#srvState{socket = NewSocket}, CliState#cliState{requestsIns = [], status = leisure, curInfo = undefined, recvState = undefined}); |
|
|
|
overDealQueueRequest(MiRequest, SrvState#srvState{socket = NewSocket}, CliState#cliState{requestsIns = [], revStatus = leisure, curInfo = undefined, recvState = undefined}); |
|
|
|
{error, _Reason} -> |
|
|
|
agAgencyUtils:dealClose(SrvState, CliState, {error, {newTcpConnectErrorOver, _Reason}}) |
|
|
|
end; |
|
|
@ -287,7 +282,7 @@ overReceiveTcpData(#srvState{poolName = PoolName, serverName = ServerName, rn = |
|
|
|
#dbOpts{port = Port, hostname = HostName, socketOpts = SocketOpts} -> |
|
|
|
case dealConnect(ServerName, HostName, Port, SocketOpts) of |
|
|
|
{ok, NewSocket} -> |
|
|
|
overDealQueueRequest(MiRequest, SrvState#srvState{socket = NewSocket}, CliState#cliState{requestsIns = [], requestsOuts = Outs, status = leisure, curInfo = undefined, recvState = undefined}); |
|
|
|
overDealQueueRequest(MiRequest, SrvState#srvState{socket = NewSocket}, CliState#cliState{requestsIns = [], requestsOuts = Outs, revStatus = leisure, curInfo = undefined, recvState = undefined}); |
|
|
|
{error, _Reason} -> |
|
|
|
agAgencyUtils:dealClose(SrvState, CliState, {error, {newTcpConnectErrorOver, _Reason}}) |
|
|
|
end; |
|
|
@ -300,7 +295,7 @@ overReceiveTcpData(#srvState{poolName = PoolName, serverName = ServerName, rn = |
|
|
|
#dbOpts{port = Port, hostname = HostName, socketOpts = SocketOpts} -> |
|
|
|
case dealConnect(ServerName, HostName, Port, SocketOpts) of |
|
|
|
{ok, NewSocket} -> |
|
|
|
overDealQueueRequest(MiRequest, SrvState#srvState{socket = NewSocket}, CliState#cliState{requestsOuts = [], status = leisure, curInfo = undefined, recvState = undefined}); |
|
|
|
overDealQueueRequest(MiRequest, SrvState#srvState{socket = NewSocket}, CliState#cliState{requestsOuts = [], revStatus = leisure, curInfo = undefined, recvState = undefined}); |
|
|
|
{error, _Reason} -> |
|
|
|
agAgencyUtils:dealClose(SrvState, CliState, {error, {newTcpConnectErrorOver, _Reason}}) |
|
|
|
end; |
|
|
@ -312,7 +307,7 @@ overReceiveTcpData(#srvState{poolName = PoolName, serverName = ServerName, rn = |
|
|
|
#dbOpts{port = Port, hostname = HostName, socketOpts = SocketOpts} -> |
|
|
|
case dealConnect(ServerName, HostName, Port, SocketOpts) of |
|
|
|
{ok, NewSocket} -> |
|
|
|
overDealQueueRequest(MiRequest, SrvState#srvState{socket = NewSocket}, CliState#cliState{requestsOuts = Outs, status = leisure, curInfo = undefined, recvState = undefined}); |
|
|
|
overDealQueueRequest(MiRequest, SrvState#srvState{socket = NewSocket}, CliState#cliState{requestsOuts = Outs, revStatus = leisure, curInfo = undefined, recvState = undefined}); |
|
|
|
{error, _Reason} -> |
|
|
|
agAgencyUtils:dealClose(SrvState, CliState, {error, {newTcpConnectErrorOver, _Reason}}) |
|
|
|
end; |
|
|
@ -321,7 +316,7 @@ overReceiveTcpData(#srvState{poolName = PoolName, serverName = ServerName, rn = |
|
|
|
end |
|
|
|
end; |
|
|
|
_ -> |
|
|
|
?WARN(overReceiveTcpData, "receive waiting_over TimerRef not match: ~p~n", [TimerRef]), |
|
|
|
?AgWarn(overReceiveTcpData, "receive waiting_over TimerRef not match: ~p~n", [TimerRef]), |
|
|
|
overReceiveTcpData(SrvState, CliState) |
|
|
|
end; |
|
|
|
{tcp_closed, Socket} -> |
|
|
@ -333,7 +328,7 @@ overReceiveTcpData(#srvState{poolName = PoolName, serverName = ServerName, rn = |
|
|
|
#miRequest{} = MiRequest -> |
|
|
|
overReceiveTcpData(SrvState, CliState#cliState{requestsIns = [MiRequest | RequestsIns], backlogNum = BacklogNum + 1}); |
|
|
|
_Msg -> |
|
|
|
?WARN(overReceiveTcpData, "receive unexpect msg: ~p~n", [_Msg]), |
|
|
|
?AgWarn(overReceiveTcpData, "receive unexpect msg: ~p~n", [_Msg]), |
|
|
|
overReceiveTcpData(SrvState, CliState) |
|
|
|
end. |
|
|
|
|
|
|
@ -342,20 +337,20 @@ dealConnect(ServerName, HostName, Port, SocketOptions) -> |
|
|
|
case inet:getaddrs(HostName, inet) of |
|
|
|
{ok, IPList} -> |
|
|
|
Ip = agMiscUtils:randomElement(IPList), |
|
|
|
case gen_tcp:connect(Ip, Port, SocketOptions, ?DEFAULT_CONNECT_TIMEOUT) of |
|
|
|
case gen_tcp:connect(Ip, Port, SocketOptions, ?AgDefConnTimeout) of |
|
|
|
{ok, Socket} -> |
|
|
|
{ok, Socket}; |
|
|
|
{error, Reason} -> |
|
|
|
?WARN(ServerName, "connect error: ~p~n", [Reason]), |
|
|
|
?AgWarn(ServerName, "connect error: ~p~n", [Reason]), |
|
|
|
{error, Reason} |
|
|
|
end; |
|
|
|
{error, Reason} -> |
|
|
|
?WARN(ServerName, "getaddrs error: ~p~n", [Reason]), |
|
|
|
?AgWarn(ServerName, "getaddrs error: ~p~n", [Reason]), |
|
|
|
{error, Reason} |
|
|
|
end. |
|
|
|
|
|
|
|
-spec dealQueueRequest(miRequest(), srvState(), cliState()) -> {ok, srvState(), cliState()}. |
|
|
|
dealQueueRequest(#miRequest{method = Method, path = Path, headers = Headers, body = Body, requestId = RequestId, fromPid = FromPid, overTime = OverTime, isSystem = IsSystem}, |
|
|
|
dealQueueRequest(#miRequest{method = Method, path = Path, headers = Headers, body = Body, messageId = RequestId, fromPid = FromPid, overTime = OverTime, isSystem = IsSystem}, |
|
|
|
#srvState{serverName = ServerName, host = Host, userPassWord = UserPassWord, dbName = DbName, socket = Socket} = SrvState, |
|
|
|
#cliState{requestsIns = RequestsIns, requestsOuts = RequestsOuts, backlogNum = BacklogNum} = CliState) -> |
|
|
|
case erlang:monotonic_time(millisecond) > OverTime of |
|
|
@ -379,7 +374,7 @@ dealQueueRequest(#miRequest{method = Method, path = Path, headers = Headers, bod |
|
|
|
dealQueueRequest(MiRequest, SrvState, CliState#cliState{requestsOuts = Outs, backlogNum = BacklogNum - 1}) |
|
|
|
end; |
|
|
|
_ -> |
|
|
|
Request = agHttpProtocol:request(IsSystem, Body, Method, Host, DbName, Path, [UserPassWord | Headers]), |
|
|
|
Request = agVstProtocol:request(IsSystem, Body, Method, Host, DbName, Path, [UserPassWord | Headers]), |
|
|
|
case gen_tcp:send(Socket, Request) of |
|
|
|
ok -> |
|
|
|
TimerRef = |
|
|
@ -387,11 +382,11 @@ dealQueueRequest(#miRequest{method = Method, path = Path, headers = Headers, bod |
|
|
|
infinity -> |
|
|
|
undefined; |
|
|
|
_ -> |
|
|
|
erlang:start_timer(OverTime, self(), waiting_over, [{abs, true}]) |
|
|
|
erlang:start_timer(OverTime, self(), mWaitingOver, [{abs, true}]) |
|
|
|
end, |
|
|
|
{ok, SrvState, CliState#cliState{isHeadMethod = Method == ?AgHead, status = waiting, curInfo = {FromPid, RequestId, TimerRef}}}; |
|
|
|
{ok, SrvState, CliState#cliState{isHeadMethod = Method == ?AgHead, revStatus = waiting, curInfo = {FromPid, RequestId, TimerRef}}}; |
|
|
|
{error, Reason} -> |
|
|
|
?WARN(ServerName, ":send error: ~p~n", [Reason]), |
|
|
|
?AgWarn(ServerName, ":send error: ~p~n", [Reason]), |
|
|
|
gen_tcp:close(Socket), |
|
|
|
agAgencyUtils:agencyReply(FromPid, RequestId, undefined, {error, socketSendError}), |
|
|
|
agAgencyUtils:dealClose(SrvState, CliState, {error, socketSendError}) |
|
|
|