Browse Source

Bugfix: SSM: Never send mining.notify for stale work2d

Luke Dashjr 10 years ago
parent
commit
85bbceab05
1 changed files with 20 additions and 5 deletions
  1. 20 5
      driver-stratum.c

+ 20 - 5
driver-stratum.c

@@ -120,6 +120,7 @@ static
 bool stratumsrv_update_notify_str(struct pool * const pool)
 bool stratumsrv_update_notify_str(struct pool * const pool)
 {
 {
 	const bool clean = _ssm_cur_job_work.pool ? stale_work(&_ssm_cur_job_work, true) : true;
 	const bool clean = _ssm_cur_job_work.pool ? stale_work(&_ssm_cur_job_work, true) : true;
+	struct timeval tv_now;
 	
 	
 	cg_rlock(&pool->data_lock);
 	cg_rlock(&pool->data_lock);
 	
 	
@@ -133,6 +134,23 @@ fail:
 		return false;
 		return false;
 	}
 	}
 	
 	
+	timer_set_now(&tv_now);
+	
+	{
+		struct work work;
+		work2d_gen_dummy_work(&work, &pool->swork, &tv_now, NULL, 0);
+		
+		const bool is_stale = stale_work(&work, false);
+		
+		clean_work(&work);
+		
+		if (is_stale) {
+			cg_runlock(&pool->data_lock);
+			applog(LOG_DEBUG, "SSM: Ignoring work update notification while pool %d has stale swork", pool->pool_no);
+			return false;
+		}
+	}
+	
 	struct stratumsrv_conn *conn;
 	struct stratumsrv_conn *conn;
 	const struct stratum_work * const swork = &pool->swork;
 	const struct stratum_work * const swork = &pool->swork;
 	const int n2size = pool->swork.n2size;
 	const int n2size = pool->swork.n2size;
@@ -187,7 +205,7 @@ fail:
 	*ssj = (struct stratumsrv_job){
 	*ssj = (struct stratumsrv_job){
 		.my_job_id = strdup(my_job_id),
 		.my_job_id = strdup(my_job_id),
 	};
 	};
-	timer_set_now(&ssj->tv_prepared);
+	ssj->tv_prepared = tv_now;
 	stratum_work_cpy(&ssj->swork, swork);
 	stratum_work_cpy(&ssj->swork, swork);
 	
 	
 	cg_runlock(&pool->data_lock);
 	cg_runlock(&pool->data_lock);
@@ -366,10 +384,7 @@ void _stratumsrv_update_notify(evutil_socket_t fd, short what, __maybe_unused vo
 		applog(LOG_DEBUG, "SSM: Update triggered by notifier");
 		applog(LOG_DEBUG, "SSM: Update triggered by notifier");
 	}
 	}
 	
 	
-	if (!stratumsrv_update_notify_str(pool))
-	{
-		applog(LOG_WARNING, "SSM: Failed to subdivide upstream stratum notify!");
-	}
+	stratumsrv_update_notify_str(pool);
 	
 	
 	struct timeval tv_scantime = {
 	struct timeval tv_scantime = {
 		.tv_sec = opt_scantime,
 		.tv_sec = opt_scantime,