Commit a5daf25c authored by Geoff Simmons's avatar Geoff Simmons

trackrdrd: add DATA_Reset(), prevents spurious re-use of dataentry fields

parent b51d5512
...@@ -98,6 +98,21 @@ DATA_Init(void) ...@@ -98,6 +98,21 @@ DATA_Init(void)
return(0); return(0);
} }
void
DATA_Reset(dataentry *entry)
{
CHECK_OBJ_NOTNULL(entry, DATA_MAGIC);
entry->state = DATA_EMPTY;
entry->end = 0;
*entry->data = '\0';
entry->keylen = 0;
*entry->key = '\0';
entry->hasdata = false;
entry->incomplete = false;
entry->xid = 0;
entry->tid = 0;
}
/* /*
* take all free entries from the datatable for lockless * take all free entries from the datatable for lockless
* allocation * allocation
......
...@@ -96,9 +96,10 @@ static char ...@@ -96,9 +96,10 @@ static char
printf("... testing worker initialization\n"); printf("... testing worker initialization\n");
config.maxopen_scale = 10; config.maxopen_scale = DEF_MAXOPEN_SCALE;
config.maxdone = 1024; config.maxdone = DEF_MAXDONE;
config.maxdata = 1024; config.maxdata = DEF_MAXDATA;
config.maxkeylen = DEF_MAXKEYLEN;
config.nworkers = NWORKERS; config.nworkers = NWORKERS;
strcpy(config.mq_config_file, MQ_CONFIG); strcpy(config.mq_config_file, MQ_CONFIG);
...@@ -145,7 +146,7 @@ static const char ...@@ -145,7 +146,7 @@ static const char
sprintf(errmsg, "%d of %d worker threads running", wrk_running, NWORKERS); sprintf(errmsg, "%d of %d worker threads running", wrk_running, NWORKERS);
mu_assert(errmsg, wrk_running == NWORKERS); mu_assert(errmsg, wrk_running == NWORKERS);
for (int i = 0; i < 1024; i++) { for (int i = 0; i < (1 << DEF_MAXOPEN_SCALE); i++) {
entry = &dtbl.entry[i]; entry = &dtbl.entry[i];
CHECK_OBJ_NOTNULL(entry, DATA_MAGIC); CHECK_OBJ_NOTNULL(entry, DATA_MAGIC);
entry->xid = xid; entry->xid = xid;
...@@ -161,6 +162,24 @@ static const char ...@@ -161,6 +162,24 @@ static const char
AZ(mqf.global_shutdown()); AZ(mqf.global_shutdown());
LOG_Close(); LOG_Close();
/*
* Verify DATA_Reset() by checking that all data entry fields are in
* empty states after worker threads are shut down.
*/
for (int i = 0; i < (1 << DEF_MAXOPEN_SCALE); i++) {
entry = &dtbl.entry[i];
CHECK_OBJ_NOTNULL(entry, DATA_MAGIC);
MASSERT(entry->state == DATA_EMPTY);
MAZ(entry->end);
MAZ(*entry->data);
MAZ(entry->keylen);
MAZ(*entry->key);
MASSERT(entry->hasdata == false);
MASSERT(entry->incomplete == false);
MAZ(entry->xid);
MAZ(entry->tid);
}
return NULL; return NULL;
} }
......
...@@ -192,6 +192,7 @@ typedef struct datatable_s datatable; ...@@ -192,6 +192,7 @@ typedef struct datatable_s datatable;
datatable dtbl; datatable dtbl;
int DATA_Init(void); int DATA_Init(void);
void DATA_Reset(dataentry *entry);
void DATA_Take_Freelist(struct freehead_s *dst); void DATA_Take_Freelist(struct freehead_s *dst);
void DATA_Return_Freelist(struct freehead_s *returned, unsigned nreturned); void DATA_Return_Freelist(struct freehead_s *returned, unsigned nreturned);
void DATA_Dump1(dataentry *entry, int i); void DATA_Dump1(dataentry *entry, int i);
......
...@@ -182,7 +182,7 @@ wrk_send(void **mq_worker, dataentry *entry, worker_data_t *wrk) ...@@ -182,7 +182,7 @@ wrk_send(void **mq_worker, dataentry *entry, worker_data_t *wrk)
LOG_Log(LOG_DEBUG, "Worker %d: Successfully sent data [%.*s]", wrk->id, LOG_Log(LOG_DEBUG, "Worker %d: Successfully sent data [%.*s]", wrk->id,
entry->end, entry->data); entry->end, entry->data);
} }
entry->state = DATA_EMPTY; DATA_Reset(entry);
VSTAILQ_INSERT_TAIL(&wrk->wrk_freelist, entry, freelist); VSTAILQ_INSERT_TAIL(&wrk->wrk_freelist, entry, freelist);
wrk->wrk_nfree++; wrk->wrk_nfree++;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment