[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [Linux-cluster] LVS port translation



Jordi Prats wrote:
Hi,
It would be great if you could send it to me! There's any reason why it
is not included in main distribution?

If there's any thing left to do I could try to do it because I prefere
not to depen on a patch to upgrade.

Thank you!
Jordi


Jordi,

Attached is the patch I have been using.

It does the following things:

 - Adds a "port" option to real-server blocks in lvs.cf.  This value defaults
   to the virtual service port number if specified, and port 80 if neither are
   specified (this is the default as is currently in piranha).  This port value
   is passed to the "-r" argument for ipvsadm as called by nanny.

 - Adds the "-r" argument to nanny itself, similar to the already existing "-p"
   argument.  The manpage for nanny has been updated to reflect this usage.

 - The special token "%p" has been added to nanny's external check command syntax
   in order to utilize the specific real-server port number in command-line-specified
   external check commands with nanny.  Also see nanny manpage updates.


So basically what you can do is add a "port" value inside your real-server blocks
in lvs.cf, and be on your way :)

I don't know if there's anything left to do in order to have such a patch submitted
to the piranha sources - I've never done that before.  If anyone would like to get
it in there, I would love it for the same reason: no more custom building/patching
on upgrades :)

Comments certainly welcome!

-Brenton Rothchild

diff -uNr piranha-0.8.2-orig/lvsconfig.c piranha/lvsconfig.c
--- piranha-0.8.2-orig/lvsconfig.c	2006-01-12 15:54:59.000000000 -0600
+++ piranha/lvsconfig.c	2006-10-10 08:18:01.000000000 -0500
@@ -736,7 +736,9 @@
     OUTPUT_MISSING_NUM (LVS_SAW_AS_ISACTIVE, eservice->isActive,
 			  -1, (char *) "\t\tactive = %d\n")
     OUTPUT_MISSING_NUM (LVS_SAW_AS_WEIGHT, eservice->weight,
-			  1, (char *) "\t\tweight = %d\n")}
+			  1, (char *) "\t\tweight = %d\n")
+    OUTPUT_MISSING_NUM (LVS_SAW_AS_PORT, eservice->port,
+			  1, (char *) "\t\tport = %d\n")}
 
 
 
@@ -782,6 +784,13 @@
 	  OUTPUT_NUM (eservice, weight, 2, LVS_SAW_AS_WEIGHT);
 
 	}
+      else if (TOKEN ("port"))
+	{
+	  CHECK_ARGS (1) if ((rc = getNum (&service->port, toks.argv[2])))
+	    return rc;
+	  OUTPUT_NUM (eservice, port, 2, LVS_SAW_AS_PORT);
+
+	}
       else
 	return LVS_ERROR_BADCOMMAND;
 
diff -uNr piranha-0.8.2-orig/lvsd.c piranha/lvsd.c
--- piranha-0.8.2-orig/lvsd.c	2006-03-03 12:50:49.000000000 -0600
+++ piranha/lvsd.c	2006-10-10 08:18:01.000000000 -0500
@@ -131,7 +131,7 @@
 {
   struct in_addr vip;
   struct in_addr address;
-  int port, protocol;
+  int port, rport, protocol;
   pid_t clientMonitor;		/* -1 if died */
 };
 
@@ -303,7 +303,7 @@
   char *virtAddress;
   char *argv[42];
   char **arg = argv;
-  char portNum[20], timeoutNum[20], weightNum[20], reentryNum[20];
+  char portNum[20], rportNum[20], timeoutNum[20], weightNum[20], reentryNum[20];
   char fwmNum[20];
   pid_t child;
 
@@ -313,7 +313,8 @@
   clientInfo.vip = vserver->virtualAddress;
   clientInfo.address = service->address;
   clientInfo.protocol = vserver->protocol;
-  clientInfo.port = service->port;
+  clientInfo.port = vserver->port;
+  clientInfo.rport = service->port;
 
   rc = findClientInList (clients, *numClients, &clientInfo);
 
@@ -323,7 +324,8 @@
   virtAddress = strdup (inet_ntoa (vserver->virtualAddress));
   realAddress = strdup (inet_ntoa (service->address));
 
