Browse Source

Merge commit 'be4705a' into cg_merges_20130304a

Conflicts:
	miner.c
	miner.h
Luke Dashjr 13 years ago
parent
commit
ea0173dcb3
3 changed files with 90 additions and 13 deletions
  1. 5 5
      miner.c
  2. 1 0
      miner.h
  3. 84 8
      util.c

+ 5 - 5
miner.c

@@ -4023,15 +4023,15 @@ static void *submit_work_thread(__maybe_unused void *userdata)
 			struct work *work = sws->work;
 			struct work *work = sws->work;
 			struct pool *pool = work->pool;
 			struct pool *pool = work->pool;
 			int fd = pool->sock;
 			int fd = pool->sock;
-			bool session_match;
+			bool has_sessionid;
 			
 			
 			mutex_lock(&pool->pool_lock);
 			mutex_lock(&pool->pool_lock);
-			session_match = true;  // FIXME: pool->sessionid && work->sessionid && !strcmp(pool->sessionid, work->sessionid);
+			has_sessionid = true;  // FIXME: pool->sessionid != NULL;
 			// FIXME: Above check won't work without sessionid support
 			// FIXME: Above check won't work without sessionid support
 			mutex_unlock(&pool->pool_lock);
 			mutex_unlock(&pool->pool_lock);
-			if (!session_match)
+			if (!has_sessionid)
 			{
 			{
-				applog(LOG_DEBUG, "Failed to session match stratum share");
+				applog(LOG_DEBUG, "No session id for resubmitting stratum share");
 				submit_discard_share2("disconnect", work);
 				submit_discard_share2("disconnect", work);
 				++tsreduce;
 				++tsreduce;
 next_write_sws_del:
 next_write_sws_del:
@@ -5845,7 +5845,7 @@ static void shutdown_stratum(struct pool *pool)
 	pool->stratum_url = NULL;
 	pool->stratum_url = NULL;
 }
 }
 
 
-static void clear_stratum_shares(struct pool *pool)
+void clear_stratum_shares(struct pool *pool)
 {
 {
 	struct stratum_share *sshare, *tmpshare;
 	struct stratum_share *sshare, *tmpshare;
 	struct work *work;
 	struct work *work;

+ 1 - 0
miner.h

@@ -785,6 +785,7 @@ extern pthread_mutex_t ch_lock;
 
 
 extern void thread_reportin(struct thr_info *thr);
 extern void thread_reportin(struct thr_info *thr);
 extern void thread_reportout(struct thr_info *);
 extern void thread_reportout(struct thr_info *);
+extern void clear_stratum_shares(struct pool *pool);
 extern void hashmeter2(struct thr_info *);
 extern void hashmeter2(struct thr_info *);
 extern bool stale_work(struct work *, bool share);
 extern bool stale_work(struct work *, bool share);
 extern bool stale_work_future(struct work *, bool share, unsigned long ustime);
 extern bool stale_work_future(struct work *, bool share, unsigned long ustime);

+ 84 - 8
util.c

@@ -1392,7 +1392,7 @@ static bool parse_reconnect(struct pool *pool, json_t *val)
 
 
 	applog(LOG_NOTICE, "Reconnect requested from pool %d to %s", pool->pool_no, address);
 	applog(LOG_NOTICE, "Reconnect requested from pool %d to %s", pool->pool_no, address);
 
 
-	if (!initiate_stratum(pool) || !auth_stratum(pool))
+	if (!restart_stratum(pool))
 		return false;
 		return false;
 
 
 	return true;
 	return true;
@@ -1723,15 +1723,88 @@ out:
 	return ret;
 	return ret;
 }
 }
 
 
-/* Placeholder for real resume function in the future */
-static bool resume_stratum(struct pool *pool)
+static void reset_sessionid(struct pool *pool)
 {
 {
 	mutex_lock(&pool->pool_lock);
 	mutex_lock(&pool->pool_lock);
 	free(pool->sessionid);
 	free(pool->sessionid);
 	pool->sessionid = NULL;
 	pool->sessionid = NULL;
 	mutex_unlock(&pool->pool_lock);
 	mutex_unlock(&pool->pool_lock);
+}
 
 
-	return false;
+/* 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 restart_stratum(struct pool *pool)
@@ -1742,10 +1815,13 @@ bool restart_stratum(struct pool *pool)
 	resume = pool->sessionid != NULL;
 	resume = pool->sessionid != NULL;
 	mutex_unlock(&pool->pool_lock);
 	mutex_unlock(&pool->pool_lock);
 
 
-	if (resume && !resume_stratum(pool))
-		return false;
-	else if (!initiate_stratum(pool))
-		return false;
+	if (resume) {
+		if (!resume_stratum(pool))
+			return false;
+	} else {
+		if (!initiate_stratum(pool))
+			return false;
+	}
 	if (!auth_stratum(pool))
 	if (!auth_stratum(pool))
 		return false;
 		return false;
 	return true;
 	return true;