fix #6956 in exchange
This commit is contained in:
parent
efbe04418e
commit
888895cb8c
@ -1 +1 @@
|
|||||||
Subproject commit efb2a1fd64e17159c56ff3674083837b5a657a64
|
Subproject commit 689c91490ae14721a9ad7969d8fcbc0b982488e8
|
@ -1382,8 +1382,9 @@ do_shutdown (void *cls)
|
|||||||
TEH_reserves_get_cleanup ();
|
TEH_reserves_get_cleanup ();
|
||||||
if (NULL != mhd)
|
if (NULL != mhd)
|
||||||
MHD_stop_daemon (mhd);
|
MHD_stop_daemon (mhd);
|
||||||
TALER_EXCHANGEDB_plugin_unload (TEH_plugin);
|
|
||||||
TEH_WIRE_done ();
|
TEH_WIRE_done ();
|
||||||
|
TEH_keys_finished ();
|
||||||
|
TALER_EXCHANGEDB_plugin_unload (TEH_plugin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1425,6 +1426,13 @@ run (void *cls,
|
|||||||
GNUNET_SCHEDULER_shutdown ();
|
GNUNET_SCHEDULER_shutdown ();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (GNUNET_OK !=
|
||||||
|
TEH_wire_init ())
|
||||||
|
{
|
||||||
|
global_ret = EXIT_FAILURE;
|
||||||
|
GNUNET_SCHEDULER_shutdown ();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
TEH_load_terms (TEH_cfg);
|
TEH_load_terms (TEH_cfg);
|
||||||
GNUNET_SCHEDULER_add_shutdown (&do_shutdown,
|
GNUNET_SCHEDULER_add_shutdown (&do_shutdown,
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include "platform.h"
|
#include "platform.h"
|
||||||
#include "taler_json_lib.h"
|
#include "taler_json_lib.h"
|
||||||
#include "taler_mhd_lib.h"
|
#include "taler_mhd_lib.h"
|
||||||
|
#include "taler_dbevents.h"
|
||||||
#include "taler-exchange-httpd.h"
|
#include "taler-exchange-httpd.h"
|
||||||
#include "taler-exchange-httpd_keys.h"
|
#include "taler-exchange-httpd_keys.h"
|
||||||
#include "taler-exchange-httpd_responses.h"
|
#include "taler-exchange-httpd_responses.h"
|
||||||
@ -349,6 +350,12 @@ static struct TEH_KeyStateHandle *key_state;
|
|||||||
*/
|
*/
|
||||||
static uint64_t key_generation;
|
static uint64_t key_generation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler listening for wire updates by other exchange
|
||||||
|
* services.
|
||||||
|
*/
|
||||||
|
static struct GNUNET_DB_EventHandler *keys_eh;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Head of DLL of suspended /keys requests.
|
* Head of DLL of suspended /keys requests.
|
||||||
*/
|
*/
|
||||||
@ -867,9 +874,35 @@ destroy_key_state (struct TEH_KeyStateHandle *ksh,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
/**
|
||||||
|
* Function called whenever another exchange process has updated
|
||||||
|
* the keys data in the database.
|
||||||
|
*
|
||||||
|
* @param cls NULL
|
||||||
|
* @param extra unused
|
||||||
|
* @param extra_size number of bytes in @a extra unused
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
keys_update_event_cb (void *cls,
|
||||||
|
const void *extra,
|
||||||
|
size_t extra_size)
|
||||||
|
{
|
||||||
|
(void) cls;
|
||||||
|
(void) extra;
|
||||||
|
(void) extra_size;
|
||||||
|
key_generation++;
|
||||||
|
TEH_resume_keys_requests (false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
enum GNUNET_GenericReturnValue
|
||||||
TEH_keys_init ()
|
TEH_keys_init ()
|
||||||
{
|
{
|
||||||
|
struct GNUNET_DB_EventHeaderP es = {
|
||||||
|
.size = htons (sizeof (es)),
|
||||||
|
.type = htons (TALER_DBEVENT_EXCHANGE_KEYS_UPDATED),
|
||||||
|
};
|
||||||
|
|
||||||
if (GNUNET_OK !=
|
if (GNUNET_OK !=
|
||||||
GNUNET_CONFIGURATION_get_value_time (TEH_cfg,
|
GNUNET_CONFIGURATION_get_value_time (TEH_cfg,
|
||||||
"exchange",
|
"exchange",
|
||||||
@ -881,6 +914,16 @@ TEH_keys_init ()
|
|||||||
"SIGNKEY_LEGAL_DURATION");
|
"SIGNKEY_LEGAL_DURATION");
|
||||||
return GNUNET_SYSERR;
|
return GNUNET_SYSERR;
|
||||||
}
|
}
|
||||||
|
keys_eh = TEH_plugin->event_listen (TEH_plugin->cls,
|
||||||
|
GNUNET_TIME_UNIT_FOREVER_REL,
|
||||||
|
&es,
|
||||||
|
&keys_update_event_cb,
|
||||||
|
NULL);
|
||||||
|
if (NULL == keys_eh)
|
||||||
|
{
|
||||||
|
GNUNET_break (0);
|
||||||
|
return GNUNET_SYSERR;
|
||||||
|
}
|
||||||
return GNUNET_OK;
|
return GNUNET_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -888,12 +931,18 @@ TEH_keys_init ()
|
|||||||
/**
|
/**
|
||||||
* Fully clean up our state.
|
* Fully clean up our state.
|
||||||
*/
|
*/
|
||||||
void __attribute__ ((destructor))
|
void
|
||||||
TEH_keys_finished ()
|
TEH_keys_finished ()
|
||||||
{
|
{
|
||||||
if (NULL != key_state)
|
if (NULL != key_state)
|
||||||
destroy_key_state (key_state,
|
destroy_key_state (key_state,
|
||||||
true);
|
true);
|
||||||
|
if (NULL != keys_eh)
|
||||||
|
{
|
||||||
|
TEH_plugin->event_listen_cancel (TEH_plugin->cls,
|
||||||
|
keys_eh);
|
||||||
|
keys_eh = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1719,6 +1768,15 @@ build_key_state (struct HelperState *hs,
|
|||||||
void
|
void
|
||||||
TEH_keys_update_states ()
|
TEH_keys_update_states ()
|
||||||
{
|
{
|
||||||
|
struct GNUNET_DB_EventHeaderP es = {
|
||||||
|
.size = htons (sizeof (es)),
|
||||||
|
.type = htons (TALER_DBEVENT_EXCHANGE_KEYS_UPDATED),
|
||||||
|
};
|
||||||
|
|
||||||
|
TEH_plugin->event_notify (TEH_plugin->cls,
|
||||||
|
&es,
|
||||||
|
NULL,
|
||||||
|
0);
|
||||||
key_generation++;
|
key_generation++;
|
||||||
TEH_resume_keys_requests (false);
|
TEH_resume_keys_requests (false);
|
||||||
}
|
}
|
||||||
|
@ -192,6 +192,13 @@ void
|
|||||||
TEH_keys_denomination_revoke (const struct GNUNET_HashCode *h_denom_pub);
|
TEH_keys_denomination_revoke (const struct GNUNET_HashCode *h_denom_pub);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fully clean up keys subsystem.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
TEH_keys_finished (void);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resumse all suspended /keys requests, we may now have key material
|
* Resumse all suspended /keys requests, we may now have key material
|
||||||
* (or are shutting down).
|
* (or are shutting down).
|
||||||
@ -377,11 +384,11 @@ TEH_keys_get_timing (const struct TALER_ExchangePublicKeyP *exchange_pub,
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize keys submodule.
|
* Initialize keys subsystem.
|
||||||
*
|
*
|
||||||
* @return #GNUNET_OK on success
|
* @return #GNUNET_OK on success
|
||||||
*/
|
*/
|
||||||
int
|
enum GNUNET_GenericReturnValue
|
||||||
TEH_keys_init (void);
|
TEH_keys_init (void);
|
||||||
|
|
||||||
|
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
*/
|
*/
|
||||||
#include "platform.h"
|
#include "platform.h"
|
||||||
#include <gnunet/gnunet_json_lib.h>
|
#include <gnunet/gnunet_json_lib.h>
|
||||||
|
#include "taler_dbevents.h"
|
||||||
#include "taler-exchange-httpd_responses.h"
|
#include "taler-exchange-httpd_responses.h"
|
||||||
#include "taler-exchange-httpd_wire.h"
|
#include "taler-exchange-httpd_wire.h"
|
||||||
#include "taler_json_lib.h"
|
#include "taler_json_lib.h"
|
||||||
@ -32,6 +33,11 @@
|
|||||||
*/
|
*/
|
||||||
static struct WireStateHandle *wire_state;
|
static struct WireStateHandle *wire_state;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler listening for wire updates by other exchange
|
||||||
|
* services.
|
||||||
|
*/
|
||||||
|
static struct GNUNET_DB_EventHandler *wire_eh;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Counter incremented whenever we have a reason to re-build the #wire_state
|
* Counter incremented whenever we have a reason to re-build the #wire_state
|
||||||
@ -77,6 +83,48 @@ destroy_wire_state (struct WireStateHandle *wsh)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function called whenever another exchange process has updated
|
||||||
|
* the wire data in the database.
|
||||||
|
*
|
||||||
|
* @param cls NULL
|
||||||
|
* @param extra unused
|
||||||
|
* @param extra_size number of bytes in @a extra unused
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
wire_update_event_cb (void *cls,
|
||||||
|
const void *extra,
|
||||||
|
size_t extra_size)
|
||||||
|
{
|
||||||
|
(void) cls;
|
||||||
|
(void) extra;
|
||||||
|
(void) extra_size;
|
||||||
|
wire_generation++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
TEH_wire_init ()
|
||||||
|
{
|
||||||
|
struct GNUNET_DB_EventHeaderP es = {
|
||||||
|
.size = htons (sizeof (es)),
|
||||||
|
.type = htons (TALER_DBEVENT_EXCHANGE_KEYS_UPDATED),
|
||||||
|
};
|
||||||
|
|
||||||
|
wire_eh = TEH_plugin->event_listen (TEH_plugin->cls,
|
||||||
|
GNUNET_TIME_UNIT_FOREVER_REL,
|
||||||
|
&es,
|
||||||
|
&wire_update_event_cb,
|
||||||
|
NULL);
|
||||||
|
if (NULL == wire_eh)
|
||||||
|
{
|
||||||
|
GNUNET_break (0);
|
||||||
|
return GNUNET_SYSERR;
|
||||||
|
}
|
||||||
|
return GNUNET_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
TEH_WIRE_done ()
|
TEH_WIRE_done ()
|
||||||
{
|
{
|
||||||
@ -85,6 +133,12 @@ TEH_WIRE_done ()
|
|||||||
destroy_wire_state (wire_state);
|
destroy_wire_state (wire_state);
|
||||||
wire_state = NULL;
|
wire_state = NULL;
|
||||||
}
|
}
|
||||||
|
if (NULL != wire_eh)
|
||||||
|
{
|
||||||
|
TEH_plugin->event_listen_cancel (TEH_plugin->cls,
|
||||||
|
wire_eh);
|
||||||
|
wire_eh = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -302,6 +356,15 @@ build_wire_state (void)
|
|||||||
void
|
void
|
||||||
TEH_wire_update_state (void)
|
TEH_wire_update_state (void)
|
||||||
{
|
{
|
||||||
|
struct GNUNET_DB_EventHeaderP es = {
|
||||||
|
.size = htons (sizeof (es)),
|
||||||
|
.type = htons (TALER_DBEVENT_EXCHANGE_WIRE_UPDATED),
|
||||||
|
};
|
||||||
|
|
||||||
|
TEH_plugin->event_notify (TEH_plugin->cls,
|
||||||
|
&es,
|
||||||
|
NULL,
|
||||||
|
0);
|
||||||
wire_generation++;
|
wire_generation++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,6 +33,15 @@ void
|
|||||||
TEH_WIRE_done (void);
|
TEH_WIRE_done (void);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize wire subsystem.
|
||||||
|
*
|
||||||
|
* @return #GNUNET_OK on success
|
||||||
|
*/
|
||||||
|
enum GNUNET_GenericReturnValue
|
||||||
|
TEH_wire_init (void);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Something changed in the database. Rebuild the wire replies. This function
|
* Something changed in the database. Rebuild the wire replies. This function
|
||||||
* should be called if the exchange learns about a new signature from our
|
* should be called if the exchange learns about a new signature from our
|
||||||
|
Loading…
Reference in New Issue
Block a user