You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Generalize apollo-server graceful shutdown to all integrations
Previously, the batteries-included `apollo-server` package had a special
override of `stop()` which drains the HTTP server before letting the
actual Apollo Server `stop()` machinery begin. This meant that
`apollo-server` followed this nice shutdown lifecycle:
- Stop listening for new connections
- Close all idle connections and start closing connections as they go
idle
- Wait a grace period for all connections to close and force-close any
remaining ones
- Transition ApolloServer to the stopping state, where no operations
will run
- Run stop hooks (eg send final usage report)
This was great... but only `apollo-server` worked this way, because only
`apollo-server` has full knowledge and control over its HTTP server.
This PR adds a server draining step to the ApolloServer lifecycle and
plugin interface, and provides a built-in plugin which drains a Node
`http.Server` using the logic of the first three steps above.
`apollo-server`'s behavior is now just to automatically install the
plugin.
Specifically:
- Add a new 'phase' called `draining` that fits between `started` and
`stopping`. Like `started`, operations can still execute during
`draining`. Like `stopping`, any concurrent call to `stop()` will just
block until the first `stop()` call finishes rather than starting a
second shutdown process.
- Add a new `drainServer` plugin hook (on the object returned by
`serverWillStart`). Invoke all `drainServer` hooks in parallel during
the `draining` phase.
- Make calling `stop()` when `start()` has not yet completed
successfully into an error. That behavior was previously undefined.
Note that as of #5639, the automatic `stop()` call from signal
handlers can't happen before `start()` succeeds.
- Add `ApolloServerPluginDrainHttpServer` to `apollo-server-core`.
This plugin implements `drainServer` using the `Stopper` class
that was previously in the `apollo-server` package. The default
grace period is 10 seconds.
- Clean up integration tests to just use `stop()` with the plugin
instead of separately stopping the HTTP server. Note that for Fastify
specifically we also call `app.close` although there is some weirdness
here around both `app.close` and our Stopper closing the same server.
A comment describes the weirdness; perhaps Fastify experts can improve
this later.
- The Hapi web framework has built in logic that is similar to our
Stopper, so `apollo-server-hapi` exports
`ApolloServerPluginStopHapiServer` which should be used instead of the
other plugin with Hapi.
- Fix some test issues (eg, have FakeTimers only mock out Date.now
instead of setImmediate, drop an erroneous `const` which made an `app`
not get cleaned up, etc).
Fixes#5074.
0 commit comments