-  sprintf (portNum, "%d", service->port);
+  sprintf (portNum, "%d", vserver->port);
+  sprintf (rportNum, "%d", service->port);
   sprintf (timeoutNum, "%d", vserver->timeout);
   sprintf (weightNum, "%d", service->weight);
   sprintf (reentryNum, "%d", vserver->reentryTime);
@@ -334,6 +336,8 @@
   *arg++ = realAddress;
   *arg++ = (char *) "-p";
   *arg++ = portNum;
+  *arg++ = (char *) "-r";
+  *arg++ = rportNum;
 
   if (vserver->fwmark)
     {
diff -uNr piranha-0.8.2-orig/nanny.8 piranha/nanny.8
--- piranha-0.8.2-orig/nanny.8	2006-01-11 14:35:17.000000000 -0600
+++ piranha/nanny.8	2006-10-10 08:18:01.000000000 -0500
@@ -14,7 +14,7 @@
 .BI "[-M|--method=" ARG "] [-U|--loadcmd=" ARG "]"
 .BI "[-n|--nodaemon] [-c|--nofork] [--test-start] [--norun]"
 .BI "[-p|--port=" ARG "] [-a|--reentrytime=" ARG "] [-h|--server=" ARG "]"
-.BI "[-f|--fwmark=" ARG "]"
+.BI "[-f|--fwmark=" ARG "] [-r|--rport=" ARG "]"
 .BI "[-v|--verbose] [-V|--virtaddress=" ARG "] [-w|--weight=" ARG "]"
 .BI "[-S|--scale=" ARG "] [-s|--send_string=" ARG "]"
 .BI "[-e|--send_program=" ARG "[-x|--expect_string=" ARG "]"
@@ -27,7 +27,7 @@
 .nf
 .BI "nanny [-t|--interval=" ARG "] [-U|--loadcmd=" ARG "]"
 .BI "[-n|--nodaemon] [-c|--nofork] [--test-start] [--norun]"
-.BI "[-p|--port=" ARG "] [-h|--server=" ARG "] [-v|--verbose]"
+.BI "[-p|--port=" ARG "] [-h|--server=" ARG "] [-r|--rport=" ARG "] [-v|--verbose]"
 .BI "[-V|--virtaddress=" ARG "] [-s|--send_string=" ARG "]"
 .BI "[-x|--expect_string=" ARG "] [-R|--startup=" ARG "]"
 .BI "[-D|--shutdown=" ARG "] [-u|--UDP] [-T|--suppress] [-?|--help]"
@@ -82,7 +82,8 @@
 Same as "--test-start".
 .TP
 .BI "-p|--port= "ARG
-Port for nanny to monitor on real server to check for service availability.
+Port used on the virtual IP address of the service to be monitored (fos), or
+the port used on the address of the virtual service to be monitored (lvsd).
 If omitted, port 80 (http) is assumed.
 .TP
 .BI "-a|--reentrytime= "ARG
@@ -108,6 +109,10 @@
 (lvsd). If this option is set, the \fI--virtaddress\fP option will be
 ignored.
 .TP
+.BI "-r|--rport= "ARG
+Port for nanny to monitor on the real server to check for service
+availability.  If omitted, port 80 (http) is assumed.
+.TP
 .BI "-V|--virtaddress= "ARG
 This is the virtual IP address of the service to be monitored (fos), or
 the address of the virtual service to be monitored (lvsd).
@@ -127,7 +132,10 @@
 file.
 The special token %h is replaced with the IP of each of the defined
 real servers and can be used more than once though it will carry the same
-IP of the defined real server that has been selected.
+IP of the defined real server that has been selected.  The special
+token %p is replaced with the port of each of the defined real servers
+and can be used more than once though it too will carry the same
+port value of the defined real server that has been selected.
 eg. 'ping -c1 %h'
 .TP
 .BI "-s|--send_str= "ARG
diff -uNr piranha-0.8.2-orig/nanny.c piranha/nanny.c
--- piranha-0.8.2-orig/nanny.c	2006-01-12 15:54:59.000000000 -0600
+++ piranha/nanny.c	2006-10-10 08:19:06.000000000 -0500
@@ -652,12 +652,13 @@
 
 int
 shutdownDev (int flags, char *ipvsadm, char *virtualAddress, int port,
-	     struct in_addr *remoteAddr, int service_type)
+	     struct in_addr *remoteAddr, int rport, int service_type)
 {
 
 	char *argv[40];
 	char **argp = argv;
 	char virtName[80];
+	char remoteName[80];
 	char fwmStr[20];
 	int rc = 0;
 
@@ -681,7 +682,8 @@
 		}
 
 		*argp++ = (char *) "-r";
