1
0
mirror of https://github.com/GOSTSec/ccminer synced 2025-01-08 22:07:56 +00:00

api: add scanlog command to monitor scan ranges

will be used for external debugging...
This commit is contained in:
Tanguy Pruvot 2014-11-24 19:43:57 +01:00
parent 1dfbe6dfb5
commit dc5d1b112d
5 changed files with 82 additions and 22 deletions

28
api.cpp
View File

@ -284,7 +284,7 @@ static char *gethwinfos(char *params)
}
/**
* Returns the last 20 scans stats (not the same as shares)
* Returns the last 50 scans stats
* optional param thread id (default all)
*/
static char *gethistory(char *params)
@ -304,6 +304,25 @@ static char *gethistory(char *params)
return buffer;
}
/**
* Returns the job scans ranges (debug purpose)
*/
static char *getscanlog(char *params)
{
struct hashlog_data data[50];
char *p = buffer;
int records = hashlog_get_history(data, ARRAY_SIZE(data));
*buffer = '\0';
for (int i = 0; i < records; i++) {
time_t ts = data[i].tm_upd;
p += sprintf(p, "H=%u;JOB=%u;N=%u;FROM=0x%x;SCANTO=0x%x;"
"COUNT=0x%x;FOUND=%u;TS=%u|",
data[i].height, data[i].njobid, data[i].nonce, data[i].scanned_from, data[i].scanned_to,
(data[i].scanned_to - data[i].scanned_from), data[i].tm_sent ? 1 : 0, (uint32_t)ts);
}
return buffer;
}
/**
* Some debug infos about memory usage
*/
@ -331,6 +350,7 @@ struct CMDS {
{ "summary", getsummary },
{ "threads", getthreads },
{ "histo", gethistory },
{ "scanlog", getscanlog },
{ "meminfo", getmeminfo },
{ "hwinfo", gethwinfos },
/* keep it the last */
@ -344,9 +364,11 @@ static char *gethelp(char *params)
char * p = buffer;
for (int i = 0; i < CMDMAX-1; i++)
p += sprintf(p, "%s\n", cmds[i].name);
sprintf(p, "|");
return buffer;
}
/*****************************************************************************/
static int send_result(SOCKETTYPE c, char *result)
{
@ -620,10 +642,10 @@ static void api()
*(params++) = '\0';
if (opt_debug && opt_protocol && n > 0)
applog(LOG_DEBUG, "API: exec command %s(%s)", buf, params);
applog(LOG_DEBUG, "API: exec command %s(%s)", buf, params ? params : "");
for (i = 0; i < CMDMAX; i++) {
if (strcmp(buf, cmds[i].name) == 0) {
if (strcmp(buf, cmds[i].name) == 0 && strlen(buf)) {
result = (cmds[i].func)(params);
send_result(c, result);
break;

View File

@ -1,8 +1,8 @@
/**
* Hash log of submitted job nonces
* Prevent duplicate shares and could be used for RPC stats later
* Prevent duplicate shares
*
* Note: this source is C++ (requires std::map)
* (to be merged later with stats)
*
* tpruvot@github 2014
*/
@ -16,6 +16,7 @@
#define LO_DWORD(u64) ((uint32_t) u64)
#define MK_HI64(u32) (0x100000000ULL * u32)
/* from miner.h
struct hashlog_data {
uint32_t tm_sent;
uint32_t height;
@ -25,6 +26,7 @@ struct hashlog_data {
uint32_t tm_add;
uint32_t tm_upd;
};
*/
static std::map<uint64_t, hashlog_data> tlastshares;
@ -71,6 +73,7 @@ void hashlog_remember_submit(struct work* work, uint32_t nonce)
data.scanned_from = work->scanned_from;
data.scanned_to = nonce;
data.height = work->height;
data.njobid = (uint32_t) njobid;
data.tm_add = data.tm_upd = data.tm_sent = (uint32_t) time(NULL);
tlastshares[key] = data;
}
@ -89,6 +92,7 @@ void hashlog_remember_scan_range(struct work* work)
data = tlastshares[key];
if (range == 0) {
memset(&data, 0, sizeof(data));
data.njobid = njobid;
} else {
// get min and max from all sent records
data.scanned_from = LO_DWORD(range);
@ -164,6 +168,24 @@ uint32_t hashlog_get_last_sent(char* jobid)
return nonce;
}
/**
* Export data for api calls
*/
int hashlog_get_history(struct hashlog_data *data, int max_records)
{
int records = 0;
std::map<uint64_t, hashlog_data>::reverse_iterator it = tlastshares.rbegin();
while (it != tlastshares.rend() && records < max_records) {
memcpy(&data[records], &(it->second), sizeof(struct hashlog_data));
data[records].nonce = LO_DWORD(it->first);
data[records].njobid = (uint32_t) HI_DWORD(it->first);
records++;
++it;
}
return records;
}
/**
* Remove entries of a job...
*/

38
miner.h
View File

@ -399,6 +399,31 @@ struct thr_api {
pthread_t pth;
struct thread_q *q;
};
struct stats_data {
uint32_t tm_stat;
uint32_t hashcount;
uint32_t height;
double difficulty;
double hashrate;
uint8_t thr_id;
uint8_t gpu_id;
uint8_t hashfound;
uint8_t ignored;
};
struct hashlog_data {
uint32_t tm_sent;
uint32_t height;
uint32_t njobid;
uint32_t nonce;
uint32_t scanned_from;
uint32_t scanned_to;
uint32_t last_from;
uint32_t tm_add;
uint32_t tm_upd;
};
/* end of api */
struct thr_info {
@ -544,18 +569,6 @@ struct work {
uint32_t scanned_to;
};
struct stats_data {
uint32_t tm_stat;
uint32_t hashcount;
uint32_t height;
double difficulty;
double hashrate;
uint8_t thr_id;
uint8_t gpu_id;
uint8_t hashfound;
uint8_t ignored;
};
bool stratum_socket_full(struct stratum_ctx *sctx, int timeout);
bool stratum_send_line(struct stratum_ctx *sctx, char *s);
char *stratum_recv_line(struct stratum_ctx *sctx);
@ -570,6 +583,7 @@ void hashlog_remember_scan_range(struct work* work);
uint32_t hashlog_already_submittted(char* jobid, uint32_t nounce);
uint32_t hashlog_get_last_sent(char* jobid);
uint64_t hashlog_get_scan_range(char* jobid);
int hashlog_get_history(struct hashlog_data *data, int max_records);
void hashlog_purge_old(void);
void hashlog_purge_job(char* jobid);
void hashlog_purge_all(void);

View File

@ -90,11 +90,13 @@ double stats_get_speed(int thr_id, double def_speed)
return speed;
}
/**
* Export data for api calls
*/
int stats_get_history(int thr_id, struct stats_data *data, int max_records)
{
const uint64_t gpu = device_map[thr_id];
const uint64_t keymsk = 0xffULL; // last u8 is the gpu
double speed = 0.0;
int records = 0;
std::map<uint64_t, stats_data>::reverse_iterator i = tlastscans.rbegin();

View File

@ -20,9 +20,9 @@
#define HWMON_ALT \
"/sys/class/hwmon/hwmon0/temp1_input"
static float linux_cputemp(int core)
static double linux_cputemp(int core)
{
float tc = 0.0;
double tc = 0.0;
FILE *fd = fopen(HWMON_PATH, "r");
uint32_t val = 0;
@ -33,7 +33,7 @@ static float linux_cputemp(int core)
return tc;
if (fscanf(fd, "%d", &val))
tc = val / 1000.0;
tc = (double)val / 1000.0;
fclose(fd);
return tc;
@ -74,7 +74,7 @@ float cpu_temp(int core)
#ifdef WIN32
return win32_cputemp(core);
#else
return linux_cputemp(core);
return (float) linux_cputemp(core);
#endif
}