Skip to content

Commit 21bc4f7

Browse files
author
freynaud
committed
Fix #6773 consuming the request in all cases to properly release resources
1 parent 04b1676 commit 21bc4f7

File tree

2 files changed

+63
-46
lines changed

2 files changed

+63
-46
lines changed

java/server/src/org/openqa/grid/internal/BaseRemoteProxy.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import static org.openqa.grid.common.RegistrationRequest.REMOTE_HOST;
2323
import static org.openqa.grid.common.RegistrationRequest.SELENIUM_PROTOCOL;
2424

25+
import org.apache.http.HttpEntity;
2526
import org.apache.http.HttpHost;
2627
import org.apache.http.HttpResponse;
2728
import org.apache.http.client.HttpClient;
@@ -501,10 +502,11 @@ public JSONObject getStatus() throws GridException {
501502
HttpHost host = new HttpHost(getRemoteHost().getHost(), getRemoteHost().getPort());
502503
HttpResponse response;
503504
String existingName = Thread.currentThread().getName();
504-
505+
HttpEntity entity = null;
505506
try {
506507
Thread.currentThread().setName("Probing status of " + url);
507508
response = client.execute(host, r);
509+
entity = response.getEntity();
508510
int code = response.getStatusLine().getStatusCode();
509511

510512
if (code == 200) {
@@ -529,6 +531,12 @@ public JSONObject getStatus() throws GridException {
529531
throw new GridException(e.getMessage(), e);
530532
} finally {
531533
Thread.currentThread().setName(existingName);
534+
try { //Added by jojo to release connection thoroughly
535+
EntityUtils.consume(entity);
536+
} catch (IOException e) {
537+
log.info("Exception thrown when consume entity");
538+
}
539+
532540
}
533541
}
534542

java/server/src/org/openqa/grid/internal/TestSession.java

Lines changed: 54 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -226,58 +226,60 @@ public String forward(SeleniumBasedRequest request, HttpServletResponse response
226226

227227
HttpResponse proxyResponse = sendRequestToNode(proxyRequest);
228228
lastActivity = timeSource.currentTimeInMillis();
229-
230-
final int statusCode = proxyResponse.getStatusLine().getStatusCode();
231-
response.setStatus(statusCode);
232-
processResponseHeaders(request, response, slot.getRemoteURL(), proxyResponse);
233-
234-
byte[] consumedNewWebDriverSessionBody = null;
235-
if (statusCode != HttpServletResponse.SC_INTERNAL_SERVER_ERROR &&
236-
statusCode != HttpServletResponse.SC_NOT_FOUND) {
237-
consumedNewWebDriverSessionBody = updateHubIfNewWebDriverSession(request, proxyResponse);
238-
}
239-
if (newSessionRequest && statusCode == HttpServletResponse.SC_INTERNAL_SERVER_ERROR) {
240-
removeIncompleteNewSessionRequest();
241-
}
242-
if (statusCode == HttpServletResponse.SC_NOT_FOUND) {
243-
removeSessionBrowserTimeout();
244-
}
245-
246229
HttpEntity responseBody = proxyResponse.getEntity();
247-
byte[] contentBeingForwarded = null;
248-
if (responseBody != null) {
249-
try {
250-
InputStream in;
251-
if (consumedNewWebDriverSessionBody == null) {
252-
in = responseBody.getContent();
253-
if (request.getRequestType() == RequestType.START_SESSION
254-
&& request instanceof LegacySeleniumRequest) {
255-
res = getResponseUtf8Content(in);
256-
257-
updateHubNewSeleniumSession(res);
230+
try {
231+
final int statusCode = proxyResponse.getStatusLine().getStatusCode();
232+
response.setStatus(statusCode);
233+
processResponseHeaders(request, response, slot.getRemoteURL(), proxyResponse);
234+
235+
byte[] consumedNewWebDriverSessionBody = null;
236+
if (statusCode != HttpServletResponse.SC_INTERNAL_SERVER_ERROR &&
237+
statusCode != HttpServletResponse.SC_NOT_FOUND) {
238+
consumedNewWebDriverSessionBody = updateHubIfNewWebDriverSession(request, proxyResponse);
239+
}
240+
if (newSessionRequest && statusCode == HttpServletResponse.SC_INTERNAL_SERVER_ERROR) {
241+
removeIncompleteNewSessionRequest();
242+
}
243+
if (statusCode == HttpServletResponse.SC_NOT_FOUND) {
244+
removeSessionBrowserTimeout();
245+
}
258246

259-
in = new ByteArrayInputStream(res.getBytes("UTF-8"));
247+
byte[] contentBeingForwarded = null;
248+
if (responseBody != null) {
249+
try {
250+
InputStream in;
251+
if (consumedNewWebDriverSessionBody == null) {
252+
in = responseBody.getContent();
253+
if (request.getRequestType() == RequestType.START_SESSION
254+
&& request instanceof LegacySeleniumRequest) {
255+
res = getResponseUtf8Content(in);
256+
257+
updateHubNewSeleniumSession(res);
258+
259+
in = new ByteArrayInputStream(res.getBytes("UTF-8"));
260+
}
261+
} else {
262+
in = new ByteArrayInputStream(consumedNewWebDriverSessionBody);
260263
}
261-
} else {
262-
in = new ByteArrayInputStream(consumedNewWebDriverSessionBody);
263-
}
264264

265-
final byte[] bytes = drainInputStream(in);
266-
writeRawBody(response, bytes);
265+
final byte[] bytes = drainInputStream(in);
266+
writeRawBody(response, bytes);
267267

268-
contentBeingForwarded = bytes;
269-
} finally {
270-
EntityUtils.consume(responseBody);
271-
}
268+
} finally {
269+
EntityUtils.consume(responseBody);
270+
}
272271

273-
}
272+
}
274273

275-
if (slot.getProxy() instanceof CommandListener) {
276-
SeleniumBasedResponse wrappedResponse = new SeleniumBasedResponse(response);
277-
wrappedResponse.setForwardedContent(contentBeingForwarded);
278-
((CommandListener) slot.getProxy()).afterCommand(this, request, wrappedResponse);
274+
if (slot.getProxy() instanceof CommandListener) {
275+
SeleniumBasedResponse wrappedResponse = new SeleniumBasedResponse(response);
276+
wrappedResponse.setForwardedContent(contentBeingForwarded);
277+
((CommandListener) slot.getProxy()).afterCommand(this, request, wrappedResponse);
278+
}
279+
response.flushBuffer();
280+
} finally {
281+
EntityUtils.consume(responseBody);
279282
}
280-
281283
response.flushBuffer();
282284

283285
return res;
@@ -547,17 +549,24 @@ public boolean sendDeleteSessionRequest() {
547549
}
548550

549551
HttpHost host = new HttpHost(remoteURL.getHost(), remoteURL.getPort());
550-
552+
HttpEntity responseBody = null;
551553
boolean ok;
552554
try {
553555
HttpClient client = getClient();
554556
HttpResponse response = client.execute(host, request);
557+
responseBody = response.getEntity();
555558
int code = response.getStatusLine().getStatusCode();
556559
ok = (code >= 200) && (code <= 299);
557560
} catch (Throwable e) {
558561
ok = false;
559562
// corrupted or the something else already sent the DELETE.
560563
log.severe("Error releasing. Server corrupted ?");
564+
}finally{
565+
try {
566+
EntityUtils.consume(responseBody);
567+
} catch (IOException e) {
568+
log.warning("Consuming the response body when DELETE to the node" + e.getMessage());
569+
}
561570
}
562571
return ok;
563572
}

0 commit comments

Comments
 (0)