Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: Use zstd and prefer it if available #3384

Draft
wants to merge 1 commit into
base: jwilson.0206.jetty121_ee8
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,9 @@ jetbrainsAnnotations = { module = "org.jetbrains:annotations", version = "26.0.2
jettyAlpnServer = { module = "org.eclipse.jetty:jetty-alpn-server" }
jettyAlpnServerJava = { module = "org.eclipse.jetty:jetty-alpn-java-server" }
jettyBom = { module = "org.eclipse.jetty:jetty-bom", version = "12.1.0.alpha1" }
jettyCompressionServer = { module = "org.eclipse.jetty.compression:jetty-compression-server", version = "12.1.0.alpha1" }
jettyCompressionGzip = { module = "org.eclipse.jetty.compression:jetty-compression-gzip", version = "12.1.0.alpha1" }
jettyCompressionZstandard = { module = "org.eclipse.jetty.compression:jetty-compression-zstandard", version = "12.1.0.alpha1" }
jettyEe8Bom = { module = "org.eclipse.jetty.ee8:jetty-ee8-bom", version = "12.1.0.alpha1" }
jettyEe8WebsocketServer = { module = "org.eclipse.jetty.ee8.websocket:jetty-ee8-websocket-jetty-server" }
jettyHttp = { module = "org.eclipse.jetty:jetty-http" }
Expand Down
3 changes: 3 additions & 0 deletions misk/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ dependencies {
api(libs.jacksonAnnotations)
api(libs.jacksonDatabind)
api(libs.jakartaInject)
api(libs.jettyCompressionServer)
api(libs.jettyCompressionGzip)
api(libs.jettyCompressionZstandard)
api(libs.jettyServer)
api(libs.jettyServletApi)
api(libs.jettyUtil)
Expand Down
6 changes: 3 additions & 3 deletions misk/src/main/kotlin/misk/web/MiskWebModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -92,9 +92,9 @@ import misk.web.mdc.RequestURILogContextProvider
import misk.web.proxy.WebProxyEntry
import misk.web.resources.StaticResourceEntry
import misk.web.shutdown.GracefulShutdownModule
import org.eclipse.jetty.compression.server.CompressionHandler
import org.eclipse.jetty.io.EofException
import org.eclipse.jetty.server.handler.StatisticsHandler
import org.eclipse.jetty.server.handler.gzip.GzipHandler
import org.eclipse.jetty.util.VirtualThreads
import org.eclipse.jetty.util.thread.ExecutorThreadPool
import org.eclipse.jetty.util.thread.QueuedThreadPool
Expand Down Expand Up @@ -327,8 +327,8 @@ class MiskWebModule @JvmOverloads constructor(

@Provides
@Singleton
fun provideGzipHandler(): GzipHandler {
return GzipHandler()
fun provideCompressionHandler(): CompressionHandler {
return CompressionHandler()
}

@Provides
Expand Down
38 changes: 29 additions & 9 deletions misk/src/main/kotlin/misk/web/jetty/JettyService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ import misk.web.jetty.JettyHealthService.Companion.jettyHealthServiceEnabled
import misk.web.mediatype.MediaTypes
import okhttp3.HttpUrl
import org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory
import org.eclipse.jetty.compression.gzip.GzipCompression
import org.eclipse.jetty.compression.server.CompressionConfig
import org.eclipse.jetty.compression.server.CompressionHandler
import org.eclipse.jetty.compression.zstandard.ZstandardCompression
import org.eclipse.jetty.ee8.servlet.FilterHolder
import org.eclipse.jetty.ee8.servlet.ServletContextHandler
import org.eclipse.jetty.ee8.servlet.ServletHolder
Expand All @@ -36,7 +40,6 @@ import org.eclipse.jetty.server.Server
import org.eclipse.jetty.server.ServerConnector
import org.eclipse.jetty.server.SslConnectionFactory
import org.eclipse.jetty.server.handler.StatisticsHandler
import org.eclipse.jetty.server.handler.gzip.GzipHandler
import org.eclipse.jetty.unixdomain.server.UnixDomainServerConnector
import org.eclipse.jetty.util.ssl.SslContextFactory
import org.eclipse.jetty.util.thread.ThreadPool
Expand All @@ -62,7 +65,7 @@ class JettyService @Inject internal constructor(
threadPool: ThreadPool,
private val connectionMetricsCollector: JettyConnectionMetricsCollector,
private val statisticsHandler: StatisticsHandler,
private val gzipHandler: GzipHandler,
private val compressionHandler: CompressionHandler,
) : AbstractIdleService() {
private val server = Server(threadPool)
val healthServerUrl: HttpUrl? get() = server.healthUrl
Expand Down Expand Up @@ -293,16 +296,33 @@ class JettyService @Inject internal constructor(
val serverStats = ConnectionStatistics()
server.addBean(serverStats)

gzipHandler.server = server
compressionHandler.server = server
if (webConfig.gzip) {
gzipHandler.minGzipSize = webConfig.minGzipSize
gzipHandler.addIncludedMethods("POST")
gzipHandler.addExcludedMimeTypes(MediaTypes.APPLICATION_GRPC)
compressionHandler.putCompression(ZstandardCompression().apply {
this.minCompressSize = webConfig.minGzipSize
})
compressionHandler.putCompression(GzipCompression().apply {
this.minCompressSize = webConfig.minGzipSize
})
compressionHandler.putConfiguration("/", CompressionConfig.builder()
.defaults()
.compressExcludeMimeType(MediaTypes.APPLICATION_GRPC)
.decompressExcludeMimeType(MediaTypes.APPLICATION_GRPC)
.compressPreferredEncodings(listOf("zstd"))
.build()
)
} else {
// GET is enabled by default for gzipHandler.
gzipHandler.addExcludedMethods("GET", "POST")
compressionHandler.putConfiguration("/", CompressionConfig.builder()
.compressExcludeMethod("GET")
.compressExcludeMethod("POST")
.decompressExcludeMethod("GET")
.decompressExcludeMethod("POST")
.compressExcludeMimeType(MediaTypes.APPLICATION_GRPC)
.decompressExcludeMimeType(MediaTypes.APPLICATION_GRPC)
.build()
)
}
servletContextHandler.insertHandler(gzipHandler)
servletContextHandler.insertHandler(compressionHandler)

server.handler = statisticsHandler

Expand Down
Loading