Browse Source

Make logging directory configurable, and store share logs by height/workid and totals for the pool as well

master
Con Kolivas 11 years ago
parent
commit
78fbb4e91d
  1. 10
      src/ckpool.c
  2. 2
      src/ckpool.h
  3. 54
      src/stratifier.c

10
src/ckpool.c

@ -276,6 +276,7 @@ static void parse_config(ckpool_t *ckp)
json_get_string(&ckp->serverurl, json_conf, "serverurl"); json_get_string(&ckp->serverurl, json_conf, "serverurl");
json_get_int(&ckp->mindiff, json_conf, "mindiff"); json_get_int(&ckp->mindiff, json_conf, "mindiff");
json_get_int(&ckp->startdiff, json_conf, "startdiff"); json_get_int(&ckp->startdiff, json_conf, "startdiff");
json_get_string(&ckp->logdir, json_conf, "logdir");
json_decref(json_conf); json_decref(json_conf);
} }
@ -432,6 +433,15 @@ int main(int argc, char **argv)
ckp.mindiff = 1; ckp.mindiff = 1;
if (!ckp.startdiff) if (!ckp.startdiff)
ckp.startdiff = 42; ckp.startdiff = 42;
if (!ckp.logdir)
ckp.logdir = strdup("logs");
len = strlen(ckp.logdir);
if (memcmp(&ckp.logdir[len], "/", 1))
realloc_strcat(&ckp.logdir, "/");
ret = mkdir(ckp.logdir, 0700);
if (ret && errno != EEXIST)
quit(1, "Failed to make log directory %s", ckp.logdir);
ckp.main.ckp = &ckp; ckp.main.ckp = &ckp;
ckp.main.processname = strdup("main"); ckp.main.processname = strdup("main");

2
src/ckpool.h

