Skip to content

Commit f350330

Browse files
authored
HADOOP-17651. Backport to branch-3.1 HADOOP-17371, HADOOP-17621, HADOOP-17625 to update Jetty to 9.4.39. (#2879) (#2935)
* HADOOP-17371. Bump Jetty to the latest version 9.4.34. Contributed by Wei-Chiu Chuang. (#2453) (cherry picked from commit 66ee0a6) (cherry picked from commit 6340ac8) Conflicts: hadoop-client-modules/hadoop-client-minicluster/pom.xml Change-Id: I673ac136922740cb1d426cb9593aa1bd3e9acd32 * HADOOP-17621. hadoop-auth to remove jetty-server dependency. (#2865) Reviewed-by: Akira Ajisaka <aajisaka@apache.org> (cherry picked from commit dac60b8) (cherry picked from commit 1110b03) * HADOOP-17625. Update to Jetty 9.4.39. (#2870) Reviewed-by: cxorm <lianp964@gmail.com> (cherry picked from commit 6040e86) (cherry picked from commit 7f75355) (cherry picked from commit 8ff61f9) Conflicts: hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/ImageServlet.java Change-Id: I465f6003b6f4c5df9c41c83eac3738bac56403e1
1 parent cd8ecd4 commit f350330

File tree

7 files changed

+60
-14
lines changed

7 files changed

+60
-14
lines changed

hadoop-client-modules/hadoop-client-minicluster/pom.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -782,6 +782,18 @@
782782
<exclude>*/**</exclude>
783783
</excludes>
784784
</filter>
785+
<filter>
786+
<artifact>org.eclipse.jetty:jetty-util-ajax</artifact>
787+
<excludes>
788+
<exclude>*/**</exclude>
789+
</excludes>
790+
</filter>
791+
<filter>
792+
<artifact>org.eclipse.jetty:jetty-server</artifact>
793+
<excludes>
794+
<exclude>jetty-dir.css</exclude>
795+
</excludes>
796+
</filter>
785797
</filters>
786798

787799
<!-- relocate classes from mssql-jdbc -->

hadoop-common-project/hadoop-auth/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@
188188
<artifactId>guava</artifactId>
189189
<scope>compile</scope>
190190
</dependency>
191-
</dependencies>
191+
</dependencies>
192192

193193
<build>
194194
<plugins>

hadoop-common-project/hadoop-auth/src/main/java/org/apache/hadoop/security/authentication/server/AuthenticationFilter.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -619,11 +619,17 @@ && getMaxInactiveInterval() > 0) {
619619
KerberosAuthenticator.WWW_AUTHENTICATE))) {
620620
errCode = HttpServletResponse.SC_FORBIDDEN;
621621
}
622+
// After Jetty 9.4.21, sendError() no longer allows a custom message.
623+
// use setStatus() to set a custom message.
624+
String reason;
622625
if (authenticationEx == null) {
623-
httpResponse.sendError(errCode, "Authentication required");
626+
reason = "Authentication required";
624627
} else {
625-
httpResponse.sendError(errCode, authenticationEx.getMessage());
628+
reason = authenticationEx.getMessage();
626629
}
630+
631+
httpResponse.setStatus(errCode, reason);
632+
httpResponse.sendError(errCode, reason);
627633
}
628634
}
629635
}

hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/http/RestCsrfPreventionFilter.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.apache.hadoop.classification.InterfaceStability;
3838
import org.apache.hadoop.conf.Configuration;
3939

40+
import org.eclipse.jetty.server.Response;
4041
import org.slf4j.Logger;
4142
import org.slf4j.LoggerFactory;
4243

@@ -271,6 +272,10 @@ public void proceed() throws IOException, ServletException {
271272

272273
@Override
273274
public void sendError(int code, String message) throws IOException {
275+
if (httpResponse instanceof Response) {
276+
((Response)httpResponse).setStatusWithReason(code, message);
277+
}
278+
274279
httpResponse.sendError(code, message);
275280
}
276281
}

