kanoi 10 years ago
parent
commit
f2a3421c57
  1. 4
      src/bitcoin.c
  2. 9
      src/connector.c
  3. 18
      src/stratifier.c

4
src/bitcoin.c

@ -1,5 +1,5 @@
/* /*
* Copyright 2014 Con Kolivas * Copyright 2014-2015 Con Kolivas
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free * under the terms of the GNU General Public License as published by the Free
@ -46,7 +46,7 @@ bool validate_address(connsock_t *cs, const char *address)
} }
} }
if (!found) { if (!found) {
LOGWARNING("Invalid char %.1s passed to validate_address", &c); LOGNOTICE("Invalid char %.1s passed to validate_address", &c);
return ret; return ret;
} }
} }

9
src/connector.c

@ -238,7 +238,7 @@ static void stratifier_drop_client(ckpool_t *ckp, int64_t id)
* count. */ * count. */
static int invalidate_client(ckpool_t *ckp, cdata_t *cdata, client_instance_t *client) static int invalidate_client(ckpool_t *ckp, cdata_t *cdata, client_instance_t *client)
{ {
client_instance_t *tmp, *client_delete = NULL; client_instance_t *tmp;
int ret; int ret;
ret = drop_client(cdata, client); ret = drop_client(cdata, client);
@ -250,15 +250,12 @@ static int invalidate_client(ckpool_t *ckp, cdata_t *cdata, client_instance_t *c
* counts for them. */ * counts for them. */
ck_wlock(&cdata->lock); ck_wlock(&cdata->lock);
LL_FOREACH_SAFE(cdata->dead_clients, client, tmp) { LL_FOREACH_SAFE(cdata->dead_clients, client, tmp) {
/* Don't free client ram when loop may still access it */
dealloc(client_delete);
if (!client->ref) { if (!client->ref) {
LL_DELETE(cdata->dead_clients, client); LL_DELETE(cdata->dead_clients, client);
LOGINFO("Connector discarding client %ld", client->id); LOGINFO("Connector discarding client %ld", client->id);
client_delete = client; dealloc(client);
} }
} }
dealloc(client_delete);
ck_wunlock(&cdata->lock); ck_wunlock(&cdata->lock);
out: out:
@ -559,7 +556,6 @@ static void send_client(cdata_t *cdata, int64_t id, char *buf)
invalidate_client(ckp, cdata, client); invalidate_client(ckp, cdata, client);
} else { } else {
LOGINFO("Connector failed to find client id %ld to send to", id); LOGINFO("Connector failed to find client id %ld to send to", id);
stratifier_drop_client(ckp, id);
} }
free(buf); free(buf);
return; return;
@ -693,7 +689,6 @@ retry:
client = ref_client_by_id(cdata, client_id); client = ref_client_by_id(cdata, client_id);
if (unlikely(!client)) { if (unlikely(!client)) {
LOGINFO("Connector failed to find client id %ld to drop", client_id); LOGINFO("Connector failed to find client id %ld to drop", client_id);
stratifier_drop_client(ckp, client_id);
goto retry; goto retry;
} }
ret = invalidate_client(ckp, cdata, client); ret = invalidate_client(ckp, cdata, client);

18
src/stratifier.c

@ -1250,13 +1250,13 @@ static void dec_worker(ckpool_t *ckp, user_instance_t *instance)
static void drop_client(sdata_t *sdata, int64_t id) static void drop_client(sdata_t *sdata, int64_t id)
{ {
stratum_instance_t *client, *tmp, *client_delete = NULL; stratum_instance_t *client, *tmp;
user_instance_t *instance = NULL; user_instance_t *instance = NULL;
time_t now_t = time(NULL); time_t now_t = time(NULL);
ckpool_t *ckp = NULL; ckpool_t *ckp = NULL;
bool dec = false; bool dec = false;
LOGINFO("Stratifier dropping client %ld", id); LOGINFO("Stratifier asked to drop client %ld", id);
ck_wlock(&sdata->instance_lock); ck_wlock(&sdata->instance_lock);
client = __instance_by_id(sdata, id); client = __instance_by_id(sdata, id);
@ -1276,11 +1276,15 @@ static void drop_client(sdata_t *sdata, int64_t id)
HASH_FIND(hh, sdata->disconnected_instances, &client->enonce1_64, sizeof(uint64_t), old_client); HASH_FIND(hh, sdata->disconnected_instances, &client->enonce1_64, sizeof(uint64_t), old_client);
/* Only keep around one copy of the old client in server mode */ /* Only keep around one copy of the old client in server mode */
if (!client->ckp->proxy && !old_client && client->enonce1_64 && dec) { if (!client->ckp->proxy && !old_client && client->enonce1_64 && dec) {
LOGDEBUG("Adding disconnected instance %ld", client->id); LOGNOTICE("Disconnecting client %ld %s", client->id, client->workername);
HASH_ADD(hh, sdata->disconnected_instances, enonce1_64, sizeof(uint64_t), client); HASH_ADD(hh, sdata->disconnected_instances, enonce1_64, sizeof(uint64_t), client);
sdata->stats.disconnected++; sdata->stats.disconnected++;
client->disconnected_time = time(NULL); client->disconnected_time = time(NULL);
} else { } else {
if (client->workername)
LOGNOTICE("Dropping client %ld %s", client->id, client->workername);
else
LOGINFO("Dropping workerless client %ld", client->id);
__add_dead(sdata, client); __add_dead(sdata, client);
} }
} }
@ -1300,20 +1304,14 @@ static void drop_client(sdata_t *sdata, int64_t id)
/* Cull old unused clients lazily when there are no more reference /* Cull old unused clients lazily when there are no more reference
* counts for them. */ * counts for them. */
LL_FOREACH_SAFE(sdata->dead_instances, client, tmp) { LL_FOREACH_SAFE(sdata->dead_instances, client, tmp) {
/* We can't delete the ram safely in this loop, even if we can
* safely remove the entry from the linked list so we do it on
* the next pass through the loop. */
if (client != client_delete)
dealloc(client_delete);
if (!client->ref) { if (!client->ref) {
LOGINFO("Stratifier discarding dead instance %ld", client->id); LOGINFO("Stratifier discarding dead instance %ld", client->id);
__del_dead(sdata, client); __del_dead(sdata, client);
dealloc(client->workername); dealloc(client->workername);
dealloc(client->useragent); dealloc(client->useragent);
client_delete = client; dealloc(client);
} }
} }
dealloc(client_delete);
ck_wunlock(&sdata->instance_lock); ck_wunlock(&sdata->instance_lock);
/* Decrease worker count outside of instance_lock to avoid recursive /* Decrease worker count outside of instance_lock to avoid recursive

Loading…
Cancel
Save