|
|
|
@ -2814,7 +2814,7 @@ static inline bool from_existing_block(struct work *work)
@@ -2814,7 +2814,7 @@ static inline bool from_existing_block(struct work *work)
|
|
|
|
|
|
|
|
|
|
static int block_sort(struct block *blocka, struct block *blockb) |
|
|
|
|
{ |
|
|
|
|
return blockb->block_no - blocka->block_no; |
|
|
|
|
return blocka->block_no - blockb->block_no; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void test_work_current(struct work *work) |
|
|
|
@ -2834,29 +2834,29 @@ static void test_work_current(struct work *work)
@@ -2834,29 +2834,29 @@ static void test_work_current(struct work *work)
|
|
|
|
|
* new block and set the current block details to this one */ |
|
|
|
|
if (!block_exists(hexstr)) { |
|
|
|
|
struct block *s = calloc(sizeof(struct block), 1); |
|
|
|
|
int deleted_block = 0; |
|
|
|
|
|
|
|
|
|
if (unlikely(!s)) |
|
|
|
|
quit (1, "test_work_current OOM"); |
|
|
|
|
strcpy(s->hash, hexstr); |
|
|
|
|
s->block_no = new_blocks++; |
|
|
|
|
wr_lock(&blk_lock); |
|
|
|
|
/* Only keep the last 6 blocks in memory since work from blocks
|
|
|
|
|
* before this is virtually impossible and we want to prevent |
|
|
|
|
* memory usage from continually rising */ |
|
|
|
|
if (HASH_COUNT(blocks) > 5) { |
|
|
|
|
struct block *blocka, *blockb; |
|
|
|
|
int count = 0; |
|
|
|
|
/* Only keep the last hour's worth of blocks in memory since
|
|
|
|
|
* work from blocks before this is virtually impossible and we |
|
|
|
|
* want to prevent memory usage from continually rising */ |
|
|
|
|
if (HASH_COUNT(blocks) > 6) { |
|
|
|
|
struct block *oldblock; |
|
|
|
|
|
|
|
|
|
HASH_SORT(blocks, block_sort); |
|
|
|
|
HASH_ITER(hh, blocks, blocka, blockb) { |
|
|
|
|
if (count++ < 6) |
|
|
|
|
continue; |
|
|
|
|
HASH_DEL(blocks, blocka); |
|
|
|
|
free(blocka); |
|
|
|
|
} |
|
|
|
|
oldblock = blocks; |
|
|
|
|
deleted_block = oldblock->block_no; |
|
|
|
|
HASH_DEL(blocks, oldblock); |
|
|
|
|
free(oldblock); |
|
|
|
|
} |
|
|
|
|
HASH_ADD_STR(blocks, hash, s); |
|
|
|
|
wr_unlock(&blk_lock); |
|
|
|
|
if (deleted_block) |
|
|
|
|
applog(LOG_DEBUG, "Deleted block %d from database", deleted_block); |
|
|
|
|
set_curblock(hexstr, work->data); |
|
|
|
|
if (unlikely(new_blocks == 1)) |
|
|
|
|
goto out_free; |
|
|
|
|