[Tsung] Re: keepalive packets
Jason Tucker
jasonwtucker at gmail.com
Sat May 19 21:57:07 CEST 2007
OK, there were some issues there. This version seems to work better:
%% local ack, set ack_done to true
handle_data_msg(Data, State=#state_rcv{request=Req, maxcount= MaxCount}) ->
NewBuffer= set_new_buffer(Req, State#state_rcv.buffer, Data),
DataSize = size(Data),
if
DataSize < 2 ->
%% our dyndata must in a packet larger than 1 byte, set ack_done
to false
ts_mon:rcvmes({State#state_rcv.dump, self(), Data}),
{State#state_rcv{ack_done = false, buffer= NewBuffer},[]};
true ->
%% this packet is a candidate to contain dyndata, set ack_done
to true
ts_mon:rcvmes({State#state_rcv.dump, self(), Data}),
{PageTimeStamp, DynVars} =
update_stats(State#state_rcv{datasize=DataSize,
buffer=NewBuffer}),
NewCount = ts_search:match(Req#ts_request.match, NewBuffer,
{State#state_rcv.count,MaxCount}),
NewDynData = concat_dynvars(DynVars, State#state_rcv.dyndata),
{State#state_rcv{ack_done = true, buffer= NewBuffer, dyndata =
NewDynData,
page_timestamp= PageTimeStamp, count=NewCount},[]}
end.
__Jason
On 5/18/07, Jason Tucker <jasonwtucker at gmail.com> wrote:
>
>
>
> I *think* I found a fix for this condition in ts_client.erl. Here is the
> original code:
>
> %% local ack, set ack_done to true
> handle_data_msg(Data, State=#state_rcv{request=Req, maxcount= MaxCount}) ->
>
> ts_mon:rcvmes({State#state_rcv.dump, self(), Data}),
> NewBuffer= set_new_buffer(Req, State#state_rcv.buffer, Data),
> DataSize = size(Data),
> {PageTimeStamp, DynVars} = update_stats(State#state_rcv{datasize=DataSize,
>
> buffer=NewBuffer}),
> NewCount = ts_search:match(Req#ts_request.match, NewBuffer, {State#state_rcv.count,MaxCount}),
> NewDynData = concat_dynvars(DynVars, State#state_rcv.dyndata),
>
> {State#state_rcv{ack_done = true, buffer= NewBuffer, dyndata = NewDynData,
> page_timestamp= PageTimeStamp, count=NewCount},[]}.
>
>
> And here is the change I made - I just added an if statement which checks
> size(Data) :
>
> %% local ack, set ack_done to true
> handle_data_msg(Data, State=#state_rcv{request=Req, maxcount= MaxCount}) ->
> ts_mon:rcvmes({State#state_rcv.dump, self(), Data}),
> NewBuffer= set_new_buffer(Req, State#state_rcv.buffer, Data),
>
> DataSize = size(Data),
> {PageTimeStamp, DynVars} = update_stats(State#state_rcv{datasize=DataSize,
> buffer=NewBuffer}),
> NewCount = ts_search:match(Req#ts_request.match, NewBuffer, {State#state_rcv.count,MaxCount}),
>
> NewDynData = concat_dynvars(DynVars, State#state_rcv.dyndata),
>
> if
> size(Data) < 2 ->
> %% our dyndata must in a packet larger than 1 byte, set ack_done to false
> {State#state_rcv{ack_done = false, buffer= NewBuffer, dyndata = NewDynData,
>
> page_timestamp= PageTimeStamp, count=NewCount},[]};
> true ->
> %% this packet is a candidate to contain dyndata, set ack_done to true
> {State#state_rcv{ack_done = true, buffer= NewBuffer, dyndata = NewDynData,
>
> page_timestamp= PageTimeStamp, count=NewCount},[]}
> end.
>
>
> I'm still testing this, but so far, it seems to work. If the client is
> expecting a server response to populate a dynvar, and a keepalive packet
> comes in first, the client will just keep waiting for a properly sized
> packet to fulfill the local_ack requirement.
>
> __Jason
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.process-one.net/pipermail/tsung-users/attachments/20070519/375eada7/attachment.html
More information about the Tsung-users
mailing list