|
|
@ -46,6 +46,9 @@ struct pool_stats { |
|
|
|
int users; |
|
|
|
int users; |
|
|
|
int disconnected; |
|
|
|
int disconnected; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int remote_workers; |
|
|
|
|
|
|
|
int remote_users; |
|
|
|
|
|
|
|
|
|
|
|
/* Absolute shares stats */ |
|
|
|
/* Absolute shares stats */ |
|
|
|
int64_t unaccounted_shares; |
|
|
|
int64_t unaccounted_shares; |
|
|
|
int64_t accounted_shares; |
|
|
|
int64_t accounted_shares; |
|
|
@ -7929,11 +7932,11 @@ static void *statsupdate(void *arg) |
|
|
|
double ghs, ghs1, ghs5, ghs15, ghs60, ghs360, ghs1440, ghs10080, per_tdiff; |
|
|
|
double ghs, ghs1, ghs5, ghs15, ghs60, ghs360, ghs1440, ghs10080, per_tdiff; |
|
|
|
char suffix1[16], suffix5[16], suffix15[16], suffix60[16], cdfield[64]; |
|
|
|
char suffix1[16], suffix5[16], suffix15[16], suffix60[16], cdfield[64]; |
|
|
|
char suffix360[16], suffix1440[16], suffix10080[16]; |
|
|
|
char suffix360[16], suffix1440[16], suffix10080[16]; |
|
|
|
|
|
|
|
int remote_users = 0, remote_workers = 0, idle_workers = 0; |
|
|
|
log_entry_t *log_entries = NULL; |
|
|
|
log_entry_t *log_entries = NULL; |
|
|
|
char_entry_t *char_list = NULL; |
|
|
|
char_entry_t *char_list = NULL; |
|
|
|
stratum_instance_t *client; |
|
|
|
stratum_instance_t *client; |
|
|
|
user_instance_t *user; |
|
|
|
user_instance_t *user; |
|
|
|
int idle_workers = 0; |
|
|
|
|
|
|
|
char *fname, *s, *sp; |
|
|
|
char *fname, *s, *sp; |
|
|
|
tv_t now, diff; |
|
|
|
tv_t now, diff; |
|
|
|
ts_t ts_now; |
|
|
|
ts_t ts_now; |
|
|
@ -8079,8 +8082,15 @@ static void *statsupdate(void *arg) |
|
|
|
"shares", user->shares, |
|
|
|
"shares", user->shares, |
|
|
|
"bestshare", user->best_diff); |
|
|
|
"bestshare", user->best_diff); |
|
|
|
|
|
|
|
|
|
|
|
/* Reset the remote_workers count once per minute */ |
|
|
|
if (user->remote_workers) { |
|
|
|
user->remote_workers = 0; |
|
|
|
remote_workers += user->remote_workers; |
|
|
|
|
|
|
|
/* Reset the remote_workers count once per minute */ |
|
|
|
|
|
|
|
user->remote_workers = 0; |
|
|
|
|
|
|
|
/* We check this unlocked but transiently
|
|
|
|
|
|
|
|
* wrong is harmless */ |
|
|
|
|
|
|
|
if (!user->workers) |
|
|
|
|
|
|
|
remote_users++; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ASPRINTF(&fname, "%s/users/%s", ckp->logdir, user->username); |
|
|
|
ASPRINTF(&fname, "%s/users/%s", ckp->logdir, user->username); |
|
|
|
s = json_dumps(val, JSON_NO_UTF8 | JSON_PRESERVE_ORDER | JSON_EOL); |
|
|
|
s = json_dumps(val, JSON_NO_UTF8 | JSON_PRESERVE_ORDER | JSON_EOL); |
|
|
@ -8096,6 +8106,13 @@ static void *statsupdate(void *arg) |
|
|
|
upstream_workers(ckp, user); |
|
|
|
upstream_workers(ckp, user); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (remote_workers) { |
|
|
|
|
|
|
|
mutex_lock(&sdata->stats_lock); |
|
|
|
|
|
|
|
stats->remote_workers = remote_workers; |
|
|
|
|
|
|
|
stats->remote_users = remote_users; |
|
|
|
|
|
|
|
mutex_unlock(&sdata->stats_lock); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* Dump log entries out of instance_lock */ |
|
|
|
/* Dump log entries out of instance_lock */ |
|
|
|
dump_log_entries(&log_entries); |
|
|
|
dump_log_entries(&log_entries); |
|
|
|
notice_msg_entries(&char_list); |
|
|
|
notice_msg_entries(&char_list); |
|
|
@ -8269,6 +8286,12 @@ static void *statsupdate(void *arg) |
|
|
|
decay_time(&stats->dsps10080, unaccounted_diff_shares, 1.875, WEEK); |
|
|
|
decay_time(&stats->dsps10080, unaccounted_diff_shares, 1.875, WEEK); |
|
|
|
mutex_unlock(&sdata->stats_lock); |
|
|
|
mutex_unlock(&sdata->stats_lock); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Reset remote workers every minute since we measure it once
|
|
|
|
|
|
|
|
* every minute only. */ |
|
|
|
|
|
|
|
mutex_lock(&sdata->stats_lock); |
|
|
|
|
|
|
|
stats->remote_workers = stats->remote_users = 0; |
|
|
|
|
|
|
|
mutex_unlock(&sdata->stats_lock); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return NULL; |
|
|
|
return NULL; |
|
|
|