ASF Bugzilla – Attachment 35742 Details for
Bug 58807
Reset SSL State on Thread Group iteration only (was https.use.cached.ssl.context=false is broken)
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Amended Patch
BUG_58807.patch (text/plain), 11.00 KB, created by
Philippe Mouawad
on 2018-02-24 21:46:31 UTC
(
hide
)
Description:
Amended Patch
Filename:
MIME Type:
Creator:
Philippe Mouawad
Created:
2018-02-24 21:46:31 UTC
Size:
11.00 KB
patch
obsolete
>Index: src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC4Impl.java >=================================================================== >--- src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC4Impl.java (revision 1825273) >+++ src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC4Impl.java (working copy) >@@ -483,8 +483,6 @@ > > private volatile HttpUriRequest currentRequest; // Accessed from multiple threads > >- private volatile boolean resetSSLContext; >- > protected HTTPHC4Impl(HTTPSamplerBase testElement) { > super(testElement); > } >@@ -539,6 +537,7 @@ > log.debug("Start : sample {} method {} followingRedirect {} depth {}", > url, method, areFollowingRedirect, frameDepth); > } >+ JMeterVariables jMeterVariables = JMeterContextService.getContext().getVariables(); > > HTTPSampleResult res = createSampleResult(url, method); > >@@ -549,7 +548,7 @@ > clientContext.setAttribute(CONTEXT_ATTRIBUTE_AUTH_MANAGER, getAuthManager()); > > try { >- httpClient = setupClient(url, clientContext); >+ httpClient = setupClient(jMeterVariables, url, clientContext); > URI uri = url.toURI(); > if (method.equals(HTTPConstants.POST)) { > httpRequest = new HttpPost(uri); >@@ -589,7 +588,7 @@ > return res; > } > >- setupClientContextBeforeSample(localContext); >+ setupClientContextBeforeSample(jMeterVariables, localContext); > > res.sampleStart(); > >@@ -609,7 +608,7 @@ > > // Needs to be done after execute to pick up all the headers > final HttpRequest request = (HttpRequest) localContext.getAttribute(HttpCoreContext.HTTP_REQUEST); >- extractClientContextAfterSample(localContext); >+ extractClientContextAfterSample(jMeterVariables, localContext); > // We've finished with the request, so we can add the LocalAddress to it for display > if (localAddress != null) { > request.addHeader(HEADER_LOCAL_ADDRESS, localAddress.toString()); >@@ -718,14 +717,14 @@ > /** > * Store in JMeter Variables the UserToken so that the SSL context is reused > * See <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=57804">Bug 57804</a> >+ * @param jMeterVariables {@link JMeterVariables} > * @param localContext {@link HttpContext} > */ >- private void extractClientContextAfterSample(HttpContext localContext) { >+ private void extractClientContextAfterSample(JMeterVariables jMeterVariables, HttpContext localContext) { > Object userToken = localContext.getAttribute(HttpClientContext.USER_TOKEN); > if(userToken != null) { > log.debug("Extracted from HttpContext user token:{} storing it as JMeter variable:{}", userToken, JMETER_VARIABLE_USER_TOKEN); > // During recording JMeterContextService.getContext().getVariables() is null >- JMeterVariables jMeterVariables = JMeterContextService.getContext().getVariables(); > if (jMeterVariables != null) { > jMeterVariables.putObject(JMETER_VARIABLE_USER_TOKEN, userToken); > } >@@ -735,12 +734,12 @@ > /** > * Configure the UserToken so that the SSL context is reused > * See <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=57804">Bug 57804</a> >+ * @param jMeterVariables {@link JMeterVariables} > * @param localContext {@link HttpContext} > */ >- private void setupClientContextBeforeSample(HttpContext localContext) { >+ private void setupClientContextBeforeSample(JMeterVariables jMeterVariables, HttpContext localContext) { > Object userToken = null; > // During recording JMeterContextService.getContext().getVariables() is null >- JMeterVariables jMeterVariables = JMeterContextService.getContext().getVariables(); > if(jMeterVariables != null) { > userToken = jMeterVariables.getObject(JMETER_VARIABLE_USER_TOKEN); > } >@@ -934,7 +933,7 @@ > } > } > >- private CloseableHttpClient setupClient(URL url, HttpClientContext clientContext) throws GeneralSecurityException { >+ private CloseableHttpClient setupClient(JMeterVariables jMeterVariables, URL url, HttpClientContext clientContext) throws GeneralSecurityException { > > Map<HttpClientKey, Pair<CloseableHttpClient, PoolingHttpClientConnectionManager>> mapHttpClientPerHttpClientKey = > HTTPCLIENTS_CACHE_PER_THREAD_AND_HTTPCLIENTKEY.get(); >@@ -972,7 +971,7 @@ > httpClient = pair != null ? pair.getLeft() : null; > } > >- resetSSLStateIfNeeded(url, clientContext, pair); >+ resetStateIfNeeded(jMeterVariables, clientContext, mapHttpClientPerHttpClientKey); > > if (httpClient == null) { // One-time init for this client > DnsResolver resolver = this.testElement.getDNSResolver(); >@@ -1080,21 +1079,36 @@ > * <li>Close current Idle or Expired connections that hold SSL State</li> > * <li>Remove HttpClientContext.USER_TOKEN from {@link HttpClientContext}</li> > * </ul> >- * @param url {@link URL} >+ * @param jMeterVariables {@link JMeterVariables} > * @param clientContext {@link HttpClientContext} >- * @param pair {@link Pair} holding {@link CloseableHttpClient} and {@link PoolingHttpClientConnectionManager} >+ * @param mapHttpClientPerHttpClientKey Map of {@link Pair} holding {@link CloseableHttpClient} and {@link PoolingHttpClientConnectionManager} > */ >- private void resetSSLStateIfNeeded(URL url, HttpClientContext clientContext, >- Pair<CloseableHttpClient, PoolingHttpClientConnectionManager> pair) { >- if (resetSSLContext && HTTPConstants.PROTOCOL_HTTPS.equalsIgnoreCase(url.getProtocol())) { >- if(pair != null) { >- PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = pair.getRight(); >- poolingHttpClientConnectionManager.closeExpiredConnections(); >- poolingHttpClientConnectionManager.closeIdleConnections(1L, TimeUnit.MICROSECONDS); >- } >+ private void resetStateIfNeeded(JMeterVariables jMeterVariables, >+ HttpClientContext clientContext, >+ Map<HttpClientKey, Pair<CloseableHttpClient, PoolingHttpClientConnectionManager>> mapHttpClientPerHttpClientKey) { >+ if (resetSSLContext.get()) { >+ closeCurrentConnections(mapHttpClientPerHttpClientKey); > clientContext.removeAttribute(HttpClientContext.USER_TOKEN); > ((JsseSSLManager) SSLManager.getInstance()).resetContext(); >- resetSSLContext = false; >+ resetSSLContext.set(false); >+ } >+ if (closeConnections.get()) { >+ closeCurrentConnections(mapHttpClientPerHttpClientKey); >+ clientContext.removeAttribute(HttpClientContext.USER_TOKEN); >+ closeConnections.set(false); >+ } >+ } >+ >+ /** >+ * @param mapHttpClientPerHttpClientKey >+ */ >+ private void closeCurrentConnections( >+ Map<HttpClientKey, Pair<CloseableHttpClient, PoolingHttpClientConnectionManager>> mapHttpClientPerHttpClientKey) { >+ for (Pair<CloseableHttpClient, PoolingHttpClientConnectionManager> pair : >+ mapHttpClientPerHttpClientKey.values()) { >+ PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = pair.getRight(); >+ poolingHttpClientConnectionManager.closeExpiredConnections(); >+ poolingHttpClientConnectionManager.closeIdleConnections(1L, TimeUnit.MICROSECONDS); > } > } > >@@ -1700,8 +1714,11 @@ > > @Override > protected void notifyFirstSampleAfterLoopRestart() { >- log.debug("notifyFirstSampleAfterLoopRestart"); >- resetSSLContext = !USE_CACHED_SSL_CONTEXT; >+ log.debug("notifyFirstSampleAfterLoopRestart called " >+ + "with config(reuse.http.connections={}, https.use.cached.ssl.context={})", >+ REUSE_HTTP_CONNECTIONS, USE_CACHED_SSL_CONTEXT); >+ closeConnections.set(!REUSE_HTTP_CONNECTIONS); >+ resetSSLContext.set(!USE_CACHED_SSL_CONTEXT); > } > > @Override >Index: src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHCAbstractImpl.java >=================================================================== >--- src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHCAbstractImpl.java (revision 1825265) >+++ src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHCAbstractImpl.java (working copy) >@@ -78,10 +78,28 @@ > // -1 means not defined > protected static final int SO_TIMEOUT = JMeterUtils.getPropDefault("httpclient.timeout", -1); > >+ // Control reuse of HTTP connections in subsequent iterations >+ protected static final boolean REUSE_HTTP_CONNECTIONS = >+ JMeterUtils.getPropDefault("reuse.http.connections", false);//$NON-NLS-1$ >+ > // Control reuse of cached SSL Context in subsequent iterations > protected static final boolean USE_CACHED_SSL_CONTEXT = > JMeterUtils.getPropDefault("https.use.cached.ssl.context", true);//$NON-NLS-1$ > >+ /** >+ * Whether SSL State/Context should be reset >+ * Shared state for any HC based implementation, because SSL contexts are the same >+ */ >+ protected static final ThreadLocal<Boolean> resetSSLContext = >+ ThreadLocal.withInitial(() -> Boolean.FALSE); >+ >+ /** >+ * Whether connections should be closed >+ * Shared state for any HC based implementation, >+ */ >+ protected static final ThreadLocal<Boolean> closeConnections = >+ ThreadLocal.withInitial(() -> Boolean.FALSE); >+ > static { > if(!StringUtils.isEmpty(JMeterUtils.getProperty("httpclient.timeout"))) { //$NON-NLS-1$ > log.warn("You're using property 'httpclient.timeout' that will soon be deprecated for HttpClient3.1, you should either set " >Index: src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerProxy.java >=================================================================== >--- src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerProxy.java (revision 1825265) >+++ src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerProxy.java (working copy) >@@ -36,8 +36,6 @@ > > private transient HTTPAbstractImpl impl; > >- private transient volatile boolean notifyFirstSampleAfterLoopRestart; >- > public HTTPSamplerProxy(){ > super(); > } >@@ -66,11 +64,6 @@ > return errorResult(ex, new HTTPSampleResult()); > } > } >- // see https://bz.apache.org/bugzilla/show_bug.cgi?id=51380 >- if(notifyFirstSampleAfterLoopRestart) { >- impl.notifyFirstSampleAfterLoopRestart(); >- notifyFirstSampleAfterLoopRestart = false; >- } > return impl.sample(u, method, areFollowingRedirect, depth); > } > >@@ -97,6 +90,8 @@ > */ > @Override > public void testIterationStart(LoopIterationEvent event) { >- notifyFirstSampleAfterLoopRestart = true; >+ if (impl != null) { >+ impl.notifyFirstSampleAfterLoopRestart(); >+ } > } > }
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 58807
:
33410
| 35742 |
35743
|
35744