Commit 8326d2dcaf3b9d4e4b1a52998f68a6b565642d23

Luke Dashjr 2012-07-27T20:03:25

RPC: New "poolpriority" command to set the order of pool priorities

diff --git a/API-README b/API-README
index df905ef..a00a0dc 100644
--- a/API-README
+++ b/API-README
@@ -174,6 +174,10 @@ The list of requests - a (*) means it requires privileged access - and replies a
                               Use '\\' to get a '\' and '\,' to include a comma
                               inside URL, USR or PASS
 
+ poolpriority|N,... (*)
+               none           There is no reply section just the STATUS section
+                              stating the results of changing pool priorities
+
  disablepool|N (*)
                none           There is no reply section just the STATUS section
                               stating the results of disabling pool N
diff --git a/api.c b/api.c
index d2f0148..86de3c8 100644
--- a/api.c
+++ b/api.c
@@ -339,6 +339,7 @@ static const char *JSON_PARAMETER = "parameter";
 #define MSG_ACCDENY 45
 #define MSG_ACCOK 46
 #define MSG_ENAPOOL 47
+#define MSG_POOLPRIO 73
 #define MSG_DISPOOL 48
 #define MSG_ALRENAP 49
 #define MSG_ALRDISP 50
@@ -501,6 +502,7 @@ struct CODES {
  { SEVERITY_ERR,   MSG_ACCDENY,	PARAM_STR,	"Access denied to '%s' command" },
  { SEVERITY_SUCC,  MSG_ACCOK,	PARAM_NONE,	"Privileged access OK" },
  { SEVERITY_SUCC,  MSG_ENAPOOL,	PARAM_POOL,	"Enabling pool %d:'%s'" },
+ { SEVERITY_SUCC,  MSG_POOLPRIO,PARAM_NONE,	"Changed pool priorities" },
  { SEVERITY_SUCC,  MSG_DISPOOL,	PARAM_POOL,	"Disabling pool %d:'%s'" },
  { SEVERITY_INFO,  MSG_ALRENAP,	PARAM_POOL,	"Pool %d:'%s' already enabled" },
  { SEVERITY_INFO,  MSG_ALRDISP,	PARAM_POOL,	"Pool %d:'%s' already disabled" },
@@ -2132,6 +2134,39 @@ static void enablepool(__maybe_unused SOCKETTYPE c, char *param, bool isjson, __
 	strcpy(io_buffer, message(MSG_ENAPOOL, id, NULL, isjson));
 }
 
+static void poolpriority(__maybe_unused SOCKETTYPE c, char *param, bool isjson, __maybe_unused char group)
+{
+	SETUP_STRTOK_TS;
+	int total_pools_ = total_pools;  // Keep a local copy, to be more threadsafe
+	char *a;
+	int i, prio = 0;
+
+	if (total_pools_ == 0) {
+		strcpy(io_buffer, message(MSG_NOPOOL, 0, NULL, isjson));
+		return;
+	}
+
+	bool pools_changed[total_pools_];
+	for (i = 0; i < total_pools_; ++i)
+		pools_changed[i] = false;
+
+	a = strtok_ts(param, ",");
+	do {
+		i = atoi(a);
+		pools[i]->prio = prio++;
+		pools_changed[i] = true;
+	} while ( (a = strtok_ts(NULL, ",")) );
+
+	for (i = 0; i < total_pools_; ++i)
+		if (!pools_changed[i])
+			pools[i]->prio = prio++;
+
+	if (current_pool()->prio)
+		switch_pools(NULL);
+
+	strcpy(io_buffer, message(MSG_POOLPRIO, 0, NULL, isjson));
+}
+
 static void disablepool(__maybe_unused SOCKETTYPE c, char *param, bool isjson, __maybe_unused char group)
 {
 	struct pool *pool;
@@ -2663,6 +2698,7 @@ struct CMDS {
 	{ "cpucount",		cpucount,	false },
 	{ "switchpool",		switchpool,	true },
 	{ "addpool",		addpool,	true },
+	{ "poolpriority",	poolpriority,	true },
 	{ "enablepool",		enablepool,	true },
 	{ "disablepool",	disablepool,	true },
 	{ "removepool",		removepool,	true },