diff options
Diffstat (limited to 'src/exchange')
| -rw-r--r-- | src/exchange/taler-exchange-httpd.c | 88 | ||||
| -rw-r--r-- | src/exchange/taler-exchange-httpd.h | 2 | ||||
| -rw-r--r-- | src/exchange/taler-exchange-httpd_keystate.c | 6 | ||||
| -rw-r--r-- | src/exchange/taler-exchange-httpd_wire.c | 2 | 
4 files changed, 43 insertions, 55 deletions
diff --git a/src/exchange/taler-exchange-httpd.c b/src/exchange/taler-exchange-httpd.c index 3e25b081..8aa2b198 100644 --- a/src/exchange/taler-exchange-httpd.c +++ b/src/exchange/taler-exchange-httpd.c @@ -46,8 +46,7 @@  /** - * Backlog for listen operation on unix - * domain sockets. + * Backlog for listen operation on unix domain sockets.   */  #define UNIX_BACKLOG 500 @@ -87,21 +86,21 @@ char *TEH_revocation_directory;  /**   * The exchange's configuration (global)   */ -struct GNUNET_CONFIGURATION_Handle *cfg; +struct GNUNET_CONFIGURATION_Handle *TEH_cfg;  /** - * How long is caching /keys allowed at most? + * How long is caching /keys allowed at most? (global)   */  struct GNUNET_TIME_Relative TEH_max_keys_caching;  /**   * Master public key (according to the - * configuration in the exchange directory). + * configuration in the exchange directory).  (global)   */  struct TALER_MasterPublicKeyP TEH_master_public_key;  /** - * Our DB plugin. + * Our DB plugin.  (global)   */  struct TALER_EXCHANGEDB_Plugin *TEH_plugin; @@ -138,6 +137,8 @@ static unsigned long long req_count;  /**   * Limit for the number of requests this HTTP may process before restarting. + * (This was added as one way of dealing with unavoidable memory fragmentation + * happening slowly over time.)   */  static unsigned long long req_max; @@ -267,33 +268,16 @@ handle_mhd_completion_callback (void *cls,    TALER_MHD_parse_post_cleanup_callback (ecls->opaque_post_parsing_context);    GNUNET_free (ecls);    *con_cls = NULL; -  /* check that we didn't leave any transactions hanging */ -  /* NOTE: In high-performance production, we might want to -     remove this. */ +  /* Sanity-check that we didn't leave any transactions hanging */ +  /* NOTE: In high-performance production, we could consider +     removing this as it should not be needed and might be costly +     (to be benchmarked). */    TEH_plugin->preflight (TEH_plugin->cls,                           TEH_plugin->get_session (TEH_plugin->cls));  }  /** - * Return #GNUNET_YES if given a valid correlation ID and - * #GNUNET_NO otherwise. - * - * @returns #GNUNET_YES iff given a valid correlation ID - */ -static int -is_valid_correlation_id (const char *correlation_id) -{ -  if (strlen (correlation_id) >= 64) -    return GNUNET_NO; -  for (size_t i = 0; i < strlen (correlation_id); i++) -    if (! (isalnum (correlation_id[i]) || (correlation_id[i] == '-'))) -      return GNUNET_NO; -  return GNUNET_YES; -} - - -/**   * We found @a rh responsible for handling a request. Parse the   * @a upload_data (if applicable) and the @a url and call the   * handler. @@ -348,9 +332,9 @@ proceed_with_handler (const struct TEH_RequestHandler *rh,                                       upload_data_size,                                       &root);      if (GNUNET_SYSERR == res) -      return MHD_NO; +      return MHD_NO;  /* bad upload, could not even generate error */      if ( (GNUNET_NO == res) || (NULL == root) ) -      return MHD_YES; +      return MHD_YES; /* so far incomplete upload or parser error */    }    { @@ -398,16 +382,17 @@ proceed_with_handler (const struct TEH_RequestHandler *rh,      /* just to be safe(r), we always terminate the array with a NULL         (which handlers should not read, but at least if they do, they'll -       crash pretty reliably... */ +       crash pretty reliably...) */      args[rh->nargs] = NULL; -    /* Above logic ensures that 'root' is exactly non-NULL for POST operations */ +    /* Above logic ensures that 'root' is exactly non-NULL for POST operations, +       so we test for 'root' to decide which handler to invoke. */      if (NULL != root)        ret = rh->handler.post (rh,                                connection,                                root,                                args); -    else /* and we only have "POST" or "GET" in the API for at this point +    else /* We also only have "POST" or "GET" in the API for at this point              (OPTIONS/HEAD are taken care of earlier) */        ret = rh->handler.get (rh,                               connection, @@ -462,10 +447,10 @@ handle_mhd_request (void *cls,          "Hello, I'm the Taler exchange. This HTTP server is not for humans.\n",        .response_code = MHD_HTTP_OK      }, -    /* AGPL licensing page, redirect to source. As per the AGPL-license, -       every deployment is required to offer the user a download of the -       source. We make this easy by including a redirect to the source -       here. */ +    /* AGPL licensing page, redirect to source. As per the AGPL-license, every +       deployment is required to offer the user a download of the source of +       the actual deployment. We make this easy by including a redirect to the +       source here. */      {        .url = "agpl",        .method = MHD_HTTP_METHOD_GET, @@ -521,7 +506,7 @@ handle_mhd_request (void *cls,        .handler.get = TEH_handler_link,        .nargs = 2,      }, -    /* refreshing */ +    /* refreshes/$RCH/reveal */      {        .url = "refreshes",        .method = MHD_HTTP_METHOD_POST, @@ -560,7 +545,9 @@ handle_mhd_request (void *cls,      GNUNET_log (GNUNET_ERROR_TYPE_INFO,                  "Handling new request\n"); -    cnt = __sync_add_and_fetch (&req_count, 1LLU); +    /* Atomic operation, no need for a lock ;-) */ +    cnt = __sync_add_and_fetch (&req_count, +                                1LLU);      if (req_max == cnt)      {        GNUNET_log (GNUNET_ERROR_TYPE_INFO, @@ -578,7 +565,7 @@ handle_mhd_request (void *cls,                                                    MHD_HEADER_KIND,                                                    "Taler-Correlation-Id");      if ((NULL != correlation_id) && -        (GNUNET_YES != is_valid_correlation_id (correlation_id))) +        (GNUNET_YES != GNUNET_CURL_is_valid_scope_id (correlation_id)))      {        GNUNET_log (GNUNET_ERROR_TYPE_WARNING,                    "illegal incoming correlation ID\n"); @@ -717,7 +704,7 @@ static int  exchange_serve_process_config ()  {    if (GNUNET_OK != -      GNUNET_CONFIGURATION_get_value_number (cfg, +      GNUNET_CONFIGURATION_get_value_number (TEH_cfg,                                               "exchange",                                               "MAX_REQUESTS",                                               &req_max)) @@ -725,7 +712,7 @@ exchange_serve_process_config ()      req_max = ULONG_LONG_MAX;    }    if (GNUNET_OK != -      GNUNET_CONFIGURATION_get_value_time (cfg, +      GNUNET_CONFIGURATION_get_value_time (TEH_cfg,                                             "exchange",                                             "MAX_KEYS_CACHING",                                             &TEH_max_keys_caching)) @@ -737,7 +724,7 @@ exchange_serve_process_config ()      return GNUNET_SYSERR;    }    if (GNUNET_OK != -      GNUNET_CONFIGURATION_get_value_filename (cfg, +      GNUNET_CONFIGURATION_get_value_filename (TEH_cfg,                                                 "exchange",                                                 "KEYDIR",                                                 &TEH_exchange_directory)) @@ -748,7 +735,7 @@ exchange_serve_process_config ()      return GNUNET_SYSERR;    }    if (GNUNET_OK != -      GNUNET_CONFIGURATION_get_value_filename (cfg, +      GNUNET_CONFIGURATION_get_value_filename (TEH_cfg,                                                 "exchange",                                                 "REVOCATION_DIR",                                                 &TEH_revocation_directory)) @@ -762,7 +749,7 @@ exchange_serve_process_config ()      char *master_public_key_str;      if (GNUNET_OK != -        GNUNET_CONFIGURATION_get_value_string (cfg, +        GNUNET_CONFIGURATION_get_value_string (TEH_cfg,                                                 "exchange",                                                 "MASTER_PUBLIC_KEY",                                                 &master_public_key_str)) @@ -791,14 +778,14 @@ exchange_serve_process_config ()                GNUNET_p2s (&TEH_master_public_key.eddsa_pub));    if ( (GNUNET_OK != -        TEH_VALIDATION_init (cfg)) || +        TEH_VALIDATION_init (TEH_cfg)) ||         (GNUNET_OK !=          TEH_WIRE_init ()) )      return GNUNET_SYSERR;    if (NULL == -      (TEH_plugin = TALER_EXCHANGEDB_plugin_load (cfg))) +      (TEH_plugin = TALER_EXCHANGEDB_plugin_load (TEH_cfg)))    {      fprintf (stderr,               "Failed to initialize DB subsystem\n"); @@ -807,7 +794,7 @@ exchange_serve_process_config ()    }    if (GNUNET_OK != -      TALER_MHD_parse_config (cfg, +      TALER_MHD_parse_config (TEH_cfg,                                "exchange",                                &serve_port,                                &serve_unixpath, @@ -1246,9 +1233,10 @@ main (int argc,                                     logfile));    if (NULL == cfgfile)      cfgfile = GNUNET_strdup (GNUNET_OS_project_data_get ()->user_config_file); -  cfg = GNUNET_CONFIGURATION_create (); +  TEH_cfg = GNUNET_CONFIGURATION_create ();    if (GNUNET_SYSERR == -      GNUNET_CONFIGURATION_load (cfg, cfgfile)) +      GNUNET_CONFIGURATION_load (TEH_cfg, +                                 cfgfile))    {      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,                  _ ("Malformed configuration file `%s', exit ...\n"), @@ -1260,7 +1248,7 @@ main (int argc,    if (GNUNET_OK !=        exchange_serve_process_config ())      return 1; -  TEH_load_terms (cfg); +  TEH_load_terms (TEH_cfg);    /* check for systemd-style FD passing */    listen_pid = getenv ("LISTEN_PID"); diff --git a/src/exchange/taler-exchange-httpd.h b/src/exchange/taler-exchange-httpd.h index 8489d179..137cee72 100644 --- a/src/exchange/taler-exchange-httpd.h +++ b/src/exchange/taler-exchange-httpd.h @@ -36,7 +36,7 @@ extern struct GNUNET_TIME_Relative TEH_max_keys_caching;  /**   * The exchange's configuration.   */ -extern struct GNUNET_CONFIGURATION_Handle *cfg; +extern struct GNUNET_CONFIGURATION_Handle *TEH_cfg;  /**   * Main directory with exchange data. diff --git a/src/exchange/taler-exchange-httpd_keystate.c b/src/exchange/taler-exchange-httpd_keystate.c index 024c7456..2f6c6187 100644 --- a/src/exchange/taler-exchange-httpd_keystate.c +++ b/src/exchange/taler-exchange-httpd_keystate.c @@ -675,7 +675,7 @@ TALER_EXCHANGE_conf_duration_provide ()    struct GNUNET_TIME_Relative rel;    if (GNUNET_OK != -      GNUNET_CONFIGURATION_get_value_time (cfg, +      GNUNET_CONFIGURATION_get_value_time (TEH_cfg,                                             "exchange",                                             "LOOKAHEAD_PROVIDE",                                             &rel)) @@ -1474,7 +1474,7 @@ build_keys_response (const struct ResponseFactoryContext *rfc,                     &ks.purpose,                     &sig.eddsa_signature));    if (GNUNET_OK != -      GNUNET_CONFIGURATION_get_value_time (cfg, +      GNUNET_CONFIGURATION_get_value_time (TEH_cfg,                                             "exchangedb",                                             "IDLE_RESERVE_EXPIRATION_TIME",                                             &reserve_closing_delay)) @@ -1780,7 +1780,7 @@ make_fresh_key_state (struct GNUNET_TIME_Absolute now)           &denomkey_array_sort_comparator);    /* Complete `denomkey_array` by adding auditor signature data */ -  TALER_EXCHANGEDB_auditor_iterate (cfg, +  TALER_EXCHANGEDB_auditor_iterate (TEH_cfg,                                      &reload_auditor_iter,                                      &rfc);    /* Sanity check: do we have auditors for all denomination keys? */ diff --git a/src/exchange/taler-exchange-httpd_wire.c b/src/exchange/taler-exchange-httpd_wire.c index bd6df87c..c5d41402 100644 --- a/src/exchange/taler-exchange-httpd_wire.c +++ b/src/exchange/taler-exchange-httpd_wire.c @@ -95,7 +95,7 @@ TEH_WIRE_get_fees (const char *method)    json_t *j;    struct GNUNET_TIME_Absolute now; -  af = TALER_EXCHANGEDB_fees_read (cfg, +  af = TALER_EXCHANGEDB_fees_read (TEH_cfg,                                     method);    now = GNUNET_TIME_absolute_get ();    while ( (NULL != af) &&  | 
