[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