hadoop-common-project/hadoop-kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMSAuthenticationFilter.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.apache.hadoop.security.token.delegation.web.DelegationTokenAuthenticationHandler;
2929
import org.apache.hadoop.security.token.delegation.web.KerberosDelegationTokenAuthenticationHandler;
3030
import org.apache.hadoop.security.token.delegation.web.PseudoDelegationTokenAuthenticationHandler;
31+
import org.eclipse.jetty.server.Response;
3132

3233
import javax.servlet.FilterChain;
3334
import javax.servlet.FilterConfig;
@@ -113,6 +114,18 @@ public void setStatus(int sc) {
113114
public void sendError(int sc, String msg) throws IOException {
114115
statusCode = sc;
115116
this.msg = msg;
117+
118+
ServletResponse response = getResponse();
119+
120+
// After Jetty 9.4.21, sendError() no longer allows a custom message.
121+
// use setStatusWithReason() to set a custom message.
122+
if (response instanceof Response) {
123+
((Response) response).setStatusWithReason(sc, msg);
124+
} else {
125+
KMS.LOG.warn("The wrapped response object is instance of {}" +
126+
", not org.eclipse.jetty.server.Response. Can't set custom error " +
127+
"message", response.getClass());
128+
}
116129
super.sendError(sc, HtmlQuoting.quoteHtmlChars(msg));
117130
}
118131

hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/ImageServlet.java

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import org.apache.hadoop.security.SecurityUtil;
4444
import org.apache.commons.logging.Log;
4545
import org.apache.commons.logging.LogFactory;
46+
import org.eclipse.jetty.server.Response;
4647
import org.apache.hadoop.classification.InterfaceAudience;
4748
import org.apache.hadoop.conf.Configuration;
4849
import org.apache.hadoop.hdfs.DFSUtil;
@@ -118,7 +119,7 @@ private FSImage getAndValidateFSImage(ServletContext context,
118119
if (nnImage == null) {
119120
String errorMsg = "NameNode initialization not yet complete. "
120121
+ "FSImage has not been set in the NameNode.";
121-
response.sendError(HttpServletResponse.SC_FORBIDDEN, errorMsg);
122+
sendError(response, HttpServletResponse.SC_FORBIDDEN, errorMsg);
122123
throw new IOException(errorMsg);
123124
}
124125
return nnImage;
@@ -207,7 +208,7 @@ private void serveFile(File file) throws IOException {
207208

208209
} catch (Throwable t) {
209210
String errMsg = "GetImage failed. " + StringUtils.stringifyException(t);
210-
response.sendError(HttpServletResponse.SC_GONE, errMsg);
211+
sendError(response, HttpServletResponse.SC_GONE, errMsg);
211212
throw new IOException(errMsg);
212213
} finally {
213214
response.getOutputStream().close();
@@ -223,7 +224,7 @@ private void validateRequest(ServletContext context, Configuration conf,
223224
conf)) {
224225
String errorMsg = "Only Namenode, Secondary Namenode, and administrators may access "
225226
+ "this servlet";
226-
response.sendError(HttpServletResponse.SC_FORBIDDEN, errorMsg);
227+
sendError(response, HttpServletResponse.SC_FORBIDDEN, errorMsg);
227228
LOG.warn("Received non-NN/SNN/administrator request for image or edits from "
228229
+ request.getUserPrincipal().getName()
229230
+ " at "
@@ -236,7 +237,7 @@ private void validateRequest(ServletContext context, Configuration conf,
236237
&& !myStorageInfoString.equals(theirStorageInfoString)) {
237238
String errorMsg = "This namenode has storage info " + myStorageInfoString
238239
+ " but the secondary expected " + theirStorageInfoString;
239-
response.sendError(HttpServletResponse.SC_FORBIDDEN, errorMsg);
240+
sendError(response, HttpServletResponse.SC_FORBIDDEN, errorMsg);
240241
LOG.warn("Received an invalid request file transfer request "
241242
+ "from a secondary with storage info " + theirStorageInfoString);
242243
throw new IOException(errorMsg);
@@ -552,7 +553,7 @@ public Void run() throws Exception {
552553
// we need a different response type here so the client can differentiate this
553554
// from the failure to upload due to (1) security, or (2) other checkpoints already
554555
// present
555-
response.sendError(HttpServletResponse.SC_EXPECTATION_FAILED,
556+
sendError(response, HttpServletResponse.SC_EXPECTATION_FAILED,
556557
"Nameode "+request.getLocalAddr()+" is currently not in a state which can "
557558
+ "accept uploads of new fsimages. State: "+state);
558559
return null;
@@ -567,15 +568,15 @@ public Void run() throws Exception {
567568
// if the node is attempting to upload an older transaction, we ignore it
568569
SortedSet<ImageUploadRequest> larger = currentlyDownloadingCheckpoints.tailSet(imageRequest);
569570
if (larger.size() > 0) {
570-
response.sendError(HttpServletResponse.SC_CONFLICT,
571+
sendError(response, HttpServletResponse.SC_CONFLICT,
571572
"Another checkpointer is already in the process of uploading a" +
572573
" checkpoint made up to transaction ID " + larger.last());
573574
return null;
574575
}
575576

576577
//make sure no one else has started uploading one
577578
if (!currentlyDownloadingCheckpoints.add(imageRequest)) {
578-
response.sendError(HttpServletResponse.SC_CONFLICT,
579+
sendError(response, HttpServletResponse.SC_CONFLICT,
579580
"Either current namenode is checkpointing or another"
580581
+ " checkpointer is already in the process of "
581582
+ "uploading a checkpoint made at transaction ID "
@@ -622,7 +623,7 @@ public Void run() throws Exception {
622623
(txid - lastCheckpointTxid) + " expecting at least "
623624
+ checkpointTxnCount;
624625
LOG.info(message);
625-
response.sendError(HttpServletResponse.SC_CONFLICT, message);
626+
sendError(response, HttpServletResponse.SC_CONFLICT, message);
626627
return null;
627628
}
628629

@@ -632,7 +633,7 @@ public Void run() throws Exception {
632633
+ "another checkpointer already uploaded an "
633634
+ "checkpoint for txid " + txid;
634635
LOG.info(message);
635-
response.sendError(HttpServletResponse.SC_CONFLICT, message);
636+
sendError(response, HttpServletResponse.SC_CONFLICT, message);
636637
return null;
637638
}
638639

@@ -669,11 +670,20 @@ public Void run() throws Exception {
669670
});
670671
} catch (Throwable t) {
671672
String errMsg = "PutImage failed. " + StringUtils.stringifyException(t);
672-
response.sendError(HttpServletResponse.SC_GONE, errMsg);
673+
sendError(response, HttpServletResponse.SC_GONE, errMsg);
673674
throw new IOException(errMsg);
674675
}
675676
}
676677

678+
private void sendError(HttpServletResponse response, int code, String message)
679+
throws IOException {
680+
if (response instanceof Response) {
681+
((Response)response).setStatusWithReason(code, message);
682+
}
683+
684+
response.sendError(code, message);
685+
}
686+
677687
/*
678688
* Params required to handle put image request
679689
*/

hadoop-project/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535

3636
<failIfNoTests>false</failIfNoTests>
3737
<maven.test.redirectTestOutputToFile>true</maven.test.redirectTestOutputToFile>
38-
<jetty.version>9.4.20.v20190813</jetty.version>
38+
<jetty.version>9.4.39.v20210325</jetty.version>
3939
<test.exclude>_</test.exclude>
4040
<test.exclude.pattern>_</test.exclude.pattern>
4141

0 commit comments

Comments
 (0)