Retrieve a new block template if more than 30 seconds has elapsed since the last one to keep the data current and test the pool is still alive.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
diff --git a/cgminer.c b/cgminer.c
index 2571613..3cbf306 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -1622,6 +1622,7 @@ static bool work_decode(struct pool *pool, struct work *work, json_t *val)
if (pool->has_gbt) {
if (unlikely(!gbt_decode(pool, res_val)))
goto out;
+ gettimeofday(&pool->tv_template, NULL);
work->gbt = true;
ret = true;
goto out;
@@ -4713,7 +4714,10 @@ static bool pool_active(struct pool *pool, bool pinging)
CURL *curl;
int rolltime;
- applog(LOG_INFO, "Testing pool %s", pool->rpc_url);
+ if (pool->has_gbt)
+ applog(LOG_DEBUG, "Retrieving block template from pool %s", pool->rpc_url);
+ else
+ applog(LOG_INFO, "Testing pool %s", pool->rpc_url);
/* This is the central point we activate stratum when we can */
retry_stratum:
@@ -5829,8 +5833,17 @@ static void *watchpool_thread(void __maybe_unused *userdata)
if (pool->enabled == POOL_DISABLED || pool->has_stratum)
continue;
+ /* Apart from longpollid comms, we retrieve a fresh
+ * template if more than 30 seconds has elapsed since
+ * the last one to keep the data current and as a test
+ * for when the pool dies. */
+ if (!pool->idle && pool->has_gbt && now.tv_sec - pool->tv_template.tv_sec > 60) {
+ if (!pool_active(pool, true))
+ pool_died(pool);
+ }
+
/* Test pool is idle once every minute */
- if (pool->idle && now.tv_sec - pool->tv_idle.tv_sec > 60) {
+ if (pool->idle && now.tv_sec - pool->tv_idle.tv_sec > 30) {
gettimeofday(&pool->tv_idle, NULL);
if (pool_active(pool, true) && pool_tclear(pool, &pool->idle))
pool_resus(pool);
diff --git a/miner.h b/miner.h
index ac4abf8..72bff3e 100644
--- a/miner.h
+++ b/miner.h
@@ -920,6 +920,7 @@ struct pool {
unsigned char *txn_hashes;
int gbt_txns;
int coinbase_len;
+ struct timeval tv_template;
};
#define GETWORK_MODE_TESTPOOL 'T'