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