-		*argp++ = inet_ntoa (*remoteAddr);
+		sprintf (remoteName, "%s:%d", inet_ntoa (*remoteAddr), rport);
+		*argp++ = remoteName;
 		*argp = NULL;
 
 		rc = runCommand (ipvsadm, flags, argv, -1);
@@ -693,11 +695,12 @@
 
 int
 adjustDevice (int flags, char *ipvsadm, char *virtualAddress, int port,
-	      struct in_addr *remoteAddr, char *routingMethod, int weight)
+	      struct in_addr *remoteAddr, int rport, char *routingMethod, int weight)
 {
 	char *argv[40];
 	char **argp = argv;
 	char virtName[80];
+	char remoteName[80];
 	char weightStr[20];
 	char fwmStr[20];
 
@@ -720,7 +723,8 @@
 	}
 
 	*argp++ = (char *) "-r";
-	*argp++ = inet_ntoa (*remoteAddr);
+	sprintf (remoteName, "%s:%d", inet_ntoa (*remoteAddr), rport);
+	*argp++ = remoteName;
 	*argp++ = routingMethod;
 	*argp++ = (char *) "-w";
 	*argp++ = weightStr;
@@ -731,13 +735,14 @@
 
 int
 bringUpDev (int flags, char *ipvsadm, char *virtualAddress, int port,
-	    struct in_addr *remoteAddr, char *routingMethod, int weight,
+	    struct in_addr *remoteAddr, int rport, char *routingMethod, int weight,
 	    int service_type)
 {
 
 	char *argv[40];
 	char **argp = argv;
 	char virtName[80];
+	char remoteName[80];
 	char weightStr[20];
 	char fwmStr[20];
 	int rc = 0;
@@ -764,7 +769,8 @@
 		}
 
 		*argp++ = (char *) "-r";
-		*argp++ = inet_ntoa (*remoteAddr);
+		sprintf (remoteName, "%s:%d", inet_ntoa (*remoteAddr), rport);
+		*argp++ = remoteName;
 		*argp++ = routingMethod;
 		*argp++ = (char *) "-w";
 		*argp++ = weightStr;
@@ -860,10 +866,11 @@
 
 int
 external_check (int flags, char *send_program, char *expect_str,
-		struct in_addr *remoteAddr, int timeout)
+		struct in_addr *remoteAddr, int rport, int timeout)
 {
 	char *result;
 	char *token = NULL;
+	char tokenTemp[20];
 	char temp[255];
 	char *argv[40];		/* need this to build up argument list */
 	char **argp = argv;
@@ -883,6 +890,10 @@
 		i++;
 		if (strcmp (token, "%h") == 0)
 			token = inet_ntoa (*remoteAddr);
+		else if (strcmp (token, "%p") == 0) {
+			sprintf (tokenTemp, "%d", rport);
+			token = tokenTemp;
+		}
 		*argp++ = token;
 		token = strtok (NULL, " ");
 	}
