You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@jmeter.apache.org by prasanna bhat <pr...@gmail.com> on 2010/05/08 15:18:33 UTC

Thread Synchronization

Hi,

I have interesting use case in which the value of a given variable has to be
compared across threads. I will try my best to illustrate it below.

TestPlan
+ThreadGroup ( 5threads, 2loops)
++Http sampler 1 (This  sampler  will fetch all the requests that are
waiting for approval)
+++ BSF Post Processor 1
++ Http Sampler 2 (The sampler sends the request id which has to be
approved)
+++ BSF Post Processor 2

The response of Http sampler 1 will contain a list of ids of the requests to
be approved. I'm fetching the first request id and sending it as a parameter
to Http Sampler 2 for approval.

The problem occurs when the 1st thread has picked a certain request id (say
request id 1101) and send it as a parameter to Http Sampler 2 for approval,
but before this request has been approved the second thread gets active and
send a http request (Http Sampler 1) and receives all the request ids to be
approved as a response, therefore the second thread also sees request id
1101 (Since it has not been approved yet) and picks it up for approval i.e.
the same request id is passed to Http Sampler 2 for second thread also.  Now
there is clash of multiple threads trying to approve the same request and
the server responds with an error.



So my question is, how do I ensure different threads pick different request
id (i.e one that is not picked up by any of the other active threads)??



Please let me know if I have to make it more clearer.



Thanks,

Prasanna

Re: Thread Synchronization

Posted by prasanna bhat <pr...@gmail.com>.
Hi Deepak,



>> by loading the string form of all the ids into properties object , where
based on the thread number one gets picked



Well in the beginning I tried using the setproperty() and __P() functions to
set and get the request Ids. I observed some weird errors.



I used WRS_Property to set the Request Ids which were chosen for approval
and I initially set it to 0 in the test plan.



+ThreadGroup ( 5threads, 2loops)
++Http sampler 1 (This  sampler  will fetch all the requests that are
waiting for approval)
+++ BSF Post Processor 1

                [

                                Var prevRequestId=read WRS_Property;



                                If WRS_Property is 0

                                                Then select the first
request id

                                Else

                                                Loop:

                                                                Generate a
random number and get the request Id corresponding to that random number.

                                                                If this
request Id is not same as prevRequestId


Break;



                                                Vars.put(“curRequestId”,
selectedRequestId);



                ]
++ Http Sampler 2 (The sampler sends the request id which has to be
approved)
+++ BSF Post Processor 2

                [



                                Var requestIdList=read WRS_Property;



                                If requestIdList is 0

                                                Set WRS_Property to current
request Id

                                Else

                                                Set
WRS_Property=requestIdList+”;”+vars.get(currentRequestId);

                ]





With this script in place I got the output to be

--------------------------------------------------------------

Prev WRS id: 0

Cur WRS id150399

RequestId Set To: 150399

--------------------------------------------------------------

Prev WRS id: undefined;150399

Found curRequestId: 150399

RequestId Set To: undefined;150399;150399

--------------------------------------------------------------

Prev WRS id: undefined;null

Found curRequestId: null

RequestId Set To: undefined;null;null

--------------------------------------------------------------

Prev WRS id: undefined;null

Found curRequestId: null

RequestId Set To: undefined;null;null



I’m not able to figure out why is this happening.



I have also attached the code in the BSF post processor 1 and BSF post
processor 2 in the mail.



In the mean time I will try other options you have pointed out.



Thanks for your time.



Regards,

Prasanna




On Sat, May 8, 2010 at 9:32 PM, Deepak Shetty <sh...@gmail.com> wrote:

