This commit is contained in:
Christian Grothoff 2019-12-01 13:31:45 +01:00
parent 97afbf1ea5
commit f1639c09a2
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
3 changed files with 37 additions and 2 deletions

View File

@ -13,6 +13,7 @@ SIGNKEY_DURATION = 4 weeks
LEGAL_DURATION = 2 years LEGAL_DURATION = 2 years
LOOKAHEAD_SIGN = 32 weeks 1 day LOOKAHEAD_SIGN = 32 weeks 1 day
LOOKAHEAD_PROVIDE = 4 weeks 1 day LOOKAHEAD_PROVIDE = 4 weeks 1 day
MAX_REQUESTS = 2
[merchant] [merchant]
SERVE = tcp SERVE = tcp

View File

@ -21,6 +21,11 @@ REVOCATION_DIR = ${TALER_DATA_HOME}/exchange/revocations/
# Used to artifically reduce caching (addresses #5747). # Used to artifically reduce caching (addresses #5747).
MAX_KEYS_CACHING = forever MAX_KEYS_CACHING = forever
# After how many requests should the exchange auto-restart
# (to address potential issues with memory fragmentation)?
# If this option is not specified, auto-restarting is disabled.
# MAX_REQUESTS = 10000000
# How to access our database # How to access our database
DB = postgres DB = postgres

View File

@ -1,6 +1,6 @@
/* /*
This file is part of TALER This file is part of TALER
Copyright (C) 2014, 2015, 2016, 2019 Inria and GNUnet e.V. Copyright (C) 2014, 2015, 2016, 2019 Taler Systems SA
TALER is free software; you can redistribute it and/or modify it under the TALER is free software; you can redistribute it and/or modify it under the
terms of the GNU Affero General Public License as published by the Free Software terms of the GNU Affero General Public License as published by the Free Software
@ -13,7 +13,6 @@
You should have received a copy of the GNU Affero General Public License along with You should have received a copy of the GNU Affero General Public License along with
TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/> TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/ */
/** /**
* @file taler-exchange-httpd.c * @file taler-exchange-httpd.c
* @brief Serve the HTTP interface of the exchange * @brief Serve the HTTP interface of the exchange
@ -144,6 +143,16 @@ static char *serve_unixpath;
*/ */
static mode_t unixpath_mode; static mode_t unixpath_mode;
/**
* Counter for the number of requests this HTTP has processed so far.
*/
static unsigned long long req_count;
/**
* Limit for the number of requests this HTTP may process before restarting.
*/
static unsigned long long req_max;
/** /**
* Function called whenever MHD is done with a request. If the * Function called whenever MHD is done with a request. If the
@ -422,7 +431,19 @@ handle_mhd_request (void *cls,
(void) version; (void) version;
if (NULL == ecls) if (NULL == ecls)
{ {
unsigned long long cnt;
GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Handling new request\n"); GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Handling new request\n");
cnt = __sync_add_and_fetch (&req_count, 1LLU);
if (req_max == cnt)
{
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
"Restarting exchange service after %llu requests\n",
cnt);
(void) kill (getpid (),
SIGHUP);
}
/* We're in a new async scope! */ /* We're in a new async scope! */
ecls = *con_cls = GNUNET_new (struct ExchangeHttpRequestClosure); ecls = *con_cls = GNUNET_new (struct ExchangeHttpRequestClosure);
GNUNET_async_scope_fresh (&ecls->async_scope_id); GNUNET_async_scope_fresh (&ecls->async_scope_id);
@ -497,6 +518,14 @@ exchange_serve_process_config ()
{ {
char *TEH_master_public_key_str; char *TEH_master_public_key_str;
if (GNUNET_OK !=
GNUNET_CONFIGURATION_get_value_number (cfg,
"exchange",
"MAX_REQUESTS",
&req_max))
{
req_max = ULONG_LONG_MAX;
}
if (GNUNET_OK != if (GNUNET_OK !=
GNUNET_CONFIGURATION_get_value_time (cfg, GNUNET_CONFIGURATION_get_value_time (cfg,
"exchange", "exchange",