@@ -897,8 +908,8 @@
 
 	if (flags & NANNY_FLAG_VERBOSE)
 		piranha_log (flags, (char *)
-			     "Got result (%s) from command sent to (%s)\n",
-			     result, inet_ntoa (*remoteAddr));
+			     "Got result (%s) from command sent to (%s:%d)\n",
+			     result, inet_ntoa (*remoteAddr), rport);
 
 	if ((result == NULL) && (expect_str == NULL)) {
 		piranha_log (flags, (char *)
@@ -908,16 +919,16 @@
 
 	if (result == NULL) {
 		piranha_log (flags, (char *)
-			     "Ran the external sending program to (%s) but didn't get anything back\n",
-			     inet_ntoa (*remoteAddr));
+			     "Ran the external sending program to (%s:%d) but didn't get anything back\n",
+			     inet_ntoa (*remoteAddr), rport);
 		return 0;
 	}
 
 	if (expect_str != NULL) {
 		if (strcmp (expect_str, result) != 0) {
 			piranha_log (flags, (char *)
-				     "Trouble. Recieved results are not what we expected from (%s)\n",
-				     inet_ntoa (*remoteAddr));
+				     "Trouble. Recieved results are not what we expected from (%s:%d)\n",
+				     inet_ntoa (*remoteAddr), rport);
 			res = 1;
 		} else {
 			res = 0;
@@ -1005,7 +1016,7 @@
 
 int
 adjustWeight (int flags, char *ipvsadm, char *virtualAddress, int port,
-	      struct in_addr *remoteAddr, char *routingMethod, int weight,
+	      struct in_addr *remoteAddr, int rport, char *routingMethod, int weight,
 	      int interval, int scale, char *loadCommand, int lastWeight)
 {
 	int newWeight;
@@ -1020,10 +1031,10 @@
 			piranha_log (flags, (char *)
 				     "Adjusting weight of %s:%d to %d",
 				     inet_ntoa (*remoteAddr),
-				     port, newWeight);
+				     rport, newWeight);
 
 		if (adjustDevice (flags, ipvsadm, virtualAddress,
-				  port, remoteAddr, routingMethod, newWeight))
+				  port, remoteAddr, rport, routingMethod, newWeight))
 			return -1;
 	} else {
 		/* Querying the load information and adjusting the
@@ -1065,11 +1076,11 @@
 						     (char *)
 						     "Adjusting weight of %s:%d to %d",
 						     inet_ntoa(*remoteAddr),
-						     port, newWeight);
+						     rport, newWeight);
 
 				if (adjustDevice (flags, ipvsadm,
 						  virtualAddress, port,
-						  remoteAddr, routingMethod,
+						  remoteAddr, rport, routingMethod,
 						  newWeight))
 					return -1;
 
@@ -1085,7 +1096,7 @@
 
 int
 checkState (int flags, char *ipvsadm, char *virtualAddress, int port,
-	    struct in_addr *remoteAddr, char *routingMethod, int weight,
+	    struct in_addr *remoteAddr, int rport, char *routingMethod, int weight,
 	    int *isActive, sigset_t *sigs, int service_type)
 {
 	if (!nextState)
@@ -1103,7 +1114,7 @@
 					/* Virtual Server */
 					if (bringUpDev (flags, ipvsadm,
 							virtualAddress, port,
-							remoteAddr,
+							remoteAddr, rport, 
 							routingMethod,
 							weight, service_type))
 						return -1;
@@ -1120,7 +1131,7 @@
 					/* Virtual Server */
 					if (shutdownDev (flags, ipvsadm,
 							 virtualAddress, port,
-							 remoteAddr, service_type))
+							 remoteAddr, rport, service_type))
 						return -1;
 				}
 				*isActive = 0;
@@ -1145,7 +1156,7 @@
 
 int
 run (int flags, char *ipvsadm, char *virtualAddress, int port,
-     struct in_addr *remoteAddr, char *routingMethod, int weight,
+     struct in_addr *remoteAddr, int rport, char *routingMethod, int weight,
      int interval, int countThresh, int scale, char *loadCommand,
      char *send_program, char *send_str, char *expect_str,
      int quiesce_srv, int service_type)
@@ -1214,7 +1225,7 @@
 
 		if (isActive && service_type == SERV_LVS) {
 			if (shutdownDev (flags, ipvsadm, virtualAddress, port,
-					 remoteAddr, service_type))
+					 remoteAddr, rport, service_type))
 				exit (1);
 		}
 
@@ -1256,10 +1267,10 @@
 		if (send_program != NULL) {
 			isAvail =
 			    !external_check (flags, send_program, expect_str,
-					     remoteAddr, interval);
+					     remoteAddr, rport, interval);
 		} else {
 			isAvail =
-			    !pinger (flags, pingSocket, remoteAddr, port,
+			    !pinger (flags, pingSocket, remoteAddr, rport,
 				     interval, send_str, expect_str);
 		}
 
@@ -1311,7 +1322,7 @@
 				
 				piranha_log (flags,
 					     (char *) "making %s:%d available",
-					     inet_ntoa (*remoteAddr), port);
+					     inet_ntoa (*remoteAddr), rport);
 
 				/* compute the initial weight */
 				newWeight = weight >> 5;
