Hello Sebb, By proxy do you mean: Proxy.newProxyInstance and InvocationHandler, if so aren't we missing an Interface (Sampler does not do the job and it does not use Entry parameter). If so I agree lot of job.
Regarding the need to clone sampler, why do we need this, is there some data that may be corrupted except CookieManager ? I implemented the approach with CookieManager in ThreadLocal and it works without need for thread safety. I will attach it to ISSUE to let you review it. Regards Philippe On Fri, Oct 7, 2011 at 2:46 AM, sebb <seb...@gmail.com> wrote: > On 7 October 2011 00:00, sebb <seb...@gmail.com> wrote: > > On 6 October 2011 22:17, Philippe Mouawad <philippe.moua...@gmail.com> > wrote: > >> Hello Sebb, > >> My responses below, there is one remaining point and I think we can go > for > >> implementation (i can do it if you agree). > >> > >> Regards > >> Philippe > >> > >> On Thu, Oct 6, 2011 at 12:01 AM, sebb <seb...@gmail.com> wrote: > >> > >>> On 5 October 2011 21:46, Philippe Mouawad <philippe.moua...@gmail.com> > >>> wrote: > >>> > Hello Sebb, all, > >>> > First a note regarding > >>> > "If cookies are being ignored, then the cookie manager property can > just > >>> be > >>> > cleared - i.e. there is no cookie manager." > >>> > > >>> > Just to be sure I understand, you mean "Cookies of embedded resources > are > >>> > not used", because download of embedded resources may require > JSESSIONID > >>> > cookie at least or any cookie containing Session information. > >>> > In this case can CookieManager be null or shouln't it be cloned from > >>> parent > >>> > but it's result not used ? Maybe that's what you mean or I missed > >>> something. > >>> > >>> I forgot that cookies might be needed to access the embedded > >>> resources, so that won't work. > >>> > >>> > So, regarding your last comment on 51919 here is an updated > >>> implementation > >>> > proposition: > >>> > > >>> > - Add an option "embedded_resources_use_cookies" to use Cookies we > get > >>> > from embedded resources (conc or serial) download, default value > will > >>> be > >>> > true (to handle frames by default). > >>> > >>> I don't think we need the option. > >>> > >> OK > >> > >>> > >>> > - Create a Bean AsynSamplerResultHolder that will hold: > >>> > - HTTPSampleResult > >>> > - Cookie[] > >>> > >>> Yes, something like that. > >>> > >> OK > >> > >>> > >>> > *Conc download:* > >>> > > >>> > - Pass CookieManager to AsynSampler, clone it and add existing > cookie, > >>> > and store it in ThreadLocal > >>> > >>> No need; if the cookie manager is cloned it can be stored in the normal > >>> place. > >>> > >>> I don't think so, because if we clone and set in normal place (call > >> setCookieManager() in call() method of AsyncSampler ) as we are > calling > >> HTTPSamplerBase.this.sample(...), we are working on same instance as > Parent > >> Sampler (that runs conc) it will take place of parent Cookie Manager. > >> Either I didn't get what you mean otherwise I think we must store it in > >> ThreadLocal > > > > We need to clone the sampler and the cookie manager. > > > > AsynchSampler needs to be static; it can be passed "this" when it is > created. > > Its constructor then clones this, and replaces the Cookie Manager (if > > any) with a copy of the CM, and copy the cookies as well. > > > > Probably need to add a copy constuctor to CM to make this easier. > > > > AsyncSampler then uses the cloned sampler to access the sample method. > > > > I'll do the first bit shortly - converting the AsychSampler to a > > static class - and you can do the rest. > > Unfortunately, cloning the sampler is not easy. > I've had a look at wrapping the sampler to intercept calls to > getCookieManager() but AFAICT that would require writing an > interceptor proxy. > Which is potentially a lot of work. > > I need to give this some more thought. > > >> > >>> > - At end of sample: > >>> > - If "embedded_resources_use_cookies" is false =>build > >>> > AsynSamplerResultHolder > >>> > with HTTPSampleResult and empty cookies array > >>> > - If "embedded_resources_use_cookies" is true =>build > >>> > AsynSamplerResultHolder > >>> > with HTTPSampleResult and new cookies > >>> > - Inside FutureResult#get loop, merge result in CookieManager > >>> > >>> Yes. > >>> > >> OK, getCookieManager.add() will do the job. > >> > >>> > >>> > *Serial Mode: > >>> > * > >>> > > >>> > - Before start of sample, backup CookieManager > >>> > - At end of sample: > >>> > - If "embedded_resources_use_cookies" is false => ignore cookies > >>> > - If "embedded_resources_use_cookies" is true => add cookies to > >>> backup > >>> > CookieManager > >>> > >>> No need. > >>> > >> OK > >> > >>> > >>> > > >>> > Modify HTTPSamplerBase#getCookieManager to get CookieManager first > from > >>> > Thread Local then from testElement. (as today) > >>> > > >>> > > >>> > Waiting for your comments on this. > >>> > >>> I was thinking that ignoring cookies would simplify the problem, but > >>> it does not seem to. > >>> > >>> So the only change we would need to do is to clone the cookies for > >>> each task, and collect them again at the end. > >>> > >>> No need to make the cookie storage class thread-safe. > >>> > >>> OK > >> > >> > >>> > Regards > >>> > Philippe > >>> > > >>> > On Mon, Oct 3, 2011 at 5:02 PM, sebb <seb...@gmail.com> wrote: > >>> > > >>> >> On 3 October 2011 15:39, Philippe Mouawad < > philippe.moua...@gmail.com> > >>> >> wrote: > >>> >> > On Mon, Oct 3, 2011 at 4:31 PM, sebb <seb...@gmail.com> wrote: > >>> >> > > >>> >> >> On 3 October 2011 14:04, Philippe Mouawad < > >>> philippe.moua...@gmail.com> > >>> >> >> wrote: > >>> >> >> > You are right, > >>> >> >> > Patch was just about quick fix before the more impacting fix. > >>> >> >> > > >>> >> >> > Here are my propositions regarding this more impacting fix: > >>> >> >> > > >>> >> >> > - Add an option to make conc download use or not cookie, > default > >>> >> value > >>> >> >> > will be false. > >>> >> >> > - In AsyncSampler make a Clone with current cookies of Parent > >>> >> >> > CookieManager (the one that is calling Executor) and store it > in > >>> >> >> ThreadLocal > >>> >> >> > - Change HttpSamplerBase#getCookieManager to retrieve first > in > >>> >> Thread > >>> >> >> > Local then in instance > >>> >> >> > - If option is true, when reading res in > Future<HTTPSampleResult> > >>> >> loop, > >>> >> >> > reinject cookies inside ParentCookie otherwise ignore them > >>> >> >> > >>> >> >> As I wrote earlier, I'm not sure it ever makes sense to handle > >>> cookies > >>> >> >> from embedded resources, so it would be simpler just to ignore > them. > >>> >> >> > >>> >> >> I am not sure Frame couldn't be concerned by this case, so in my > >>> opinion > >>> >> it > >>> >> > should be a parameter not ignored by default. > >>> >> > >>> >> I'd overlooked frame. > >>> >> > >>> >> > > >>> >> >> I'm looking at passing the current sampler to the AsyncSampler > class, > >>> >> >> which can then clone it. > >>> >> >> I think that will create an independent set of cookies, so there > can > >>> >> >> be no need to protect against concurrent updates. > >>> >> >> > >>> >> > Agree, that's how I imagined it, but then you agree you have to > store > >>> >> > CookieManager in thread local ? > >>> >> > >>> >> If cookies are being ignored, then the cookie manager property can > >>> >> just be cleared - i.e. there is no cookie manager. > >>> >> > >>> >> Alternatively, it will also need to be cloned. > >>> >> > >>> >> >> > >>> >> >> We then need to consider if non-concurrent downloads should still > be > >>> >> >> processed for cookies. > >>> >> >> > >>> >> >> > >>> >> > Conc and serial should have the same behaviour > >>> >> > >>> >> > > >>> >> > PS : Does it mean that you are working on issue and will fix it on > >>> your > >>> >> side > >>> >> > >>> >> Not yet decided; we need to agree on the approach first. > >>> >> > >>> >> > > >>> >> >> > >>> >> >> > Regards > >>> >> >> > Philippe > >>> >> >> > > >>> >> >> > On Mon, Oct 3, 2011 at 2:29 PM, sebb <seb...@gmail.com> wrote: > >>> >> >> > > >>> >> >> >> On 3 October 2011 13:14, Philippe Mouawad < > >>> >> philippe.moua...@gmail.com> > >>> >> >> >> wrote: > >>> >> >> >> > Sebb, > >>> >> >> >> > Do you want me to provide a patch with ConcurrentHashMap > where I > >>> >> will > >>> >> >> >> have > >>> >> >> >> > to handle null keys and values (not same behaviour as > HashMap) > >>> or > >>> >> we > >>> >> >> >> forget > >>> >> >> >> > about this approach ? > >>> >> >> >> > >>> >> >> >> I don't think we have yet decided how best to handle > concurrent > >>> >> >> downloads. > >>> >> >> >> > >>> >> >> >> e.g. should they even be setting cookies? > >>> >> >> >> > >>> >> >> >> > Regards > >>> >> >> >> > Philippe > >>> >> >> >> > > >>> >> >> >> > On Mon, Oct 3, 2011 at 1:58 PM, Philippe Mouawad < > >>> >> >> >> philippe.moua...@gmail.com > >>> >> >> >> >> wrote: > >>> >> >> >> > > >>> >> >> >> >> Hello, > >>> >> >> >> >> Just a little update on my test. > >>> >> >> >> >> I added a clear and gc before each Map instanciation and > >>> results > >>> >> are > >>> >> >> >> >> different: > >>> >> >> >> >> > >>> >> >> >> >> - HashMapput:645 > >>> >> >> >> >> - ConcurrentHashMapput:832 > >>> >> >> >> >> - ConcurrentReaderHashMapput:620 > >>> >> >> >> >> - HashMap get:17 > >>> >> >> >> >> - ConcurrentHashMap get:32 > >>> >> >> >> >> - ConcurrentReaderHashMap get:60 > >>> >> >> >> >> > >>> >> >> >> >> > >>> >> >> >> >> So it kind of closes the debate, sorry for disturbance. > >>> >> >> >> >> Regards > >>> >> >> >> >> Philippe > >>> >> >> >> >> > >>> >> >> >> >> > >>> >> >> >> >> > >>> >> >> >> >> > >>> >> >> >> >> public class TestMap { > >>> >> >> >> >> > >>> >> >> >> >> public static void main(String[] args) { > >>> >> >> >> >> StopWatch timer = new StopWatch(); > >>> >> >> >> >> > >>> >> >> >> >> Map map = new HashMap(); > >>> >> >> >> >> testPut(timer, map, "HashMap"); > >>> >> >> >> >> timer.reset(); > >>> >> >> >> >> > >>> >> >> >> >> map.clear(); > >>> >> >> >> >> System.gc(); > >>> >> >> >> >> > >>> >> >> >> >> map = new ConcurrentHashMap(); > >>> >> >> >> >> testPut(timer, map, "ConcurrentHashMap"); > >>> >> >> >> >> timer.reset(); > >>> >> >> >> >> > >>> >> >> >> >> map.clear(); > >>> >> >> >> >> System.gc(); > >>> >> >> >> >> > >>> >> >> >> >> map = new ConcurrentReaderHashMap(); > >>> >> >> >> >> testPut(timer, map, "ConcurrentReaderHashMap"); > >>> >> >> >> >> timer.reset(); > >>> >> >> >> >> > >>> >> >> >> >> > >>> >> >> >> >> map.clear(); > >>> >> >> >> >> System.gc(); > >>> >> >> >> >> > >>> >> >> >> >> map = new HashMap(); > >>> >> >> >> >> testGet(timer, map, "HashMap"); > >>> >> >> >> >> timer.reset(); > >>> >> >> >> >> > >>> >> >> >> >> map.clear(); > >>> >> >> >> >> System.gc(); > >>> >> >> >> >> > >>> >> >> >> >> map = new ConcurrentHashMap(); > >>> >> >> >> >> testGet(timer, map, "ConcurrentHashMap"); > >>> >> >> >> >> timer.reset(); > >>> >> >> >> >> > >>> >> >> >> >> map.clear(); > >>> >> >> >> >> System.gc(); > >>> >> >> >> >> > >>> >> >> >> >> map = new ConcurrentReaderHashMap(); > >>> >> >> >> >> testGet(timer, map, "ConcurrentReaderHashMap"); > >>> >> >> >> >> timer.reset(); > >>> >> >> >> >> } > >>> >> >> >> >> > >>> >> >> >> >> /** > >>> >> >> >> >> * @param timer > >>> >> >> >> >> */ > >>> >> >> >> >> private static void testGet(StopWatch timer, Map map, > >>> String > >>> >> >> type) { > >>> >> >> >> >> timer.start(); > >>> >> >> >> >> for (int i = 0; i < 1000000; i++) { > >>> >> >> >> >> map.get(i); > >>> >> >> >> >> } > >>> >> >> >> >> timer.stop(); > >>> >> >> >> >> System.out.println(type+" get:"+timer.getTime()); > >>> >> >> >> >> } > >>> >> >> >> >> > >>> >> >> >> >> /** > >>> >> >> >> >> * @param timer > >>> >> >> >> >> */ > >>> >> >> >> >> private static void testPut(StopWatch timer, Map map, > >>> String > >>> >> >> type) { > >>> >> >> >> >> timer.start(); > >>> >> >> >> >> for (int i = 0; i < 1000000; i++) { > >>> >> >> >> >> map.put(i,i); > >>> >> >> >> >> } > >>> >> >> >> >> timer.stop(); > >>> >> >> >> >> System.out.println(type+"put:"+timer.getTime()); > >>> >> >> >> >> } > >>> >> >> >> >> > >>> >> >> >> >> > >>> >> >> >> >> Regards > >>> >> >> >> >> Philippe > >>> >> >> >> >> > >>> >> >> >> >> > >>> >> >> >> >> On Mon, Oct 3, 2011 at 1:37 PM, sebb <seb...@gmail.com> > wrote: > >>> >> >> >> >> > >>> >> >> >> >>> On 3 October 2011 12:15, Rainer Jung < > rainer.j...@kippdata.de > >>> > > >>> >> >> wrote: > >>> >> >> >> >>> > On 02.10.2011 23:17, Philippe Mouawad wrote: > >>> >> >> >> >>> >> Ok, hope we can do the same. > >>> >> >> >> >>> > > >>> >> >> >> >>> > See https://issues.apache.org/jira/browse/XMLBEANS-447 > >>> >> >> >> >>> > > >>> >> >> >> >>> > We are not the only people, who doubt it's correct to > >>> include > >>> >> that > >>> >> >> >> class > >>> >> >> >> >>> ... > >>> >> >> >> >>> > > >>> >> >> >> >>> > There was also a discussion some time ago in another ASF > >>> >> project, > >>> >> >> >> >>> > because the Sun license which is cited by Doug Lea has a > "no > >>> >> use > >>> >> >> in > >>> >> >> >> >>> > nuclear facilities clause", which make it non-usable as > an > >>> Open > >>> >> >> >> Source > >>> >> >> >> >>> > license. > >>> >> >> >> >>> > > >>> >> >> >> >>> > It looks like we are stuck here. > >>> >> >> >> >>> > >>> >> >> >> >>> Yes, apart from the binary option which brings in lots of > >>> >> unneeded > >>> >> >> >> code. > >>> >> >> >> >>> > >>> >> >> >> >>> > And the mentioning of the Harmony class in the above > cited > >>> >> issue > >>> >> >> is a > >>> >> >> >> >>> > red herring. Diffing it with the JDK 5 standard > >>> >> ConcurrentHashMap > >>> >> >> >> shows > >>> >> >> >> >>> > little difference, so I doubt it will be much faster > (though > >>> I > >>> >> >> didn't > >>> >> >> >> >>> > inspect the delta in detail). > >>> >> >> >> >>> > >>> >> >> >> >>> I think the Harmony class was only mentioned as a means of > >>> >> >> supporting > >>> >> >> >> >>> Java 1.4, not as an alternative faster implementation. > >>> >> >> >> >>> > >>> >> >> >> >>> >> I must say I don't understand why > ConcurrentReaderHashMap > >>> is > >>> >> not > >>> >> >> in > >>> >> >> >> >>> JDK. > >>> >> >> >> >>> > > >>> >> >> >> >>> > There's a discussion list for JSR166 (the concurrency > stuff > >>> >> lead > >>> >> >> by > >>> >> >> >> Doug > >>> >> >> >> >>> > Lea) mentioned on the JSR 166 page maintained by Doug > Lea. > >>> So > >>> >> >> maybe > >>> >> >> >> you > >>> >> >> >> >>> > can post a technical question there (what's the right > class > >>> >> that > >>> >> >> >> solve > >>> >> >> >> >>> > the following problem ... and doesn't have sun licensing > >>> >> >> >> restrictions). > >>> >> >> >> >>> > > >>> >> >> >> >>> > Regards, > >>> >> >> >> >>> > > >>> >> >> >> >>> > Rainer > >>> >> >> >> >>> > > >>> >> >> >> >>> > > >>> >> >> >> >>> > > >>> >> >> > --------------------------------------------------------------------- > >>> >> >> >> >>> > To unsubscribe, e-mail: > dev-unsubscr...@jakarta.apache.org > >>> >> >> >> >>> > For additional commands, e-mail: > >>> dev-h...@jakarta.apache.org > >>> >> >> >> >>> > > >>> >> >> >> >>> > > >>> >> >> >> >>> > >>> >> >> >> >>> > >>> >> >> > --------------------------------------------------------------------- > >>> >> >> >> >>> To unsubscribe, e-mail: > dev-unsubscr...@jakarta.apache.org > >>> >> >> >> >>> For additional commands, e-mail: > dev-h...@jakarta.apache.org > >>> >> >> >> >>> > >>> >> >> >> >>> > >>> >> >> >> >> > >>> >> >> >> >> > >>> >> >> >> >> -- > >>> >> >> >> >> Cordialement. > >>> >> >> >> >> Philippe Mouawad. > >>> >> >> >> >> > >>> >> >> >> >> > >>> >> >> >> >> > >>> >> >> >> >> > >>> >> >> >> > > >>> >> >> >> > > >>> >> >> >> > -- > >>> >> >> >> > Cordialement. > >>> >> >> >> > Philippe Mouawad. > >>> >> >> >> > > >>> >> >> >> > >>> >> >> >> > >>> --------------------------------------------------------------------- > >>> >> >> >> To unsubscribe, e-mail: dev-unsubscr...@jakarta.apache.org > >>> >> >> >> For additional commands, e-mail: dev-h...@jakarta.apache.org > >>> >> >> >> > >>> >> >> >> > >>> >> >> > > >>> >> >> > > >>> >> >> > -- > >>> >> >> > Cordialement. > >>> >> >> > Philippe Mouawad. > >>> >> >> > > >>> >> >> > >>> >> >> > --------------------------------------------------------------------- > >>> >> >> To unsubscribe, e-mail: dev-unsubscr...@jakarta.apache.org > >>> >> >> For additional commands, e-mail: dev-h...@jakarta.apache.org > >>> >> >> > >>> >> >> > >>> >> > > >>> >> > > >>> >> > -- > >>> >> > Cordialement. > >>> >> > Philippe Mouawad. > >>> >> > > >>> >> > >>> >> > --------------------------------------------------------------------- > >>> >> To unsubscribe, e-mail: dev-unsubscr...@jakarta.apache.org > >>> >> For additional commands, e-mail: dev-h...@jakarta.apache.org > >>> >> > >>> >> > >>> > > >>> > > >>> > -- > >>> > Cordialement. > >>> > Philippe Mouawad. > >>> > > >>> > >>> --------------------------------------------------------------------- > >>> To unsubscribe, e-mail: dev-unsubscr...@jakarta.apache.org > >>> For additional commands, e-mail: dev-h...@jakarta.apache.org > >>> > >>> > >> > >> > >> -- > >> Cordialement. > >> Philippe Mouawad. > >> > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscr...@jakarta.apache.org > For additional commands, e-mail: dev-h...@jakarta.apache.org > > -- Cordialement. Philippe Mouawad.