Commit b9a5863e authored by Geoff Simmons's avatar Geoff Simmons

writer returns all free data to the global free lists

parent fa8368ad
......@@ -38,12 +38,6 @@ static char errmsg[BUFSIZ];
#define THRESHOLD 1000
int
RDR_Waiting(void)
{
return 0;
}
void
RDR_Stats(void)
{}
......
......@@ -78,7 +78,7 @@
#define DISPATCH_CONTINUE 0
#define DISPATCH_TERMINATE 7
static unsigned open = 0, occ_hi = 0, len_hi = 0;
static unsigned occ_hi = 0, len_hi = 0;
static unsigned long seen = 0, submitted = 0, len_overflows = 0, no_free_tx = 0,
no_free_rec = 0, no_free_chunk = 0;
......@@ -119,25 +119,17 @@ static unsigned rdr_rec_free = 0;
static txhead_t rdr_tx_freelist = VSTAILQ_HEAD_INITIALIZER(rdr_tx_freelist);
static unsigned rdr_tx_free = 0;
static int waiting = 0;
static char cli_config_filename[BUFSIZ] = "";
static char tx_type_name[VSL_t__MAX];
int
RDR_Waiting(void)
{
return waiting;
}
void
RDR_Stats(void)
{
LOG_Log(LOG_INFO, "Reader (%s): seen=%lu submitted=%lu occ_hi=%u "
"free_tx=%u free_rec=%u free_chunk=%u len_hi=%u len_overflows=%lu",
waiting ? "waiting" : "running", seen, open, submitted, occ_hi,
rdr_tx_free, rdr_rec_free, rdr_chunk_free, len_hi, len_overflows);
LOG_Log(LOG_INFO, "Reader: seen=%lu submitted=%lu occ_hi=%u "
"free_tx=%u free_rec=%u free_chunk=%u len_hi=%u len_overflows=%lu",
seen, submitted, occ_hi, rdr_tx_free, rdr_rec_free, rdr_chunk_free,
len_hi, len_overflows);
}
static inline void
......
......@@ -216,7 +216,6 @@ struct config {
} config;
/* varnishevent.c */
int RDR_Waiting(void);
void RDR_Stats(void);
/* config.c */
......
......@@ -140,14 +140,19 @@ static inline void
wrt_return_freelist(void)
{
DATA_Return_Freetx(&wrt_freetx, wrt_nfree_tx);
LOG_Log(LOG_DEBUG, "Writer: returned %u to free list", wrt_nfree_tx);
LOG_Log(LOG_DEBUG, "Writer: returned %u tx to free list", wrt_nfree_tx);
wrt_nfree_tx = 0;
assert(VSTAILQ_EMPTY(&wrt_freetx));
if (RDR_Waiting()) {
AZ(pthread_mutex_lock(&data_ready_lock));
AZ(pthread_cond_signal(&data_ready_cond));
AZ(pthread_mutex_unlock(&data_ready_lock));
}
DATA_Return_Freeline(&wrt_freerecs, wrt_nfree_recs);
LOG_Log(LOG_DEBUG, "Writer: returned %u records to free list",
wrt_nfree_recs);
wrt_nfree_recs = 0;
assert(VSTAILQ_EMPTY(&wrt_freerecs));
DATA_Return_Freechunk(&wrt_freechunks, wrt_nfree_chunks);
LOG_Log(LOG_DEBUG, "Writer: returned %u chunks to free list",
wrt_nfree_chunks);
wrt_nfree_chunks = 0;
assert(VSTAILQ_EMPTY(&wrt_freechunks));
}
void
......@@ -225,7 +230,8 @@ wrt_write(tx_t *tx)
DATA_Clear_Tx(tx, &wrt_freetx, &wrt_freerecs, &wrt_freechunks,
&wrt_nfree_tx, &wrt_nfree_recs, &wrt_nfree_chunks);
if (global_nfree_tx < (config.max_data >> 1) || RDR_Waiting())
/* XXX: also if the reader is running low */
if (global_nfree_tx < (config.max_data >> 1))
wrt_return_freelist();
}
......@@ -270,7 +276,7 @@ static void
/*
* run is guaranteed to be fresh after the lock
*/
if (run && !RDR_Waiting()) {
if (run) {
waits++;
AZ(pthread_cond_wait(&spscq_ready_cond, &spscq_ready_lock));
}
......
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