scalahttp4s

http4s shutdown takes 30 seconds?


I'm learning http4s and trying out the basic example from the documentation, and I've noticed something weird. Simply starting and stopping the server works fine, but if any requests are sent, a graceful shutdown takes about 30 seconds (during which new incoming requests are still processed and responded to).

This is the code:

object Main extends IOApp.Simple {
  val helloWorldService = HttpRoutes.of[IO] {
    case GET -> Root / "hello" / name =>
      Ok(s"Hello, $name.")
  }.orNotFound

  def server[F[_] : Async : Network]: EmberServerBuilder[F] = {
    EmberServerBuilder
      .default[F]
      .withHost(ipv4"0.0.0.0")
      .withPort(port"8000")
  }

  def run: IO[Unit] = {
    server[IO]
      .withHttpApp(helloWorldService)
      .build
      .use(_ => IO.never)
  }
}

This happens on both the stable (0.23.16) and dev (1.0.0-M37) versions.


Solution

  • Turns out the cause was the browser/Postman keeping the connection alive. Simply closing Postman after the request closed the connection and the shutdown was immediate.

    And EmberServerBuilder has .withShutdownTimeout setting to control how long the shutdown waits for connections to be closed.