|
|
@ -45,12 +45,16 @@ struct notify_instance { |
|
|
|
|
|
|
|
|
|
|
|
typedef struct notify_instance notify_instance_t; |
|
|
|
typedef struct notify_instance notify_instance_t; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct proxy_instance proxy_instance_t; |
|
|
|
|
|
|
|
|
|
|
|
struct share_msg { |
|
|
|
struct share_msg { |
|
|
|
UT_hash_handle hh; |
|
|
|
UT_hash_handle hh; |
|
|
|
int id; // Our own id for submitting upstream
|
|
|
|
int id; // Our own id for submitting upstream
|
|
|
|
|
|
|
|
|
|
|
|
int client_id; |
|
|
|
int client_id; |
|
|
|
time_t submit_time; |
|
|
|
time_t submit_time; |
|
|
|
|
|
|
|
proxy_instance_t *proxy; |
|
|
|
|
|
|
|
double diff; |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
typedef struct share_msg share_msg_t; |
|
|
|
typedef struct share_msg share_msg_t; |
|
|
@ -72,8 +76,6 @@ struct pass_msg { |
|
|
|
|
|
|
|
|
|
|
|
typedef struct pass_msg pass_msg_t; |
|
|
|
typedef struct pass_msg pass_msg_t; |
|
|
|
|
|
|
|
|
|
|
|
typedef struct proxy_instance proxy_instance_t; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Per proxied pool instance data */ |
|
|
|
/* Per proxied pool instance data */ |
|
|
|
struct proxy_instance { |
|
|
|
struct proxy_instance { |
|
|
|
UT_hash_handle hh; /* Proxy list */ |
|
|
|
UT_hash_handle hh; /* Proxy list */ |
|
|
@ -100,6 +102,10 @@ struct proxy_instance { |
|
|
|
tv_t last_message; |
|
|
|
tv_t last_message; |
|
|
|
|
|
|
|
|
|
|
|
double diff; |
|
|
|
double diff; |
|
|
|
|
|
|
|
double diff_accepted; |
|
|
|
|
|
|
|
double diff_rejected; |
|
|
|
|
|
|
|
double total_accepted; /* Used only by parent proxy structures */ |
|
|
|
|
|
|
|
double total_rejected; /* "" */ |
|
|
|
tv_t last_share; |
|
|
|
tv_t last_share; |
|
|
|
|
|
|
|
|
|
|
|
bool no_params; /* Doesn't want any parameters on subscribe */ |
|
|
|
bool no_params; /* Doesn't want any parameters on subscribe */ |
|
|
@ -1418,6 +1424,8 @@ static void submit_share(gdata_t *gdata, json_t *val) |
|
|
|
share = ckzalloc(sizeof(share_msg_t)); |
|
|
|
share = ckzalloc(sizeof(share_msg_t)); |
|
|
|
share->submit_time = time(NULL); |
|
|
|
share->submit_time = time(NULL); |
|
|
|
share->client_id = client_id; |
|
|
|
share->client_id = client_id; |
|
|
|
|
|
|
|
share->proxy = proxi; |
|
|
|
|
|
|
|
share->diff = proxi->diff; |
|
|
|
msg->json_msg = val; |
|
|
|
msg->json_msg = val; |
|
|
|
|
|
|
|
|
|
|
|
/* Add new share entry to the share hashtable */ |
|
|
|
/* Add new share entry to the share hashtable */ |
|
|
@ -1449,25 +1457,42 @@ static void clear_notify(notify_instance_t *ni) |
|
|
|
free(ni); |
|
|
|
free(ni); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* FIXME: Return something useful to the stratifier based on this result? */ |
|
|
|
static void account_shares(proxy_instance_t *proxy, const double diff, const bool result) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
proxy_instance_t *parent = proxy->parent; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mutex_lock(&parent->proxy_lock); |
|
|
|
|
|
|
|
if (result) { |
|
|
|
|
|
|
|
proxy->diff_accepted += diff; |
|
|
|
|
|
|
|
parent->total_accepted += diff; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
proxy->diff_rejected += diff; |
|
|
|
|
|
|
|
parent->total_rejected += diff; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
mutex_unlock(&parent->proxy_lock); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static bool parse_share(gdata_t *gdata, proxy_instance_t *proxi, const char *buf) |
|
|
|
static bool parse_share(gdata_t *gdata, proxy_instance_t *proxi, const char *buf) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
bool ret = false, result = false; |
|
|
|
json_t *val = NULL, *idval; |
|
|
|
json_t *val = NULL, *idval; |
|
|
|
share_msg_t *share; |
|
|
|
share_msg_t *share; |
|
|
|
bool ret = false; |
|
|
|
|
|
|
|
int64_t id; |
|
|
|
int64_t id; |
|
|
|
|
|
|
|
|
|
|
|
val = json_loads(buf, 0, NULL); |
|
|
|
val = json_loads(buf, 0, NULL); |
|
|
|
if (!val) { |
|
|
|
if (unlikely(!val)) { |
|
|
|
LOGINFO("Failed to parse json msg: %s", buf); |
|
|
|
LOGINFO("Failed to parse upstream json msg: %s", buf); |
|
|
|
goto out; |
|
|
|
goto out; |
|
|
|
} |
|
|
|
} |
|
|
|
idval = json_object_get(val, "id"); |
|
|
|
idval = json_object_get(val, "id"); |
|
|
|
if (!idval) { |
|
|
|
if (unlikely(!idval)) { |
|
|
|
LOGINFO("Failed to find id in json msg: %s", buf); |
|
|
|
LOGINFO("Failed to find id in upstream json msg: %s", buf); |
|
|
|
goto out; |
|
|
|
goto out; |
|
|
|
} |
|
|
|
} |
|
|
|
id = json_integer_value(idval); |
|
|
|
id = json_integer_value(idval); |
|
|
|
|
|
|
|
if (unlikely(!json_get_bool(&result, val, "result"))) { |
|
|
|
|
|
|
|
LOGINFO("Failed to find result in upstream json msg: %s", buf); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
mutex_lock(&gdata->share_lock); |
|
|
|
mutex_lock(&gdata->share_lock); |
|
|
|
HASH_FIND_I64(gdata->shares, &id, share); |
|
|
|
HASH_FIND_I64(gdata->shares, &id, share); |
|
|
@ -1481,8 +1506,12 @@ static bool parse_share(gdata_t *gdata, proxy_instance_t *proxi, const char *buf |
|
|
|
if (!share) { |
|
|
|
if (!share) { |
|
|
|
LOGINFO("Proxy %d:%d failed to find matching share to result: %s", |
|
|
|
LOGINFO("Proxy %d:%d failed to find matching share to result: %s", |
|
|
|
proxi->id, proxi->subid, buf); |
|
|
|
proxi->id, proxi->subid, buf); |
|
|
|
|
|
|
|
/* We don't know what diff these shares are so assume the
|
|
|
|
|
|
|
|
* current proxy diff. */ |
|
|
|
|
|
|
|
account_shares(share->proxy, share->proxy->diff, result); |
|
|
|
goto out; |
|
|
|
goto out; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
account_shares(share->proxy, share->diff, result); |
|
|
|
LOGINFO("Proxy %d:%d share result %s from client %d", proxi->id, proxi->subid, |
|
|
|
LOGINFO("Proxy %d:%d share result %s from client %d", proxi->id, proxi->subid, |
|
|
|
buf, share->client_id); |
|
|
|
buf, share->client_id); |
|
|
|
free(share); |
|
|
|
free(share); |
|
|
|