> Hi
>  If it isnt possible to choose a simple scheme (like map a thread number to
> the id picked i.e. thread1 always picks first id , thread 2 picks second
> id)
>
> or by loading the string form of all the ids into properties object , where
> based on the thread number one gets picked
>
> then you'd have to either
> split the fetching of ids separate to the approval process
> Thread Group 1
> +Sampler 1
> ++Write all ids to CSV
> Thread Group 2
> +Sampler 2
> ++CSV DataSet Config
>
> Its also possible to combine the two thread groups into one (this needs
> some
> custom java code)
> Thread Group
> +Sampler1
> ++Each writes to their own CSV
> +Ensure only one thread writes a combined file , while the rest wait
> +Sampler 2
> CSV Data Set Config
>
> or some custom java object which allows concurrent access and can keep a
> list of ids fetched(static) and hand out  a different one to whoever
> requests it
>
> regards
> deepak
>
>
> On Sat, May 8, 2010 at 6:18 AM, prasanna bhat <prasannabhat38@gmail.com
> >wrote:
>
> > Hi,
> >
> > I have interesting use case in which the value of a given variable has to
> > be
> > compared across threads. I will try my best to illustrate it below.
> >
> > TestPlan
> > +ThreadGroup ( 5threads, 2loops)
> > ++Http sampler 1 (This  sampler  will fetch all the requests that are
> > waiting for approval)
> > +++ BSF Post Processor 1
> > ++ Http Sampler 2 (The sampler sends the request id which has to be
> > approved)
> > +++ BSF Post Processor 2
> >
> > The response of Http sampler 1 will contain a list of ids of the requests
> > to
> > be approved. I'm fetching the first request id and sending it as a
> > parameter
> > to Http Sampler 2 for approval.
> >
> > The problem occurs when the 1st thread has picked a certain request id
> (say
> > request id 1101) and send it as a parameter to Http Sampler 2 for
> approval,
> > but before this request has been approved the second thread gets active
> and
> > send a http request (Http Sampler 1) and receives all the request ids to
> be
> > approved as a response, therefore the second thread also sees request id
> > 1101 (Since it has not been approved yet) and picks it up for approval
> i.e.
> > the same request id is passed to Http Sampler 2 for second thread also.
> >  Now
> > there is clash of multiple threads trying to approve the same request and
> > the server responds with an error.
> >
> >
> >
> > So my question is, how do I ensure different threads pick different
> request
> > id (i.e one that is not picked up by any of the other active threads)??
> >
> >
> >
> > Please let me know if I have to make it more clearer.
> >
> >
> >
> > Thanks,
> >
> > Prasanna
> >
>

Re: Thread Synchronization

Posted by Deepak Shetty <sh...@gmail.com>.
Hi
 If it isnt possible to choose a simple scheme (like map a thread number to
the id picked i.e. thread1 always picks first id , thread 2 picks second id)

or by loading the string form of all the ids into properties object , where
based on the thread number one gets picked

then you'd have to either
split the fetching of ids separate to the approval process
Thread Group 1
+Sampler 1
++Write all ids to CSV
Thread Group 2
+Sampler 2
++CSV DataSet Config

Its also possible to combine the two thread groups into one (this needs some
custom java code)
Thread Group
+Sampler1
++Each writes to their own CSV
+Ensure only one thread writes a combined file , while the rest wait
+Sampler 2
CSV Data Set Config

or some custom java object which allows concurrent access and can keep a
list of ids fetched(static) and hand out  a different one to whoever
requests it

regards
deepak


On Sat, May 8, 2010 at 6:18 AM, prasanna bhat <pr...@gmail.com>wrote:

> Hi,
>
> I have interesting use case in which the value of a given variable has to
> be
> compared across threads. I will try my best to illustrate it below.
>
> TestPlan
> +ThreadGroup ( 5threads, 2loops)
> ++Http sampler 1 (This  sampler  will fetch all the requests that are
> waiting for approval)
> +++ BSF Post Processor 1
> ++ Http Sampler 2 (The sampler sends the request id which has to be
> approved)
> +++ BSF Post Processor 2
>
> The response of Http sampler 1 will contain a list of ids of the requests
> to
> be approved. I'm fetching the first request id and sending it as a
> parameter
> to Http Sampler 2 for approval.
>
> The problem occurs when the 1st thread has picked a certain request id (say
> request id 1101) and send it as a parameter to Http Sampler 2 for approval,
> but before this request has been approved the second thread gets active and
> send a http request (Http Sampler 1) and receives all the request ids to be
> approved as a response, therefore the second thread also sees request id
> 1101 (Since it has not been approved yet) and picks it up for approval i.e.
> the same request id is passed to Http Sampler 2 for second thread also.
>  Now
> there is clash of multiple threads trying to approve the same request and
> the server responds with an error.
>
>
>
> So my question is, how do I ensure different threads pick different request
> id (i.e one that is not picked up by any of the other active threads)??
>
>
>
> Please let me know if I have to make it more clearer.
>
>
>
> Thanks,
>
> Prasanna
>