paivana

HTTP paywall reverse proxy
Log | Files | Refs | Submodules | README | LICENSE

commit 55cf983d4b53dbd4c6d0b9494cb37ed8ec4b9998
parent 9f620f17eda8adbd91f13167ec72c9e6d2d8f005
Author: Florian Dold <dold@taler.net>
Date:   Tue, 25 Aug 2026 22:59:33 +0200

paivana-httpd: resume requests before forced shutdown

Diffstat:
Msrc/backend/paivana-httpd.c | 9++++++++-
Msrc/tests/test_reverse_proxy.sh | 27+++++++++++++++++++++++++++
2 files changed, 35 insertions(+), 1 deletion(-)

diff --git a/src/backend/paivana-httpd.c b/src/backend/paivana-httpd.c @@ -393,9 +393,16 @@ finish_shutdown (void) shutdown_cleanup_done = true; GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Finishing shutdown\n"); - PAIVANA_HTTPD_daemons_destroy (); + /* MHD_stop_daemon() must never see a suspended connection. Stop the + scheduler integration first so that resumed requests cannot be dispatched + between the following cleanup calls, then cancel/resume every suspended + payment and reverse-proxy request before destroying the daemons. This + ordering matters specifically when the graceful-drain deadline expires: + in that case active upstream operations still exist by definition. */ + TALER_MHD_daemons_halt (); PAIVANA_HTTPD_payment_shutdown (); PAIVANA_HTTPD_reverse_shutdown (); + PAIVANA_HTTPD_daemons_destroy (); PAIVANA_HTTPD_unload_templates (); TALER_TEMPLATING_done (); GNUNET_free (PH_target_server_base_url); diff --git a/src/tests/test_reverse_proxy.sh b/src/tests/test_reverse_proxy.sh @@ -2264,6 +2264,33 @@ function test_graceful_shutdown() { fail "graceful-drain completion was not logged" ok + start_paivana_with_config "http://127.0.0.1:$MHD_PORT" \ + $'CONNECTION_LIMIT = 10\nPAYMENT_CONNECTION_LIMIT = 2\nSHUTDOWN_GRACE_PERIOD = 100 ms' INFO + + curl -sS -o /dev/null "$(PAIVANA_URL /slow/2000)" & + curl_pid=$! + sleep 0.2 + msg "the shutdown deadline cancels a suspended request without aborting" + kill -TERM "$PAIVANA_PID" + # The forced shutdown deliberately terminates this client request. Its + # result is immaterial; the daemon must exit normally rather than letting + # MHD abort because the connection was still suspended. + wait "$curl_pid" || : + local paivana_status + if wait "$PAIVANA_PID"; + then + paivana_status=0 + else + paivana_status=$? + fi + PAIVANA_PID="" + [ "$paivana_status" = 0 ] || \ + fail "paivana exited with status $paivana_status at the drain deadline" + grep -q 'Graceful shutdown deadline reached with 1 active request' \ + "$LOGDIR/paivana-custom.log" || \ + fail "graceful-drain deadline was not reached with an active request" + ok + start_paivana "http://127.0.0.1:$MHD_PORT" }