Commit 68d691093c5e8e8145a01c5021be0b0118401852

ckolivas 2013-02-22T12:55:01

Move to storing the nonce1 in the work struct instead of the sessionid for the now defunct first draft mining.resume protocol.

diff --git a/cgminer.c b/cgminer.c
index 78d894c..fc18ed9 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -1380,7 +1380,7 @@ void clean_work(struct work *work)
 	free(work->nonce2);
 	free(work->ntime);
 	free(work->gbt_coinbase);
-	free(work->sessionid);
+	free(work->nonce1);
 	memset(work, 0, sizeof(struct work));
 }
 
@@ -2946,12 +2946,12 @@ void __copy_work(struct work *work, struct work *base_work)
 	work->id = id;
 	if (base_work->job_id)
 		work->job_id = strdup(base_work->job_id);
+	if (base_work->nonce1)
+		work->nonce1 = strdup(base_work->nonce1);
 	if (base_work->nonce2)
 		work->nonce2 = strdup(base_work->nonce2);
 	if (base_work->ntime)
 		work->ntime = strdup(base_work->ntime);
-	if (base_work->sessionid)
-		work->sessionid = strdup(base_work->sessionid);
 	if (base_work->gbt_coinbase)
 		work->gbt_coinbase = strdup(base_work->gbt_coinbase);
 }
@@ -3172,8 +3172,8 @@ static void *submit_work_thread(void *userdata)
 		applog(LOG_INFO, "Submitting share %08lx to pool %d", hash32[6], pool->pool_no);
 
 		/* Try resubmitting for up to 2 minutes if we fail to submit
-		 * once and the stratum pool supports sessionid for mining
-		 * resume. */
+		 * once and the stratum pool nonce1 still matches suggesting
+		 * we may be able to resume. */
 		while (time(NULL) < sshare->sshare_time + 120) {
 			bool sessionid_match;
 
@@ -3194,7 +3194,7 @@ static void *submit_work_thread(void *userdata)
 			}
 
 			mutex_lock(&pool->pool_lock);
