HADOOP-17371. Bump Jetty to the latest version 9.4.34. Contributed by Wei-Chiu Chuang. (#2453)
This commit is contained in:
parent
2825d060cf
commit
66ee0a6df0
@ -840,6 +840,18 @@
|
||||
<exclude>*/**</exclude>
|
||||
</excludes>
|
||||
</filter>
|
||||
<filter>
|
||||
<artifact>org.eclipse.jetty:jetty-util-ajax</artifact>
|
||||
<excludes>
|
||||
<exclude>*/**</exclude>
|
||||
</excludes>
|
||||
</filter>
|
||||
<filter>
|
||||
<artifact>org.eclipse.jetty:jetty-server</artifact>
|
||||
<excludes>
|
||||
<exclude>jetty-dir.css</exclude>
|
||||
</excludes>
|
||||
</filter>
|
||||
</filters>
|
||||
|
||||
<!-- relocate classes from mssql-jdbc -->
|
||||
|
@ -193,6 +193,10 @@
|
||||
<artifactId>guava</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-server</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
@ -19,6 +19,7 @@
|
||||
import org.apache.hadoop.security.authentication.client.AuthenticationException;
|
||||
import org.apache.hadoop.security.authentication.client.KerberosAuthenticator;
|
||||
import org.apache.hadoop.security.authentication.util.*;
|
||||
import org.eclipse.jetty.server.Response;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
@ -619,11 +620,20 @@ && getMaxInactiveInterval() > 0) {
|
||||
KerberosAuthenticator.WWW_AUTHENTICATE))) {
|
||||
errCode = HttpServletResponse.SC_FORBIDDEN;
|
||||
}
|
||||
// After Jetty 9.4.21, sendError() no longer allows a custom message.
|
||||
// use setStatusWithReason() to set a custom message.
|
||||
String reason;
|
||||
if (authenticationEx == null) {
|
||||
httpResponse.sendError(errCode, "Authentication required");
|
||||
reason = "Authentication required";
|
||||
} else {
|
||||
httpResponse.sendError(errCode, authenticationEx.getMessage());
|
||||
reason = authenticationEx.getMessage();
|
||||
}
|
||||
|
||||
if (httpResponse instanceof Response) {
|
||||
((Response)httpResponse).setStatusWithReason(errCode, reason);
|
||||
}
|
||||
|
||||
httpResponse.sendError(errCode, reason);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -37,6 +37,7 @@
|
||||
import org.apache.hadoop.classification.InterfaceStability;
|
||||
import org.apache.hadoop.conf.Configuration;
|
||||
|
||||
import org.eclipse.jetty.server.Response;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
@ -271,6 +272,10 @@ public void proceed() throws IOException, ServletException {
|
||||
|
||||
@Override
|
||||
public void sendError(int code, String message) throws IOException {
|
||||
if (httpResponse instanceof Response) {
|
||||
((Response)httpResponse).setStatusWithReason(code, message);
|
||||
}
|
||||
|
||||
httpResponse.sendError(code, message);
|
||||
}
|
||||
}
|
||||
|
@ -28,6 +28,7 @@
|
||||
import org.apache.hadoop.security.token.delegation.web.DelegationTokenAuthenticationHandler;
|
||||
import org.apache.hadoop.security.token.delegation.web.KerberosDelegationTokenAuthenticationHandler;
|
||||
import org.apache.hadoop.security.token.delegation.web.PseudoDelegationTokenAuthenticationHandler;
|
||||
import org.eclipse.jetty.server.Response;
|
||||
|
||||
import javax.servlet.FilterChain;
|
||||
import javax.servlet.FilterConfig;
|
||||
@ -113,6 +114,18 @@ public void setStatus(int sc) {
|
||||
public void sendError(int sc, String msg) throws IOException {
|
||||
statusCode = sc;
|
||||
this.msg = msg;
|
||||
|
||||
ServletResponse response = getResponse();
|
||||
|
||||
// After Jetty 9.4.21, sendError() no longer allows a custom message.
|
||||
// use setStatusWithReason() to set a custom message.
|
||||
if (response instanceof Response) {
|
||||
((Response) response).setStatusWithReason(sc, msg);
|
||||
} else {
|
||||
KMS.LOG.warn("The wrapped response object is instance of {}" +
|
||||
", not org.eclipse.jetty.server.Response. Can't set custom error " +
|
||||
"message", response.getClass());
|
||||
}
|
||||
super.sendError(sc, HtmlQuoting.quoteHtmlChars(msg));
|
||||
}
|
||||
|
||||
|
@ -42,6 +42,7 @@
|
||||
import org.apache.hadoop.hdfs.DFSConfigKeys;
|
||||
import org.apache.hadoop.hdfs.DFSUtilClient;
|
||||
import org.apache.hadoop.security.SecurityUtil;
|
||||
import org.eclipse.jetty.server.Response;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.apache.hadoop.classification.InterfaceAudience;
|
||||
@ -119,7 +120,7 @@ private FSImage getAndValidateFSImage(ServletContext context,
|
||||
if (nnImage == null) {
|
||||
String errorMsg = "NameNode initialization not yet complete. "
|
||||
+ "FSImage has not been set in the NameNode.";
|
||||
response.sendError(HttpServletResponse.SC_FORBIDDEN, errorMsg);
|
||||
sendError(response, HttpServletResponse.SC_FORBIDDEN, errorMsg);
|
||||
throw new IOException(errorMsg);
|
||||
}
|
||||
return nnImage;
|
||||
@ -218,7 +219,7 @@ private void serveFile(File file) throws IOException {
|
||||
|
||||
} catch (Throwable t) {
|
||||
String errMsg = "GetImage failed. " + StringUtils.stringifyException(t);
|
||||
response.sendError(HttpServletResponse.SC_GONE, errMsg);
|
||||
sendError(response, HttpServletResponse.SC_GONE, errMsg);
|
||||
throw new IOException(errMsg);
|
||||
} finally {
|
||||
response.getOutputStream().close();
|
||||
@ -234,7 +235,7 @@ private void validateRequest(ServletContext context, Configuration conf,
|
||||
conf)) {
|
||||
String errorMsg = "Only Namenode, Secondary Namenode, and administrators may access "
|
||||
+ "this servlet";
|
||||
response.sendError(HttpServletResponse.SC_FORBIDDEN, errorMsg);
|
||||
sendError(response, HttpServletResponse.SC_FORBIDDEN, errorMsg);
|
||||
LOG.warn("Received non-NN/SNN/administrator request for image or edits from "
|
||||
+ request.getUserPrincipal().getName()
|
||||
+ " at "
|
||||
@ -247,7 +248,7 @@ private void validateRequest(ServletContext context, Configuration conf,
|
||||
&& !myStorageInfoString.equals(theirStorageInfoString)) {
|
||||
String errorMsg = "This namenode has storage info " + myStorageInfoString
|
||||
+ " but the secondary expected " + theirStorageInfoString;
|
||||
response.sendError(HttpServletResponse.SC_FORBIDDEN, errorMsg);
|
||||
sendError(response, HttpServletResponse.SC_FORBIDDEN, errorMsg);
|
||||
LOG.warn("Received an invalid request file transfer request "
|
||||
+ "from a secondary with storage info " + theirStorageInfoString);
|
||||
throw new IOException(errorMsg);
|
||||
@ -578,7 +579,7 @@ public Void run() throws Exception {
|
||||
// we need a different response type here so the client can differentiate this
|
||||
// from the failure to upload due to (1) security, or (2) other checkpoints already
|
||||
// present
|
||||
response.sendError(HttpServletResponse.SC_EXPECTATION_FAILED,
|
||||
sendError(response, HttpServletResponse.SC_EXPECTATION_FAILED,
|
||||
"Nameode "+request.getLocalAddr()+" is currently not in a state which can "
|
||||
+ "accept uploads of new fsimages. State: "+state);
|
||||
return null;
|
||||
@ -593,7 +594,7 @@ public Void run() throws Exception {
|
||||
// if the node is attempting to upload an older transaction, we ignore it
|
||||
SortedSet<ImageUploadRequest> larger = currentlyDownloadingCheckpoints.tailSet(imageRequest);
|
||||
if (larger.size() > 0) {
|
||||
response.sendError(HttpServletResponse.SC_CONFLICT,
|
||||
sendError(response, HttpServletResponse.SC_CONFLICT,
|
||||
"Another checkpointer is already in the process of uploading a" +
|
||||
" checkpoint made up to transaction ID " + larger.last());
|
||||
return null;
|
||||
@ -601,7 +602,7 @@ public Void run() throws Exception {
|
||||
|
||||
//make sure no one else has started uploading one
|
||||
if (!currentlyDownloadingCheckpoints.add(imageRequest)) {
|
||||
response.sendError(HttpServletResponse.SC_CONFLICT,
|
||||
sendError(response, HttpServletResponse.SC_CONFLICT,
|
||||
"Either current namenode is checkpointing or another"
|
||||
+ " checkpointer is already in the process of "
|
||||
+ "uploading a checkpoint made at transaction ID "
|
||||
@ -648,7 +649,7 @@ public Void run() throws Exception {
|
||||
(txid - lastCheckpointTxid) + " expecting at least "
|
||||
+ checkpointTxnCount;
|
||||
LOG.info(message);
|
||||
response.sendError(HttpServletResponse.SC_CONFLICT, message);
|
||||
sendError(response, HttpServletResponse.SC_CONFLICT, message);
|
||||
return null;
|
||||
}
|
||||
|
||||
@ -658,7 +659,7 @@ public Void run() throws Exception {
|
||||
+ "another checkpointer already uploaded an "
|
||||
+ "checkpoint for txid " + txid;
|
||||
LOG.info(message);
|
||||
response.sendError(HttpServletResponse.SC_CONFLICT, message);
|
||||
sendError(response, HttpServletResponse.SC_CONFLICT, message);
|
||||
return null;
|
||||
}
|
||||
|
||||
@ -695,11 +696,20 @@ public Void run() throws Exception {
|
||||
});
|
||||
} catch (Throwable t) {
|
||||
String errMsg = "PutImage failed. " + StringUtils.stringifyException(t);
|
||||
response.sendError(HttpServletResponse.SC_GONE, errMsg);
|
||||
sendError(response, HttpServletResponse.SC_GONE, errMsg);
|
||||
throw new IOException(errMsg);
|
||||
}
|
||||
}
|
||||
|
||||
private void sendError(HttpServletResponse response, int code, String message)
|
||||
throws IOException {
|
||||
if (response instanceof Response) {
|
||||
((Response)response).setStatusWithReason(code, message);
|
||||
}
|
||||
|
||||
response.sendError(code, message);
|
||||
}
|
||||
|
||||
/*
|
||||
* Params required to handle put image request
|
||||
*/
|
||||
|
@ -37,7 +37,7 @@
|
||||
<!--Whether to proceed to next module if any test failures exist-->
|
||||
<ignoreTestFailure>true</ignoreTestFailure>
|
||||
<maven.test.redirectTestOutputToFile>true</maven.test.redirectTestOutputToFile>
|
||||
<jetty.version>9.4.20.v20190813</jetty.version>
|
||||
<jetty.version>9.4.35.v20201120</jetty.version>
|
||||
<test.exclude>_</test.exclude>
|
||||
<test.exclude.pattern>_</test.exclude.pattern>
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user