GoogleCloudPlatform / pgadapter

PostgreSQL wire-protocol proxy for Cloud Spanner
https://cloud.google.com/spanner/docs/postgresql-interface#postgresql-client-support
Apache License 2.0
59 stars 21 forks source link

feature request: new 'max-sigterm-delay' flag #1189

Open magiccrafter opened 1 year ago

magiccrafter commented 1 year ago

The --max-sigterm-delay flag is crucial for microservices that require a graceful shutdown period to ensure ongoing transactions are completed successfully. This flag allows the microservice to remain operational for a specified duration after receiving a termination signal (SIGTERM), granting sufficient time for its database connector to remain active and handle pending transactions.

flag description
--max-sigterm-delay Maximum number of seconds to wait for connections to close after receiving a TERM signal.

Disclaimer: The name of the flag and the description are copied from the https://github.com/GoogleCloudPlatform/cloud-sql-proxy

Implementing this feature will smoothen the transition from Postgres to Spanner.

olavloite commented 1 month ago

Version 0.38.0 that was shipped recently improved shutdown handling:

  1. SIGTERM: This initiates the SMART shutdown mode. In this mode, all new connection requests will be refused, but existing connections are allowed to continue. PGAdapter shuts down when all connections have been closed.
  2. SIGINT: This initiates the FAST shutdown mode. This closes all existing connections and shuts down PGAdapter.
  3. SIGQUIT: (This is relatively theoretical, as JVMs do not allow applications to register a handler for SIGQUIT.) SIGQUIT initiates the IMMEDIATE shutdown mode. For PGAdapter, this is largely the same as the FAST shutdown mode, with the only exception that in IMMEDIATE shutdown mode, PGAdapter does not wait for the internal Spanner session pool to be cleaned up.

The above is designed to align as much as possible with https://www.postgresql.org/docs/current/server-shutdown.html. You can 'upgrade' from SMART to FAST shutdown mode by first sending PGAdapter a SIGTERM, then wait X seconds, and then send it a SIGINT.