@@ -1322,14 +1333,14 @@
 					if (adjustDevice
 					    (flags, ipvsadm,
 					     virtualAddress, port,
-					     remoteAddr, routingMethod,
+					     remoteAddr, rport, routingMethod,
 					     newWeight))
 						return -1;
 				} else {
 					if (bringUpDev
 					    (flags, ipvsadm,
 					     virtualAddress, port,
-					     remoteAddr, routingMethod,
+					     remoteAddr, rport, routingMethod,
 					     newWeight, service_type))
 						return -1;
 					isSrvUp = 1;
@@ -1350,7 +1361,7 @@
 				/* Failover Services */
 				piranha_log (flags, (char *)
 					     "Exiting due to connection failure of %s:%d",
-					     inet_ntoa (*remoteAddr), port);
+					     inet_ntoa (*remoteAddr), rport);
 
 				/*
 				** Start service locally
@@ -1364,19 +1375,19 @@
 				/* Virtual Services */
 				piranha_log (flags, (char *)
 					     "shutting down %s:%d due to connection failure",
-					     inet_ntoa (*remoteAddr), port);
+					     inet_ntoa (*remoteAddr), rport);
 
 				if (quiesce_srv && isSrvUp) {
 					if (adjustDevice
 					    (flags, ipvsadm,
 					     virtualAddress, port,
-					     remoteAddr, routingMethod, 0))
+					     remoteAddr, rport, routingMethod, 0))
 						return -1;
 				} else {
 					if (shutdownDev
 					    (flags, ipvsadm,
 					     virtualAddress, port,
-					     remoteAddr, service_type))
+					     remoteAddr, rport, service_type))
 						return -1;
 					isSrvUp = 0;
 				}
@@ -1405,7 +1416,7 @@
 		    (interval > 20 || currCount % (20 / interval) == 0)) {
 			rc = adjustWeight (flags, ipvsadm,
 					   virtualAddress, port,
-					   remoteAddr, routingMethod,
+					   remoteAddr, rport, routingMethod,
 					   weight, interval, scale,
 					   loadCommand, lastWeight);
 			if (rc < 0)
@@ -1428,7 +1439,7 @@
 			alarm (0);
 
 			rc = checkState(flags, ipvsadm, virtualAddress,
-					 port, remoteAddr, routingMethod,
+					 port, remoteAddr, rport, routingMethod,
 					 weight, &isActive, &sigs, service_type);
 			if (rc < 0)
 				return rc;
@@ -1526,6 +1537,7 @@
 	int teststart = 0;
 	int interval = 10;
 	int port = 80;
+	int rport = 80;
 	int weight = 1;
 	int reentryTime = 0;
 	int verbose = 0;
@@ -1550,7 +1562,7 @@
 	char *send_str = NULL;
 	char *expect_str = NULL;
 
-	/* Letters taken: DIMRSTUV acnpstuvwx */
+	/* Letters taken: DIMRSTUV acnprstuvwx */
 
 	struct poptOption options[] = {
 		{"interval", 't', POPT_ARG_INT, &interval, 0,
@@ -1573,6 +1585,9 @@
 		 N_("don't fork, but do disassociate")},
 
 		{"port", 'p', POPT_ARG_INT, &port, 0,
+		 N_("port on virtual service (default 80)")},
+
+		{"rport", 'r', POPT_ARG_INT, &rport, 0,
 		 N_("port to check for availability (default 80)")},
 
 		{"reentrytime", 'a', POPT_ARG_INT, &reentryTime, 0,
@@ -1760,10 +1775,10 @@
 			     virtualAddress, port);
 	else /* service_type == SERV_LVS */
 		piranha_log (flags, (char *)
-			     "starting LVS client monitor for %s:%d",
-			     virtualAddress, port);
+			     "starting LVS client monitor for %s:%d -> %s:%d",
+			     virtualAddress, port, server, rport);
 
-	return run (flags, vsadmPath, virtualAddress, port, &remoteAddr,
+	return run (flags, vsadmPath, virtualAddress, port, &remoteAddr, rport,
 		    routingMethod, weight, interval, countThresh, scale,
 		    loadCommand, send_program, send_str, expect_str,
 		    quiesce_srv, service_type);

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]