|  |  | @ -181,6 +181,7 @@ struct user_instance { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	double best_diff; /* Best share found by this user */ |  |  |  | 	double best_diff; /* Best share found by this user */ | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	int64_t shares; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	double dsps1; /* Diff shares per second, 1 minute rolling average */ |  |  |  | 	double dsps1; /* Diff shares per second, 1 minute rolling average */ | 
			
		
	
		
		
			
				
					
					|  |  |  | 	double dsps5; /* ... 5 minute ... */ |  |  |  | 	double dsps5; /* ... 5 minute ... */ | 
			
		
	
		
		
			
				
					
					|  |  |  | 	double dsps60;/* etc */ |  |  |  | 	double dsps60;/* etc */ | 
			
		
	
	
		
		
			
				
					|  |  | @ -204,6 +205,7 @@ struct worker_instance { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	worker_instance_t *next; |  |  |  | 	worker_instance_t *next; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	worker_instance_t *prev; |  |  |  | 	worker_instance_t *prev; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	int64_t shares; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	double dsps1; |  |  |  | 	double dsps1; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	double dsps5; |  |  |  | 	double dsps5; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	double dsps60; |  |  |  | 	double dsps60; | 
			
		
	
	
		
		
			
				
					|  |  | @ -2154,6 +2156,7 @@ static void read_userstats(ckpool_t *ckp, user_instance_t *user) | 
			
		
	
		
		
			
				
					
					|  |  |  | 	user->dsps1440 = dsps_from_key(val, "hashrate1d"); |  |  |  | 	user->dsps1440 = dsps_from_key(val, "hashrate1d"); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	user->dsps10080 = dsps_from_key(val, "hashrate7d"); |  |  |  | 	user->dsps10080 = dsps_from_key(val, "hashrate7d"); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	json_get_int64(&user->last_update.tv_sec, val, "lastupdate"); |  |  |  | 	json_get_int64(&user->last_update.tv_sec, val, "lastupdate"); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	json_get_int64(&user->shares, val, "shares"); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	json_get_double(&user->best_diff, val, "bestshare"); |  |  |  | 	json_get_double(&user->best_diff, val, "bestshare"); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	LOGINFO("Successfully read user %s stats %f %f %f %f %f %f", user->username, |  |  |  | 	LOGINFO("Successfully read user %s stats %f %f %f %f %f %f", user->username, | 
			
		
	
		
		
			
				
					
					|  |  |  | 		user->dsps1, user->dsps5, user->dsps60, user->dsps1440, |  |  |  | 		user->dsps1, user->dsps5, user->dsps60, user->dsps1440, | 
			
		
	
	
		
		
			
				
					|  |  | @ -2209,6 +2212,7 @@ static void read_workerstats(ckpool_t *ckp, worker_instance_t *worker) | 
			
		
	
		
		
			
				
					
					|  |  |  | 	worker->dsps10080 = dsps_from_key(val, "hashrate7d"); |  |  |  | 	worker->dsps10080 = dsps_from_key(val, "hashrate7d"); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	json_get_double(&worker->best_diff, val, "bestshare"); |  |  |  | 	json_get_double(&worker->best_diff, val, "bestshare"); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	json_get_int64(&worker->last_update.tv_sec, val, "lastupdate"); |  |  |  | 	json_get_int64(&worker->last_update.tv_sec, val, "lastupdate"); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	json_get_int64(&worker->shares, val, "shares"); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	LOGINFO("Successfully read worker %s stats %f %f %f %f %f", worker->workername, |  |  |  | 	LOGINFO("Successfully read worker %s stats %f %f %f %f %f", worker->workername, | 
			
		
	
		
		
			
				
					
					|  |  |  | 		worker->dsps1, worker->dsps5, worker->dsps60, worker->dsps1440, worker->best_diff); |  |  |  | 		worker->dsps1, worker->dsps5, worker->dsps60, worker->dsps1440, worker->best_diff); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	json_decref(val); |  |  |  | 	json_decref(val); | 
			
		
	
	
		
		
			
				
					|  |  | @ -2676,7 +2680,10 @@ static void add_submit(ckpool_t *ckp, stratum_instance_t *client, const int diff | 
			
		
	
		
		
			
				
					
					|  |  |  | 	mutex_unlock(&sdata->stats_lock); |  |  |  | 	mutex_unlock(&sdata->stats_lock); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	/* Count only accepted and stale rejects in diff calculation. */ |  |  |  | 	/* Count only accepted and stale rejects in diff calculation. */ | 
			
		
	
		
		
			
				
					
					|  |  |  | 	if (!valid && !submit) |  |  |  | 	if (valid) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		worker->shares += diff; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		user->shares += diff; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	} else if (!submit) | 
			
		
	
		
		
			
				
					
					|  |  |  | 		return; |  |  |  | 		return; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	tv_time(&now_t); |  |  |  | 	tv_time(&now_t); | 
			
		
	
	
		
		
			
				
					|  |  | @ -4168,13 +4175,14 @@ static void *statsupdate(void *arg) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 				copy_tv(&worker->last_update, &now); |  |  |  | 				copy_tv(&worker->last_update, &now); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 				JSON_CPACK(val, "{ss,ss,ss,ss,ss,si,sf}", |  |  |  | 				JSON_CPACK(val, "{ss,ss,ss,ss,ss,si,sI,sf}", | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 						"hashrate1m", suffix1, |  |  |  | 						"hashrate1m", suffix1, | 
			
		
	
		
		
			
				
					
					|  |  |  | 						"hashrate5m", suffix5, |  |  |  | 						"hashrate5m", suffix5, | 
			
		
	
		
		
			
				
					
					|  |  |  | 						"hashrate1hr", suffix60, |  |  |  | 						"hashrate1hr", suffix60, | 
			
		
	
		
		
			
				
					
					|  |  |  | 						"hashrate1d", suffix1440, |  |  |  | 						"hashrate1d", suffix1440, | 
			
		
	
		
		
			
				
					
					|  |  |  | 						"hashrate7d", suffix10080, |  |  |  | 						"hashrate7d", suffix10080, | 
			
		
	
		
		
			
				
					
					|  |  |  | 						"lastupdate", now.tv_sec, |  |  |  | 						"lastupdate", now.tv_sec, | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 						"shares", worker->shares, | 
			
		
	
		
		
			
				
					
					|  |  |  | 						"bestshare", worker->best_diff); |  |  |  | 						"bestshare", worker->best_diff); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 				ASPRINTF(&fname, "%s/workers/%s", ckp->logdir, worker->workername); |  |  |  | 				ASPRINTF(&fname, "%s/workers/%s", ckp->logdir, worker->workername); | 
			
		
	
	
		
		
			
				
					|  |  | @ -4210,7 +4218,7 @@ static void *statsupdate(void *arg) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 			copy_tv(&user->last_update, &now); |  |  |  | 			copy_tv(&user->last_update, &now); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 			JSON_CPACK(val, "{ss,ss,ss,ss,ss,si,si,sf}", |  |  |  | 			JSON_CPACK(val, "{ss,ss,ss,ss,ss,si,si,sI,sf}", | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 					"hashrate1m", suffix1, |  |  |  | 					"hashrate1m", suffix1, | 
			
		
	
		
		
			
				
					
					|  |  |  | 					"hashrate5m", suffix5, |  |  |  | 					"hashrate5m", suffix5, | 
			
		
	
		
		
			
				
					
					|  |  |  | 					"hashrate1hr", suffix60, |  |  |  | 					"hashrate1hr", suffix60, | 
			
		
	
	
		
		
			
				
					|  |  | @ -4218,6 +4226,7 @@ static void *statsupdate(void *arg) | 
			
		
	
		
		
			
				
					
					|  |  |  | 					"hashrate7d", suffix10080, |  |  |  | 					"hashrate7d", suffix10080, | 
			
		
	
		
		
			
				
					
					|  |  |  | 					"lastupdate", now.tv_sec, |  |  |  | 					"lastupdate", now.tv_sec, | 
			
		
	
		
		
			
				
					
					|  |  |  | 					"workers", user->workers, |  |  |  | 					"workers", user->workers, | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 					"shares", user->shares, | 
			
		
	
		
		
			
				
					
					|  |  |  | 					"bestshare", user->best_diff); |  |  |  | 					"bestshare", user->best_diff); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 			ASPRINTF(&fname, "%s/users/%s", ckp->logdir, user->username); |  |  |  | 			ASPRINTF(&fname, "%s/users/%s", ckp->logdir, user->username); | 
			
		
	
	
		
		
			
				
					|  |  | 
 |