-			sessionid_match = pool->sessionid && work->sessionid && !strcmp(pool->sessionid, work->sessionid);
+			sessionid_match = !strcmp(work->nonce1, pool->nonce1);
 			mutex_unlock(&pool->pool_lock);
 
 			if (!sessionid_match) {
@@ -5202,9 +5202,8 @@ static void gen_stratum_work(struct pool *pool, struct work *work)
 
 	/* Copy parameters required for share submission */
 	work->job_id = strdup(pool->swork.job_id);
+	work->nonce1 = strdup(pool->nonce1);
 	work->ntime = strdup(pool->swork.ntime);
-	if (pool->sessionid)
-		work->sessionid = strdup(pool->sessionid);
 	mutex_unlock(&pool->pool_lock);
 
 	applog(LOG_DEBUG, "Generated stratum merkle %s", merkle_hash);
diff --git a/miner.h b/miner.h
index eb4244f..d277aea 100644
--- a/miner.h
+++ b/miner.h
@@ -1007,7 +1007,7 @@ struct work {
 	char		*nonce2;
 	char		*ntime;
 	double		sdiff;
-	char		*sessionid;
+	char		*nonce1;
 
 	bool		gbt;
 	char		*gbt_coinbase;
diff --git a/util.c b/util.c
index cbcc0ee..2384542 100644
--- a/util.c
+++ b/util.c
@@ -1434,7 +1434,10 @@ bool initiate_stratum(struct pool *pool)
 	if (!setup_stratum_curl(pool))
 		goto out;
 
-	sprintf(s, "{\"id\": %d, \"method\": \"mining.subscribe\", \"params\": []}", swork_id++);
+	if (pool->sessionid)
+		sprintf(s, "{\"id\": %d, \"method\": \"mining.subscribe\", \"params\": [\"%s\"]}", swork_id++, pool->sessionid);
+	else
+		sprintf(s, "{\"id\": %d, \"method\": \"mining.subscribe\", \"params\": []}", swork_id++);
 
 	if (!__stratum_send(pool, s, strlen(s))) {
 		applog(LOG_DEBUG, "Failed to send s in initiate_stratum");
@@ -1487,7 +1490,7 @@ bool initiate_stratum(struct pool *pool)
 		applog(LOG_INFO, "Failed to get n2size in initiate_stratum");
 		goto out;
 	}
-	pool->sessionid = json_array_string(res_val, 3);
+	//pool->sessionid = json_array_string(res_val, 3);
 	if (pool->sessionid)
 		applog(LOG_DEBUG, "Pool %d stratum session id: %s", pool->pool_no, pool->sessionid);
 	else
@@ -1513,105 +1516,10 @@ out:
 	return ret;
 }
 
-static void reset_sessionid(struct pool *pool)
-{
-	mutex_lock(&pool->pool_lock);
-	free(pool->sessionid);
-	pool->sessionid = NULL;
-	mutex_unlock(&pool->pool_lock);
-}
-
-/* Placeholder for real resume function in the future */
-static bool resume_stratum(struct pool *pool)
-{
-	json_t *val = NULL, *err_val, *res_val;
-	char s[RBUFSIZE], *sret = NULL;
-	json_error_t err;
-	bool ret = false;
-
-	if (!setup_stratum_curl(pool))
-		goto out;
-
-	mutex_lock(&pool->pool_lock);
-	sprintf(s, "{\"id\": %d, \"method\": \"mining.resume\", \"params\": [\"%s\"]}", swork_id++, pool->sessionid);
-	mutex_unlock(&pool->pool_lock);
-
-	if (!__stratum_send(pool, s, strlen(s))) {
-		applog(LOG_DEBUG, "Failed to send s in resume_stratum");
-		goto out;
-	}
-
-	if (!socket_full(pool, true)) {
-		applog(LOG_DEBUG, "Timed out waiting for response in resume_stratum");
-		goto out;
-	}
-
-	sret = recv_line(pool);
-	if (!sret)
-		goto out;
-
-	val = JSON_LOADS(sret, &err);
-	free(sret);
-	if (!val) {
-		applog(LOG_INFO, "JSON decode failed(%d): %s", err.line, err.text);
-		goto out;
-	}
-
-	res_val = json_object_get(val, "result");
-	err_val = json_object_get(val, "error");
-
-	/* If there is an error, assume resume support is not there or broken */
-	if (!res_val || json_is_null(res_val) ||
-	    (err_val && !json_is_null(err_val))) {
-		char *ss;
-
-		if (err_val)
-			ss = json_dumps(err_val, JSON_INDENT(3));
-		else
-			ss = strdup("(unknown reason)");
-
-		applog(LOG_INFO, "JSON-RPC decode failed: %s", ss);
-
-		free(ss);
-
-		reset_sessionid(pool);
-		goto out;
-	}
-
-	if (json_is_true(res_val)) {
-		applog(LOG_NOTICE, "Resumed stratum connection to pool %d", pool->pool_no);
-		pool->stratum_active = true;
-		ret = true;
-	} else {
-		applog(LOG_NOTICE, "Unable to resume old stratum connection to pool %d", pool->pool_no);
-		reset_sessionid(pool);
-		clear_stratum_shares(pool);
-		json_decref(val);
-
-		return initiate_stratum(pool);
-	}
-out:
-	if (val)
-		json_decref(val);
-
-	return ret;
-}
-
 bool restart_stratum(struct pool *pool)
 {
-	bool resume;
-
-	mutex_lock(&pool->pool_lock);
-	resume = pool->sessionid != NULL;
-	mutex_unlock(&pool->pool_lock);
-
-	if (resume) {
-		if (!resume_stratum(pool))
-			return false;
-	} else {
-		if (!initiate_stratum(pool))
-			return false;
-	}
+	if (!initiate_stratum(pool))
+		return false;
 	if (!auth_stratum(pool))
 		return false;
 	return true;