Browse Source

Create the user if it doesn't already exist in set_worker_mindiff

master
Con Kolivas 10 years ago
parent
commit
03149c1354
  1. 40
      src/stratifier.c

40
src/stratifier.c

@ -2204,6 +2204,30 @@ static void read_workerstats(ckpool_t *ckp, worker_instance_t *worker)
#define DEFAULT_AUTH_BACKOFF (3) /* Set initial backoff to 3 seconds */
static user_instance_t *__create_user(sdata_t *sdata, const char *username)
{
user_instance_t *user = ckzalloc(sizeof(user_instance_t));
user->auth_backoff = DEFAULT_AUTH_BACKOFF;
strcpy(user->username, username);
user->id = sdata->user_instance_id++;
HASH_ADD_STR(sdata->user_instances, username, user);
return user;
}
static user_instance_t *get_user(sdata_t *sdata, const char *username)
{
user_instance_t *user;
ck_wlock(&sdata->instance_lock);
HASH_FIND_STR(sdata->user_instances, username, user);
if (unlikely(!user))
user = __create_user(sdata, username);
ck_wunlock(&sdata->instance_lock);
return user;
}
/* This simply strips off the first part of the workername and matches it to a
* user or creates a new one. Needs to be entered with client holding a ref
* count. */
@ -2228,12 +2252,8 @@ static user_instance_t *generate_user(ckpool_t *ckp, stratum_instance_t *client,
HASH_FIND_STR(sdata->user_instances, username, user);
if (!user) {
/* New user instance. Secondary user id will be NULL */
user = ckzalloc(sizeof(user_instance_t));
user->auth_backoff = DEFAULT_AUTH_BACKOFF;
strcpy(user->username, username);
user = __create_user(sdata, username);
new_user = true;
user->id = sdata->user_instance_id++;
HASH_ADD_STR(sdata->user_instances, username, user);
}
client->user_instance = user;
DL_FOREACH(user->worker_instances, tmp) {
@ -3220,15 +3240,7 @@ static void set_worker_mindiff(ckpool_t *ckp, const char *workername, int mindif
strsep(&ignore, "._");
/* Find the user first */
ck_rlock(&sdata->instance_lock);
HASH_FIND_STR(sdata->user_instances, username, user);
ck_runlock(&sdata->instance_lock);
/* They may just have not connected yet */
if (!user) {
LOGINFO("Failed to find user %s in set_worker_mindiff", username);
return;
}
user = get_user(sdata, username);
/* Then find the matching worker user */
ck_rlock(&sdata->instance_lock);

Loading…
Cancel
Save