Browse Source

Detect if a getwork based pool has the X-Stratum header on startup, and if so, switch to the stratum based pool.

nfactor-troky
Con Kolivas 12 years ago
parent
commit
eaf7ed0dcd
  1. 18
      cgminer.c
  2. 20
      util.c

18
cgminer.c

@ -4192,6 +4192,9 @@ static bool pool_active(struct pool *pool, bool pinging)
CURL *curl; CURL *curl;
int rolltime; int rolltime;
applog(LOG_INFO, "Testing pool %s", pool->rpc_url);
retry_stratum:
if (pool->has_stratum) { if (pool->has_stratum) {
if ((!pool->stratum_active || pinging) && !initiate_stratum(pool)) if ((!pool->stratum_active || pinging) && !initiate_stratum(pool))
return false; return false;
@ -4212,12 +4215,25 @@ static bool pool_active(struct pool *pool, bool pinging)
return false; return false;
} }
applog(LOG_INFO, "Testing pool %s", pool->rpc_url);
gettimeofday(&tv_getwork, NULL); gettimeofday(&tv_getwork, NULL);
val = json_rpc_call(curl, pool->rpc_url, pool->rpc_userpass, rpc_req, val = json_rpc_call(curl, pool->rpc_url, pool->rpc_userpass, rpc_req,
true, false, &rolltime, pool, false); true, false, &rolltime, pool, false);
gettimeofday(&tv_getwork_reply, NULL); gettimeofday(&tv_getwork_reply, NULL);
/* Detect if a http getwork pool has an X-Stratum header at startup,
* and if so, switch to that in preference to getwork */
if (unlikely(!pinging && pool->stratum_url)) {
applog(LOG_NOTICE, "Switching pool %d %s to %s", pool->pool_no, pool->rpc_url, pool->stratum_url);
pool->has_stratum = true;
pool->rpc_url = strdup(pool->stratum_url);
extract_sockaddr(pool, pool->stratum_url);
initiate_stratum(pool);
auth_stratum(pool);
curl_easy_cleanup(curl);
goto retry_stratum;
}
if (val) { if (val) {
struct work *work = make_work(); struct work *work = make_work();
bool rc; bool rc;

20
util.c

@ -54,6 +54,7 @@ struct header_info {
char *lp_path; char *lp_path;
int rolltime; int rolltime;
char *reason; char *reason;
char *stratum_url;
bool hadrolltime; bool hadrolltime;
bool canroll; bool canroll;
bool hadexpire; bool hadexpire;
@ -183,6 +184,11 @@ static size_t resp_hdr_cb(void *ptr, size_t size, size_t nmemb, void *user_data)
val = NULL; val = NULL;
} }
if (!strcasecmp("X-Stratum", key)) {
hi->stratum_url = val;
val = NULL;
}
out: out:
free(key); free(key);
free(val); free(val);
@ -261,7 +267,7 @@ json_t *json_rpc_call(CURL *curl, const char *url,
{ {
long timeout = longpoll ? (60 * 60) : 60; long timeout = longpoll ? (60 * 60) : 60;
struct data_buffer all_data = {NULL, 0}; struct data_buffer all_data = {NULL, 0};
struct header_info hi = {NULL, 0, NULL, false, false, false}; struct header_info hi = {NULL, 0, NULL, NULL, false, false, false};
char len_hdr[64], user_agent_hdr[128]; char len_hdr[64], user_agent_hdr[128];
char curl_err_str[CURL_ERROR_SIZE]; char curl_err_str[CURL_ERROR_SIZE];
struct curl_slist *headers = NULL; struct curl_slist *headers = NULL;
@ -388,10 +394,20 @@ json_t *json_rpc_call(CURL *curl, const char *url,
pool->hdr_path = hi.lp_path; pool->hdr_path = hi.lp_path;
} else } else
pool->hdr_path = NULL; pool->hdr_path = NULL;
} else if (hi.lp_path) { if (hi.stratum_url) {
pool->stratum_url = hi.stratum_url;
hi.stratum_url = NULL;
}
} else {
if (hi.lp_path) {
free(hi.lp_path); free(hi.lp_path);
hi.lp_path = NULL; hi.lp_path = NULL;
} }
if (hi.stratum_url) {
free(hi.stratum_url);
hi.stratum_url = NULL;
}
}
*rolltime = hi.rolltime; *rolltime = hi.rolltime;
pool->cgminer_pool_stats.rolltime = hi.rolltime; pool->cgminer_pool_stats.rolltime = hi.rolltime;

Loading…
Cancel
Save