Skip to content

Commit ca4bf8c

Browse files
rxinpwendell
authored andcommitted
SPARK-1236 - Upgrade Jetty to 9.1.3.v20140225.
Author: Reynold Xin <[email protected]> Closes #113 from rxin/jetty9 and squashes the following commits: 867a2ce [Reynold Xin] Updated Jetty version to 9.1.3.v20140225 in Maven build file. d7c97ca [Reynold Xin] Return the correctly bound port. d14706f [Reynold Xin] Upgrade Jetty to 9.1.3.v20140225.
1 parent 6983732 commit ca4bf8c

File tree

4 files changed

+49
-46
lines changed

4 files changed

+49
-46
lines changed

core/src/main/scala/org/apache/spark/HttpServer.scala

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,9 @@ import java.io.File
2121

2222
import org.eclipse.jetty.util.security.{Constraint, Password}
2323
import org.eclipse.jetty.security.authentication.DigestAuthenticator
24-
import org.eclipse.jetty.security.{ConstraintMapping, ConstraintSecurityHandler, HashLoginService, SecurityHandler}
24+
import org.eclipse.jetty.security.{ConstraintMapping, ConstraintSecurityHandler, HashLoginService}
2525

26-
import org.eclipse.jetty.server.Server
27-
import org.eclipse.jetty.server.bio.SocketConnector
26+
import org.eclipse.jetty.server.{Server, ServerConnector}
2827
import org.eclipse.jetty.server.handler.{DefaultHandler, HandlerList, ResourceHandler}
2928
import org.eclipse.jetty.util.thread.QueuedThreadPool
3029

