Browse Source

Update stratifier to use integers for proxy IDs again

master
Con Kolivas 10 years ago
parent
commit
d590869963
  1. 4
      src/generator.c
  2. 104
      src/stratifier.c

4
src/generator.c

@ -1290,12 +1290,12 @@ out:
return ret;
}
static proxy_instance_t *proxy_by_id(gdata_t *gdata, const int64_t id)
static proxy_instance_t *proxy_by_id(gdata_t *gdata, const int id)
{
proxy_instance_t *proxi;
mutex_lock(&gdata->lock);
HASH_FIND_I64(gdata->proxies, &id, proxi);
HASH_FIND_INT(gdata->proxies, &id, proxi);
mutex_unlock(&gdata->lock);
return proxi;

104
src/stratifier.c

@ -278,7 +278,7 @@ struct stratum_instance {
sdata_t *sdata; /* Which sdata this client is bound to */
proxy_t *proxy; /* Proxy this is bound to in proxy mode */
int64_t proxyid; /* Which proxy id */
int proxyid; /* Which proxy id */
int subproxyid; /* Which subproxy */
};
@ -295,8 +295,7 @@ struct proxy_base {
UT_hash_handle sh; /* For subproxy hashlist */
proxy_t *next; /* For retired subproxies */
proxy_t *prev;
int64_t id;
int low_id;
int id;
int subid;
double diff;
@ -1079,20 +1078,19 @@ static sdata_t *duplicate_sdata(const sdata_t *sdata)
return dsdata;
}
static proxy_t *__generate_proxy(sdata_t *sdata, const int64_t id)
static proxy_t *__generate_proxy(sdata_t *sdata, const int id)
{
proxy_t *proxy = ckzalloc(sizeof(proxy_t));
proxy->parent = proxy;
proxy->id = id;
proxy->low_id = id & 0xFFFFFFFF;
proxy->sdata = duplicate_sdata(sdata);
proxy->sdata->subproxy = proxy;
proxy->sdata->verbose = true;
/* subid == 0 on parent proxy */
HASH_ADD(sh, proxy->subproxies, subid, sizeof(int), proxy);
proxy->subproxy_count++;
HASH_ADD_I64(sdata->proxies, id, proxy);
HASH_ADD_INT(sdata->proxies, id, proxy);
sdata->proxy_count++;
return proxy;
}
@ -1103,7 +1101,6 @@ static proxy_t *__generate_subproxy(sdata_t *sdata, proxy_t *proxy, const int su
subproxy->parent = proxy;
subproxy->id = proxy->id;
subproxy->low_id = proxy->low_id;
subproxy->subid = subid;
HASH_ADD(sh, proxy->subproxies, subid, sizeof(int), subproxy);
proxy->subproxy_count++;
@ -1112,22 +1109,22 @@ static proxy_t *__generate_subproxy(sdata_t *sdata, proxy_t *proxy, const int su
return subproxy;
}
static proxy_t *__existing_proxy(const sdata_t *sdata, const int64_t id)
static proxy_t *__existing_proxy(const sdata_t *sdata, const int id)
{
proxy_t *proxy;
HASH_FIND_I64(sdata->proxies, &id, proxy);
HASH_FIND_INT(sdata->proxies, &id, proxy);
return proxy;
}
/* Find proxy by id number, generate one if none exist yet by that id */
static proxy_t *__proxy_by_id(sdata_t *sdata, const int64_t id)
static proxy_t *__proxy_by_id(sdata_t *sdata, const int id)
{
proxy_t *proxy = __existing_proxy(sdata, id);
if (unlikely(!proxy)) {
proxy = __generate_proxy(sdata, id);
LOGNOTICE("Stratifier added new proxy %ld", id);
LOGNOTICE("Stratifier added new proxy %d", id);
}
return proxy;
@ -1147,12 +1144,12 @@ static proxy_t *__subproxy_by_id(sdata_t *sdata, proxy_t *proxy, const int subid
if (!subproxy) {
subproxy = __generate_subproxy(sdata, proxy, subid);
LOGINFO("Stratifier added new subproxy %ld:%d", proxy->id, subid);
LOGINFO("Stratifier added new subproxy %d:%d", proxy->id, subid);
}
return subproxy;
}
static proxy_t *subproxy_by_id(sdata_t *sdata, const int64_t id, const int subid)
static proxy_t *subproxy_by_id(sdata_t *sdata, const int id, const int subid)
{
proxy_t *proxy, *subproxy;
@ -1164,7 +1161,7 @@ static proxy_t *subproxy_by_id(sdata_t *sdata, const int64_t id, const int subid
return subproxy;
}
static proxy_t *existing_subproxy(sdata_t *sdata, const int64_t id, const int subid)
static proxy_t *existing_subproxy(sdata_t *sdata, const int id, const int subid)
{
proxy_t *proxy, *subproxy = NULL;
@ -1241,7 +1238,7 @@ static void reconnect_clients(sdata_t *sdata)
ck_runlock(&sdata->instance_lock);
if (reconnects) {
LOGNOTICE("%d clients flagged for reconnect to proxy %ld", reconnects,
LOGNOTICE("%d clients flagged for reconnect to proxy %d", reconnects,
proxy->id);
}
if (headroom < 0)
@ -1261,7 +1258,7 @@ static proxy_t *current_proxy(sdata_t *sdata)
}
#endif
static void dead_proxyid(sdata_t *sdata, const int64_t id, const int subid)
static void dead_proxyid(sdata_t *sdata, const int id, const int subid)
{
stratum_instance_t *client, *tmp;
int reconnects = 0, hard = 0;
@ -1271,7 +1268,7 @@ static void dead_proxyid(sdata_t *sdata, const int64_t id, const int subid)
proxy = existing_subproxy(sdata, id, subid);
if (proxy)
proxy->dead = true;
LOGINFO("Stratifier dropping clients from proxy %ld:%d", id, subid);
LOGINFO("Stratifier dropping clients from proxy %d:%d", id, subid);
headroom = current_headroom(sdata, &proxy);
ck_rlock(&sdata->instance_lock);
@ -1288,7 +1285,7 @@ static void dead_proxyid(sdata_t *sdata, const int64_t id, const int subid)
ck_runlock(&sdata->instance_lock);
if (reconnects) {
LOGNOTICE("%d clients flagged to reconnect from dead proxy %ld:%d", reconnects,
LOGNOTICE("%d clients flagged to reconnect from dead proxy %d:%d", reconnects,
id, subid);
}
if (headroom < 0)
@ -1299,9 +1296,8 @@ static void update_subscribe(ckpool_t *ckp, const char *cmd)
{
sdata_t *sdata = ckp->data, *dsdata;
proxy_t *proxy, *old = NULL;
int id = 0, subid = 0;
const char *buf;
int64_t id = 0;
int subid = 0;
json_t *val;
if (unlikely(strlen(cmd) < 11)) {
@ -1315,7 +1311,7 @@ static void update_subscribe(ckpool_t *ckp, const char *cmd)
LOGWARNING("Failed to json decode subscribe response in update_subscribe %s", buf);
return;
}
if (unlikely(!json_get_int64(&id, val, "proxy"))) {
if (unlikely(!json_get_int(&id, val, "proxy"))) {
LOGWARNING("Failed to json decode proxy value in update_subscribe %s", buf);
return;
}
@ -1325,9 +1321,9 @@ static void update_subscribe(ckpool_t *ckp, const char *cmd)
}
if (!subid)
LOGNOTICE("Got updated subscribe for proxy %ld", id);
LOGNOTICE("Got updated subscribe for proxy %d", id);
else
LOGINFO("Got updated subscribe for proxy %ld:%d", id, subid);
LOGINFO("Got updated subscribe for proxy %d:%d", id, subid);
/* Is this a replacement for an existing proxy id? */
old = existing_subproxy(sdata, id, subid);
@ -1363,15 +1359,15 @@ static void update_subscribe(ckpool_t *ckp, const char *cmd)
/* Is this a replacement proxy for the current one */
mutex_lock(&sdata->proxy_lock);
if (sdata->proxy && sdata->proxy->low_id == proxy->low_id && !proxy->subid)
if (sdata->proxy && sdata->proxy->id == proxy->id && !proxy->subid)
sdata->proxy = proxy;
mutex_unlock(&sdata->proxy_lock);
if (subid) {
LOGINFO("Upstream pool %ld:%d extranonce2 length %d, max proxy clients %"PRId64,
LOGINFO("Upstream pool %d:%d extranonce2 length %d, max proxy clients %"PRId64,
id, subid, proxy->nonce2len, proxy->max_clients);
} else {
LOGNOTICE("Upstream pool %ld extranonce2 length %d, max proxy clients %"PRId64,
LOGNOTICE("Upstream pool %d extranonce2 length %d, max proxy clients %"PRId64,
id, proxy->nonce2len, proxy->max_clients);
}
json_decref(val);
@ -1382,11 +1378,10 @@ static void update_notify(ckpool_t *ckp, const char *cmd)
sdata_t *sdata = ckp->data, *dsdata;
bool new_block = false, clean;
proxy_t *proxy, *current;
int i, id = 0, subid = 0;
int64_t current_id;
int i, subid = 0;
char header[228];
const char *buf;
int64_t id = 0;
workbase_t *wb;
json_t *val;
@ -1402,17 +1397,17 @@ static void update_notify(ckpool_t *ckp, const char *cmd)
LOGWARNING("Failed to json decode in update_notify");
return;
}
json_get_int64(&id, val, "proxy");
json_get_int(&id, val, "proxy");
json_get_int(&subid, val, "subproxy");
proxy = existing_subproxy(sdata, id, subid);
if (unlikely(!proxy || !proxy->subscribed)) {
LOGINFO("No valid proxy %ld:%d subscription to update notify yet", id, subid);
LOGINFO("No valid proxy %d:%d subscription to update notify yet", id, subid);
goto out;
}
if (!subid)
LOGNOTICE("Got updated notify for proxy %ld", id);
LOGNOTICE("Got updated notify for proxy %d", id);
else
LOGINFO("Got updated notify for proxy %ld:%d", id, subid);
LOGINFO("Got updated notify for proxy %d:%d", id, subid);
wb = ckzalloc(sizeof(workbase_t));
wb->ckp = ckp;
@ -1466,9 +1461,9 @@ static void update_notify(ckpool_t *ckp, const char *cmd)
add_base(ckp, dsdata, wb, &new_block);
if (new_block) {
if (subid)
LOGINFO("Block hash on proxy %ld:%d changed to %s", id, subid, dsdata->lastswaphash);
LOGINFO("Block hash on proxy %d:%d changed to %s", id, subid, dsdata->lastswaphash);
else
LOGNOTICE("Block hash on proxy %ld changed to %s", id, dsdata->lastswaphash);
LOGNOTICE("Block hash on proxy %d changed to %s", id, dsdata->lastswaphash);
}
mutex_lock(&sdata->proxy_lock);
@ -1481,7 +1476,7 @@ static void update_notify(ckpool_t *ckp, const char *cmd)
if (!proxy->subid && proxy->id == current_id)
reconnect_clients(sdata);
clean |= new_block;
LOGINFO("Proxy %ld:%d broadcast updated stratum notify with%s clean", id,
LOGINFO("Proxy %d:%d broadcast updated stratum notify with%s clean", id,
subid, clean ? "" : "out");
stratum_broadcast_update(dsdata, wb, clean);
out:
@ -1495,10 +1490,9 @@ static void update_diff(ckpool_t *ckp, const char *cmd)
sdata_t *sdata = ckp->data, *dsdata;
stratum_instance_t *client, *tmp;
double old_diff, diff;
int id = 0, subid = 0;
const char *buf;
int64_t id = 0;
proxy_t *proxy;
int subid = 0;
json_t *val;
if (unlikely(strlen(cmd) < 6)) {
@ -1513,15 +1507,15 @@ static void update_diff(ckpool_t *ckp, const char *cmd)
LOGWARNING("Failed to json decode in update_diff");
return;
}
json_get_int64(&id, val, "proxy");
json_get_int(&id, val, "proxy");
json_get_int(&subid, val, "subproxy");
json_dblcpy(&diff, val, "diff");
json_decref(val);
LOGINFO("Got updated diff for proxy %ld:%d", id, subid);
LOGINFO("Got updated diff for proxy %d:%d", id, subid);
proxy = existing_subproxy(sdata, id, subid);
if (!proxy) {
LOGINFO("No existing subproxy %ld:%d to update diff", id, subid);
LOGINFO("No existing subproxy %d:%d to update diff", id, subid);
return;
}
@ -1603,12 +1597,12 @@ static void reap_proxies(ckpool_t *ckp, sdata_t *sdata)
if (!subproxy->dead)
continue;
if (unlikely(!subproxy->subid)) {
LOGWARNING("Unexepectedly found proxy %ld:%d as subproxy of %ld:%d",
LOGWARNING("Unexepectedly found proxy %d:%d as subproxy of %d:%d",
subproxy->id, subproxy->subid, proxy->id, proxy->subid);
continue;
}
if (unlikely(subproxy == sdata->proxy)) {
LOGWARNING("Unexepectedly found proxy %ld:%d as current",
LOGWARNING("Unexepectedly found proxy %d:%d as current",
subproxy->id, subproxy->subid);
continue;
}
@ -2239,25 +2233,24 @@ static void reconnect_client(sdata_t *sdata, stratum_instance_t *client)
* this proxy we are only given this message if all clients must move. */
static void set_proxy(sdata_t *sdata, const char *buf)
{
int64_t id = 0;
int id = 0;
proxy_t *proxy;
sscanf(buf, "proxy=%ld", &id);
sscanf(buf, "proxy=%d", &id);
mutex_lock(&sdata->proxy_lock);
proxy = __proxy_by_id(sdata, id);
sdata->proxy = proxy;
mutex_unlock(&sdata->proxy_lock);
LOGNOTICE("Stratifier setting active proxy to %ld", id);
LOGNOTICE("Stratifier setting active proxy to %d", id);
}
static void dead_proxy(sdata_t *sdata, const char *buf)
{
int64_t id = 0;
int subid = 0;
int id = 0, subid = 0;
sscanf(buf, "deadproxy=%ld:%d", &id, &subid);
sscanf(buf, "deadproxy=%d:%d", &id, &subid);
dead_proxyid(sdata, id, subid);
}
@ -2522,8 +2515,7 @@ static void stratum_send_message(sdata_t *sdata, const stratum_instance_t *clien
static sdata_t *select_sdata(const ckpool_t *ckp, sdata_t *ckp_sdata)
{
proxy_t *current, *proxy, *subproxy, *best = NULL, *tmp, *tmpsub;
int best_subid = 0, best_lowid;
int64_t best_id = 0;
int best_subid = 0, best_id;
if (!ckp->proxy || ckp->passthrough)
return ckp_sdata;
@ -2532,7 +2524,7 @@ static sdata_t *select_sdata(const ckpool_t *ckp, sdata_t *ckp_sdata)
LOGWARNING("No proxy available yet to generate subscribes");
return NULL;
}
best_lowid = ckp_sdata->proxy_count;
best_id = ckp_sdata->proxy_count;
mutex_lock(&ckp_sdata->proxy_lock);
HASH_ITER(hh, ckp_sdata->proxies, proxy, tmp) {
@ -2555,9 +2547,8 @@ static sdata_t *select_sdata(const ckpool_t *ckp, sdata_t *ckp_sdata)
max_headroom = subproxy_headroom;
}
}
if (best && (best->low_id < best_lowid || (best->low_id == best_lowid && best->id > best_id))) {
if (best && best->id < best_id) {
best_id = best->id;
best_lowid = best->low_id;
best_subid = best->subid;
if (proxy == current)
break;
@ -2598,7 +2589,7 @@ static json_t *parse_subscribe(stratum_instance_t *client, const int64_t client_
return json_string("Initialising");
}
if (ckp->proxy) {
LOGINFO("Current %ld, selecting proxy %ld:%d for client %"PRId64, ckp_sdata->proxy->id,
LOGINFO("Current %d, selecting proxy %d:%d for client %"PRId64, ckp_sdata->proxy->id,
sdata->subproxy->id, sdata->subproxy->subid, client->id);
}
client->sdata = sdata;
@ -3187,7 +3178,7 @@ static json_t *parse_authorise(stratum_instance_t *client, const json_t *params_
client->authorised = ret;
user->authorised = ret;
if (ckp->proxy) {
LOGNOTICE("Authorised client %"PRId64" to proxy %ld:%d, worker %s as user %s",
LOGNOTICE("Authorised client %"PRId64" to proxy %d:%d, worker %s as user %s",
client->id, client->proxyid, client->subproxyid, buf, user->username);
} else {
LOGNOTICE("Authorised client %"PRId64" worker %s as user %s",
@ -4902,9 +4893,8 @@ static void *statsupdate(void *arg)
mutex_lock(&sdata->proxy_lock);
HASH_ITER(hh, sdata->proxies, proxy, proxytmp) {
JSON_CPACK(val, "{sI,si,si,sI,sb}",
JSON_CPACK(val, "{sI,si,sI,sb}",
"id", proxy->id,
"priority", proxy->low_id,
"subproxies", proxy->subproxy_count,
"clients", proxy->combined_clients,
"alive", !proxy->dead);

Loading…
Cancel
Save