-fix misc interesting wirewatch in test mode with sharding issues
This commit is contained in:
parent
6d7eb372b2
commit
29b4e71bf5
@ -754,7 +754,7 @@ make_transfer (
|
||||
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
|
||||
GNUNET_assert (0 ==
|
||||
pthread_mutex_unlock (&h->uuid_map_lock));
|
||||
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
|
||||
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
|
||||
"Making transfer %llu from %s to %s over %s and subject %s; for exchange: %s\n",
|
||||
(unsigned long long) t->row_id,
|
||||
debit_account,
|
||||
@ -1296,7 +1296,8 @@ struct HistoryArgs
|
||||
* @return #GNUNET_OK only if the parsing succeeds.
|
||||
*/
|
||||
static int
|
||||
parse_history_common_args (struct MHD_Connection *connection,
|
||||
parse_history_common_args (struct TALER_FAKEBANK_Handle *h,
|
||||
struct MHD_Connection *connection,
|
||||
struct HistoryArgs *ha)
|
||||
{
|
||||
const char *start;
|
||||
@ -1338,7 +1339,7 @@ parse_history_common_args (struct MHD_Connection *connection,
|
||||
return GNUNET_NO;
|
||||
}
|
||||
if (NULL == start)
|
||||
ha->start_idx = (d > 0) ? 0 : UINT64_MAX;
|
||||
ha->start_idx = (d > 0) ? 0 : h->serial_counter;
|
||||
else
|
||||
ha->start_idx = (uint64_t) sval;
|
||||
ha->delta = (int64_t) d;
|
||||
@ -1350,6 +1351,10 @@ parse_history_common_args (struct MHD_Connection *connection,
|
||||
ha->lp_timeout
|
||||
= GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS,
|
||||
lp_timeout);
|
||||
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
|
||||
"Request for %lld records from %llu\n",
|
||||
(long long) ha->delta,
|
||||
(unsigned long long) ha->start_idx);
|
||||
return GNUNET_OK;
|
||||
}
|
||||
|
||||
@ -1374,7 +1379,8 @@ handle_debit_history (struct TALER_FAKEBANK_Handle *h,
|
||||
char *debit_payto;
|
||||
|
||||
if (GNUNET_OK !=
|
||||
parse_history_common_args (connection,
|
||||
parse_history_common_args (h,
|
||||
connection,
|
||||
&ha))
|
||||
{
|
||||
GNUNET_break (0);
|
||||
@ -1404,9 +1410,26 @@ handle_debit_history (struct TALER_FAKEBANK_Handle *h,
|
||||
else
|
||||
{
|
||||
struct Transaction *t = h->transactions[ha.start_idx % h->ram_limit];
|
||||
bool overflow;
|
||||
uint64_t dir;
|
||||
bool skip = true;
|
||||
|
||||
dir = (0 > ha.delta) ? (h->ram_limit - 1) : 1;
|
||||
overflow = (t->row_id != ha.start_idx);
|
||||
/* If account does not match, linear scan for
|
||||
first matching account. */
|
||||
while ( (! overflow) &&
|
||||
(NULL != t) &&
|
||||
(t->debit_account != acc) )
|
||||
{
|
||||
skip = false;
|
||||
t = h->transactions[(t->row_id + dir) % h->ram_limit];
|
||||
if ( (NULL != t) &&
|
||||
(t->row_id == ha.start_idx) )
|
||||
overflow = true; /* full circle, give up! */
|
||||
}
|
||||
if ( (NULL == t) ||
|
||||
(t->row_id != ha.start_idx) )
|
||||
overflow)
|
||||
{
|
||||
GNUNET_assert (0 ==
|
||||
pthread_mutex_unlock (&h->big_lock));
|
||||
@ -1430,12 +1453,27 @@ handle_debit_history (struct TALER_FAKEBANK_Handle *h,
|
||||
json_decref (history);
|
||||
return MHD_NO;
|
||||
}
|
||||
/* range is exclusive, skip the matching entry */
|
||||
if (0 > ha.delta)
|
||||
pos = t->prev_out;
|
||||
if (skip)
|
||||
{
|
||||
/* range is exclusive, skip the matching entry */
|
||||
if (0 > ha.delta)
|
||||
pos = t->prev_out;
|
||||
else
|
||||
pos = t->next_out;
|
||||
}
|
||||
else
|
||||
pos = t->next_out;
|
||||
{
|
||||
pos = t;
|
||||
}
|
||||
}
|
||||
if (NULL != pos)
|
||||
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
|
||||
"Returning %lld debit transactions starting (inclusive) from %llu\n",
|
||||
(long long) ha.delta,
|
||||
(unsigned long long) pos->row_id);
|
||||
else
|
||||
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
|
||||
"No debit transactions exist after given starting point\n");
|
||||
while ( (0 != ha.delta) &&
|
||||
(NULL != pos) )
|
||||
{
|
||||
@ -1502,7 +1540,8 @@ handle_credit_history (struct TALER_FAKEBANK_Handle *h,
|
||||
char *credit_payto;
|
||||
|
||||
if (GNUNET_OK !=
|
||||
parse_history_common_args (connection,
|
||||
parse_history_common_args (h,
|
||||
connection,
|
||||
&ha))
|
||||
{
|
||||
GNUNET_break (0);
|
||||
@ -1526,9 +1565,26 @@ handle_credit_history (struct TALER_FAKEBANK_Handle *h,
|
||||
else
|
||||
{
|
||||
struct Transaction *t = h->transactions[ha.start_idx % h->ram_limit];
|
||||
bool overflow;
|
||||
uint64_t dir;
|
||||
bool skip = true;
|
||||
|
||||
overflow = (t->row_id != ha.start_idx);
|
||||
dir = (0 > ha.delta) ? (h->ram_limit - 1) : 1;
|
||||
/* If account does not match, linear scan for
|
||||
first matching account. */
|
||||
while ( (! overflow) &&
|
||||
(NULL != t) &&
|
||||
(t->credit_account != acc) )
|
||||
{
|
||||
skip = false;
|
||||
t = h->transactions[(t->row_id + dir) % h->ram_limit];
|
||||
if ( (NULL != t) &&
|
||||
(t->row_id == ha.start_idx) )
|
||||
overflow = true; /* full circle, give up! */
|
||||
}
|
||||
if ( (NULL == t) ||
|
||||
(t->row_id != ha.start_idx) )
|
||||
overflow)
|
||||
{
|
||||
GNUNET_assert (0 ==
|
||||
pthread_mutex_unlock (&h->big_lock));
|
||||
@ -1540,24 +1596,28 @@ handle_credit_history (struct TALER_FAKEBANK_Handle *h,
|
||||
"incoming_transactions",
|
||||
history);
|
||||
}
|
||||
if (t->credit_account != acc)
|
||||
if (skip)
|
||||
{
|
||||
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
|
||||
"Invalid start specified, transaction %llu not with account %s!\n",
|
||||
(unsigned long long) ha.start_idx,
|
||||
account);
|
||||
GNUNET_assert (0 ==
|
||||
pthread_mutex_unlock (&h->big_lock));
|
||||
json_decref (history);
|
||||
GNUNET_free (credit_payto);
|
||||
return MHD_NO;
|
||||
/* range from application is exclusive, skip the
|
||||
matching entry */
|
||||
if (0 > ha.delta)
|
||||
pos = t->prev_in;
|
||||
else
|
||||
pos = t->next_in;
|
||||
}
|
||||
/* range is exclusive, skip the matching entry */
|
||||
if (0 > ha.delta)
|
||||
pos = t->prev_in;
|
||||
else
|
||||
pos = t->next_in;
|
||||
{
|
||||
pos = t;
|
||||
}
|
||||
}
|
||||
if (NULL != pos)
|
||||
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
|
||||
"Returning %lld credit transactions starting (inclusive) from %llu\n",
|
||||
(long long) ha.delta,
|
||||
(unsigned long long) pos->row_id);
|
||||
else
|
||||
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
|
||||
"No credit transactions exist after given starting point\n");
|
||||
while ( (0 != ha.delta) &&
|
||||
(NULL != pos) )
|
||||
{
|
||||
|
@ -548,6 +548,7 @@ history_cb (void *cls,
|
||||
(unsigned long long) serial_id,
|
||||
(unsigned long long) wa->shard_end);
|
||||
wa->latest_row_off = serial_id - 1;
|
||||
wa->delay = false;
|
||||
do_commit (wa);
|
||||
wa->hh = NULL;
|
||||
return GNUNET_SYSERR;
|
||||
@ -629,12 +630,15 @@ find_transfers (void *cls)
|
||||
struct GNUNET_TIME_Relative delay;
|
||||
/* advance to next shard */
|
||||
|
||||
delay.rel_value_us = GNUNET_CRYPTO_random_u64 (
|
||||
GNUNET_CRYPTO_QUALITY_WEAK,
|
||||
4 * GNUNET_TIME_relative_max (
|
||||
wirewatch_idle_sleep_interval,
|
||||
GNUNET_TIME_relative_multiply (shard_delay,
|
||||
max_workers)).rel_value_us);
|
||||
if (0 == max_workers)
|
||||
delay = GNUNET_TIME_UNIT_ZERO;
|
||||
else
|
||||
delay.rel_value_us = GNUNET_CRYPTO_random_u64 (
|
||||
GNUNET_CRYPTO_QUALITY_WEAK,
|
||||
4 * GNUNET_TIME_relative_max (
|
||||
wirewatch_idle_sleep_interval,
|
||||
GNUNET_TIME_relative_multiply (shard_delay,
|
||||
max_workers)).rel_value_us);
|
||||
qs = db_plugin->begin_shard (db_plugin->cls,
|
||||
wa_pos->job_name,
|
||||
delay,
|
||||
|
@ -196,9 +196,10 @@ main (int argc,
|
||||
}
|
||||
|
||||
TALER_TESTING_cleanup_files (config_filename);
|
||||
if (GNUNET_OK != TALER_TESTING_prepare_exchange (config_filename,
|
||||
GNUNET_YES,
|
||||
&ec))
|
||||
if (GNUNET_OK !=
|
||||
TALER_TESTING_prepare_exchange (config_filename,
|
||||
GNUNET_YES,
|
||||
&ec))
|
||||
{
|
||||
TALER_LOG_INFO ("Could not prepare the exchange\n");
|
||||
return 77;
|
||||
@ -210,10 +211,10 @@ main (int argc,
|
||||
&bc))
|
||||
return 77;
|
||||
|
||||
return
|
||||
(GNUNET_OK == TALER_TESTING_setup_with_exchange (&run,
|
||||
NULL,
|
||||
config_filename)) ? 0 : 1;
|
||||
return (GNUNET_OK ==
|
||||
TALER_TESTING_setup_with_exchange (&run,
|
||||
NULL,
|
||||
config_filename)) ? 0 : 1;
|
||||
}
|
||||
|
||||
|
||||
|
@ -66,6 +66,8 @@ wirewatch_run (void *cls,
|
||||
"taler-exchange-wirewatch",
|
||||
"taler-exchange-wirewatch",
|
||||
"-c", ws->config_filename,
|
||||
"-S", "1",
|
||||
"-w", "0",
|
||||
"-t", /* exit when done */
|
||||
NULL);
|
||||
if (NULL == ws->wirewatch_proc)
|
||||
|
Loading…
Reference in New Issue
Block a user