@@ -43,24 +42,24 @@ private[spark] class ServerStateException(message: String) extends Exception(mes
4342
*/
4443
private[spark] class HttpServer(resourceBase: File, securityManager: SecurityManager)
4544
extends Logging {
46-
private var server: Server = null
45+
private var server: Server = _
4746
private var port: Int = -1
4847

4948
def start() {
5049
if (server != null) {
5150
throw new ServerStateException("Server is already started")
5251
} else {
5352
logInfo("Starting HTTP Server")
54-
server = new Server()
55-
val connector = new SocketConnector
56-
connector.setMaxIdleTime(60*1000)
53+
val threadPool = new QueuedThreadPool
54+
threadPool.setDaemon(true)
55+
56+
server = new Server(threadPool)
57+
val connector = new ServerConnector(server)
58+
connector.setIdleTimeout(60 * 1000)
5759
connector.setSoLingerTime(-1)
5860
connector.setPort(0)
5961
server.addConnector(connector)
6062

61-
val threadPool = new QueuedThreadPool
62-
threadPool.setDaemon(true)
63-
server.setThreadPool(threadPool)
6463
val resHandler = new ResourceHandler
6564
resHandler.setResourceBase(resourceBase.getAbsolutePath)
6665

@@ -79,7 +78,7 @@ private[spark] class HttpServer(resourceBase: File, securityManager: SecurityMan
7978
}
8079

8180
server.start()
82-
port = server.getConnectors()(0).getLocalPort()
81+
port = connector.getLocalPort
8382
}
8483
}
8584

core/src/main/scala/org/apache/spark/ui/JettyUtils.scala

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package org.apache.spark.ui
1919

2020
import java.net.InetSocketAddress
2121
import java.net.URL
22+
import javax.servlet.DispatcherType
2223
import javax.servlet.http.{HttpServlet, HttpServletResponse, HttpServletRequest}
2324

2425
import scala.annotation.tailrec
@@ -28,7 +29,7 @@ import scala.xml.Node
2829
import org.json4s.JValue
2930
import org.json4s.jackson.JsonMethods.{pretty, render}
3031

31-
import org.eclipse.jetty.server.{DispatcherType, Server}
32+
import org.eclipse.jetty.server.{NetworkConnector, Server}
3233
import org.eclipse.jetty.server.handler.HandlerList
3334
import org.eclipse.jetty.servlet.{DefaultServlet, FilterHolder, ServletContextHandler, ServletHolder}
3435
import org.eclipse.jetty.util.thread.QueuedThreadPool
@@ -60,8 +61,7 @@ private[spark] object JettyUtils extends Logging {
6061
def createServlet[T <% AnyRef](servletParams: ServletParams[T],
6162
securityMgr: SecurityManager): HttpServlet = {
6263
new HttpServlet {
63-
override def doGet(request: HttpServletRequest,
64-
response: HttpServletResponse) {
64+
override def doGet(request: HttpServletRequest, response: HttpServletResponse) {
6565
if (securityMgr.checkUIViewPermissions(request.getRemoteUser())) {
6666
response.setContentType("%s;charset=utf-8".format(servletParams.contentType))
6767
response.setStatus(HttpServletResponse.SC_OK)
@@ -72,7 +72,7 @@ private[spark] object JettyUtils extends Logging {
7272
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED)
7373
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate")
7474
response.sendError(HttpServletResponse.SC_UNAUTHORIZED,
75-
"User is not authorized to access this page.");
75+
"User is not authorized to access this page.")
7676
}
7777
}
7878
}
@@ -120,26 +120,25 @@ private[spark] object JettyUtils extends Logging {
120120

121121
private def addFilters(handlers: Seq[ServletContextHandler], conf: SparkConf) {
122122
val filters: Array[String] = conf.get("spark.ui.filters", "").split(',').map(_.trim())
123-
filters.foreach {
124-
case filter : String =>
125-
if (!filter.isEmpty) {
126-
logInfo("Adding filter: " + filter)
127-
val holder : FilterHolder = new FilterHolder()
128-
holder.setClassName(filter)
129-
// get any parameters for each filter
130-
val paramName = "spark." + filter + ".params"
131-
val params = conf.get(paramName, "").split(',').map(_.trim()).toSet
132-
params.foreach {
133-
case param : String =>
134-
if (!param.isEmpty) {
135-
val parts = param.split("=")
136-
if (parts.length == 2) holder.setInitParameter(parts(0), parts(1))
137-
}
138-
}
139-
val enumDispatcher = java.util.EnumSet.of(DispatcherType.ASYNC, DispatcherType.ERROR,
140-
DispatcherType.FORWARD, DispatcherType.INCLUDE, DispatcherType.REQUEST)
141-
handlers.foreach { case(handler) => handler.addFilter(holder, "/*", enumDispatcher) }
123+
filters.foreach { filter =>
124+
if (!filter.isEmpty) {
125+
logInfo("Adding filter: " + filter)
126+
val holder : FilterHolder = new FilterHolder()
127+
holder.setClassName(filter)
128+
// get any parameters for each filter
129+
val paramName = "spark." + filter + ".params"
130+
val params = conf.get(paramName, "").split(',').map(_.trim()).toSet
131+
params.foreach {
132+
case param : String =>
133+
if (!param.isEmpty) {
134+
val parts = param.split("=")
135+
if (parts.length == 2) holder.setInitParameter(parts(0), parts(1))
136+
}
142137
}
138+
val enumDispatcher = java.util.EnumSet.of(DispatcherType.ASYNC, DispatcherType.ERROR,
139+
DispatcherType.FORWARD, DispatcherType.INCLUDE, DispatcherType.REQUEST)
140+
handlers.foreach { handler => handler.addFilter(holder, "/*", enumDispatcher) }
141+
}
143142
}
144143
}
145144

@@ -150,7 +149,10 @@ private[spark] object JettyUtils extends Logging {
150149
* If the desired port number is contented, continues incrementing ports until a free port is
151150
* found. Returns the chosen port and the jetty Server object.
152151
*/
153-
def startJettyServer(hostName: String, port: Int, handlers: Seq[ServletContextHandler],
152+
def startJettyServer(
153+
hostName: String,
154+
port: Int,
155+
handlers: Seq[ServletContextHandler],
154156
conf: SparkConf): (Server, Int) = {
155157

156158
addFilters(handlers, conf)
@@ -160,16 +162,18 @@ private[spark] object JettyUtils extends Logging {
160162
@tailrec
161163
def connect(currentPort: Int): (Server, Int) = {
162164
val server = new Server(new InetSocketAddress(hostName, currentPort))
163-
val pool = new QueuedThreadPool
165+
// Unfortunately Jetty 9 doesn't allow us to set both the thread pool and the port number in
166+
// constructor. But fortunately the pool allocated by Jetty is always a QueuedThreadPool.
167+
val pool = server.getThreadPool.asInstanceOf[QueuedThreadPool]
164168
pool.setDaemon(true)
165-
server.setThreadPool(pool)
169+
166170
server.setHandler(handlerList)
167171

168172
Try {
169173
server.start()
170174
} match {
171175
case s: Success[_] =>
172-
(server, server.getConnectors.head.getLocalPort)
176+
(server, server.getConnectors.head.asInstanceOf[NetworkConnector].getLocalPort)
173177
case f: Failure[_] =>
174178
server.stop()
175179
logInfo("Failed to create UI at port, %s. Trying again.".format(currentPort))

pom.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -158,22 +158,22 @@
158158
<dependency>
159159
<groupId>org.eclipse.jetty</groupId>
160160
<artifactId>jetty-util</artifactId>
161-
<version>7.6.8.v20121106</version>
161+
<version>9.1.3.v20140225</version>
162162
</dependency>
163163
<dependency>
164164
<groupId>org.eclipse.jetty</groupId>
165165
<artifactId>jetty-security</artifactId>
166-
<version>7.6.8.v20121106</version>
166+
<version>9.1.3.v20140225</version>
167167
</dependency>
168168
<dependency>
169169
<groupId>org.eclipse.jetty</groupId>
170170
<artifactId>jetty-plus</artifactId>
171-
<version>7.6.8.v20121106</version>
171+
<version>9.1.3.v20140225</version>
172172
</dependency>
173173
<dependency>
174174
<groupId>org.eclipse.jetty</groupId>
175175
<artifactId>jetty-server</artifactId>
176-
<version>7.6.8.v20121106</version>
176+
<version>9.1.3.v20140225</version>
177177
</dependency>
178178
<dependency>
179179
<groupId>com.google.guava</groupId>

project/SparkBuild.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -232,10 +232,10 @@ object SparkBuild extends Build {
232232

233233
libraryDependencies ++= Seq(
234234
"io.netty" % "netty-all" % "4.0.17.Final",
235-
"org.eclipse.jetty" % "jetty-server" % "7.6.8.v20121106",
236-
"org.eclipse.jetty" % "jetty-util" % "7.6.8.v20121106",
237-
"org.eclipse.jetty" % "jetty-plus" % "7.6.8.v20121106",
238-
"org.eclipse.jetty" % "jetty-security" % "7.6.8.v20121106",
235+
"org.eclipse.jetty" % "jetty-server" % "9.1.3.v20140225",
236+
"org.eclipse.jetty" % "jetty-util" % "9.1.3.v20140225",
237+
"org.eclipse.jetty" % "jetty-plus" % "9.1.3.v20140225",
238+
"org.eclipse.jetty" % "jetty-security" % "9.1.3.v20140225",
239239
/** Workaround for SPARK-959. Dependency used by org.eclipse.jetty. Fixed in ivy 2.3.0. */
240240
"org.eclipse.jetty.orbit" % "javax.servlet" % "2.5.0.v201103041518" artifacts Artifact("javax.servlet", "jar", "jar"),
241241
"org.scalatest" %% "scalatest" % "1.9.1" % "test",

0 commit comments

Comments
 (0)