@ -37,6 +37,8 @@ struct ckpool_instance {
char *name; char *name;
/* Directory where sockets are created */ /* Directory where sockets are created */
char *socket_dir; char *socket_dir;
/* Directory where logs are written */
char *logdir;
/* Process instance data of parent/child processes */ /* Process instance data of parent/child processes */
proc_instance_t main; proc_instance_t main;

54
src/stratifier.c

@ -123,6 +123,8 @@ struct workbase {
/* Cached header binary */ /* Cached header binary */
char headerbin[112]; char headerbin[112];
char *logdir;
}; };
typedef struct workbase workbase_t; typedef struct workbase workbase_t;
@ -344,6 +346,7 @@ static void clear_workbase(workbase_t *wb)
{ {
free(wb->flags); free(wb->flags);
free(wb->txn_data); free(wb->txn_data);
free(wb->logdir);
json_decref(wb->merkle_array); json_decref(wb->merkle_array);
free(wb); free(wb);
} }
@ -374,6 +377,7 @@ static void update_base(ckpool_t *ckp)
{ {
workbase_t *wb, *tmp, *tmpa; workbase_t *wb, *tmp, *tmpa;
bool new_block = false; bool new_block = false;
int len, ret;
json_t *val; json_t *val;
char *buf; char *buf;
@ -423,14 +427,29 @@ static void update_base(ckpool_t *ckp)
generate_coinbase(ckp, wb); generate_coinbase(ckp, wb);
wb->gentime = time(NULL); wb->gentime = time(NULL);
len = strlen(ckp->logdir) + 8 + 1 + 16;
wb->logdir = ckalloc(len);
ck_wlock(&workbase_lock); ck_wlock(&workbase_lock);
wb->id = workbase_id++; wb->id = workbase_id++;
if (strncmp(wb->prevhash, lasthash, 64)) { if (strncmp(wb->prevhash, lasthash, 64)) {
new_block = true; new_block = true;
memcpy(lasthash, wb->prevhash, 65); memcpy(lasthash, wb->prevhash, 65);
blockchange_id = wb->id; blockchange_id = wb->id;
} }
if (new_block) {
sprintf(wb->logdir, "%s%08x/", ckp->logdir, wb->height);
ret = mkdir(wb->logdir, 0700);
if (unlikely(ret && errno != EEXIST))
quit(1, "Failed to create log directory %s", wb->logdir);
}
sprintf(wb->idstring, "%016lx", wb->id); sprintf(wb->idstring, "%016lx", wb->id);
/* Do not store the trailing slash for the subdir */
sprintf(wb->logdir, "%s%08x/%s", ckp->logdir, wb->height, wb->idstring);
ret = mkdir(wb->logdir, 0700);
if (unlikely(ret && errno != EEXIST))
quit(1, "Failed to create log directory %s", wb->logdir);
HASH_ITER(hh, workbases, tmp, tmpa) { HASH_ITER(hh, workbases, tmp, tmpa) {
if (HASH_COUNT(workbases) < 3) if (HASH_COUNT(workbases) < 3)
break; break;
@ -917,8 +936,9 @@ static void add_submit(stratum_instance_t *client, int diff, bool valid)
stratum_send_diff(client); stratum_send_diff(client);
} }
static void add_submit_success(stratum_instance_t *client, char *idstring, static void add_submit_success(stratum_instance_t *client, const char *logdir,
const char *nonce2, uint32_t ntime, int diff, const char *idstring, const char *nonce2,
const uint32_t ntime, const int diff,
double sdiff, const char *hash) double sdiff, const char *hash)
{ {
char *fname, *s; char *fname, *s;
@ -930,9 +950,11 @@ static void add_submit_success(stratum_instance_t *client, char *idstring,
tv_time(&client->first_share); tv_time(&client->first_share);
client->diff_shares += diff; client->diff_shares += diff;
add_submit(client, diff, true); add_submit(client, diff, true);
len = strlen(client->workername) + 10; len = strlen(logdir) + strlen(client->workername) + 12;
fname = alloca(len); fname = alloca(len);
sprintf(fname, "%s.sharelog", client->workername);
/* First write to the user's sharelog */
sprintf(fname, "%s/%s.sharelog", logdir, client->workername);
fp = fopen(fname, "a"); fp = fopen(fname, "a");
if (unlikely(!fp < 0)) { if (unlikely(!fp < 0)) {
LOGERR("Failed to fopen %s", fname); LOGERR("Failed to fopen %s", fname);
@ -947,13 +969,30 @@ static void add_submit_success(stratum_instance_t *client, char *idstring,
json_set_double(val, "sdiff", sdiff); json_set_double(val, "sdiff", sdiff);
json_set_string(val, "hash", hash); json_set_string(val, "hash", hash);
s = json_dumps(val, 0); s = json_dumps(val, 0);
json_decref(val);
len = strlen(s); len = strlen(s);
len = fprintf(fp, "%s\n", s); len = fprintf(fp, "%s\n", s);
free(s); free(s);
fclose(fp); fclose(fp);
if (unlikely(len < 0)) if (unlikely(len < 0))
LOGERR("Failed to fwrite to %s", fname); LOGERR("Failed to fwrite to %s", fname);
/* Now write to the pool's sharelog, adding workername to json */
sprintf(fname, "%s.sharelog", logdir);
fp = fopen(fname, "a");
if (unlikely(!fp < 0)) {
LOGERR("Failed to fopen %s", fname);
return;
}
json_set_string(val, "worker", client->workername);
s = json_dumps(val, 0);
len = strlen(s);
len = fprintf(fp, "%s\n", s);
free(s);
fclose(fp);
if (unlikely(len < 0))
LOGERR("Failed to fwrite to %s", fname);
json_decref(val);
} }
static void add_submit_fail(stratum_instance_t *client, int diff, bool share) static void add_submit_fail(stratum_instance_t *client, int diff, bool share)
@ -1088,7 +1127,7 @@ static json_t *parse_submit(stratum_instance_t *client, json_t *json_msg,
json_t *params_val, json_t **err_val) json_t *params_val, json_t **err_val)
{ {
const char *user, *job_id, *nonce2, *ntime, *nonce; const char *user, *job_id, *nonce2, *ntime, *nonce;
char hexhash[68], sharehash[32]; char hexhash[68], sharehash[32], *logdir;
bool share = false, ret = false; bool share = false, ret = false;
uint64_t wb_id = 0, id; uint64_t wb_id = 0, id;
double sdiff = -1; double sdiff = -1;
@ -1164,6 +1203,7 @@ static json_t *parse_submit(stratum_instance_t *client, json_t *json_msg,
sdiff = submission_diff(client, wb, nonce2, ntime32, nonce, hash); sdiff = submission_diff(client, wb, nonce2, ntime32, nonce, hash);
wb_id = wb->id; wb_id = wb->id;
strcpy(idstring, wb->idstring); strcpy(idstring, wb->idstring);
logdir = strdupa(wb->logdir);
out_unlock: out_unlock:
ck_runlock(&workbase_lock); ck_runlock(&workbase_lock);
@ -1177,7 +1217,7 @@ out_unlock:
__bin2hex(hexhash, sharehash, 32); __bin2hex(hexhash, sharehash, 32);
if (new_share(hash, wb_id)) { if (new_share(hash, wb_id)) {
LOGINFO("Accepted client %d share diff %.1f/%d: %s", client->id, sdiff, diff, hexhash); LOGINFO("Accepted client %d share diff %.1f/%d: %s", client->id, sdiff, diff, hexhash);
add_submit_success(client, idstring, nonce2, ntime32, diff, sdiff, hexhash); add_submit_success(client, logdir, idstring, nonce2, ntime32, diff, sdiff, hexhash);
ret = true; ret = true;
} else { } else {
add_submit_fail(client, diff, share); add_submit_fail(client, diff, share);

Loading…
Cancel
Save