netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [patch 0/2] ipvs: Expose synced connections in proc
@ 2007-11-14 18:24 Simon Horman
  2007-11-14 18:24 ` [patch 1/2] ipvs: Flag synced connections and expose them " Simon Horman
  2007-11-14 18:24 ` [patch 2/2] ipvs: Create synced connections with their real state Simon Horman
  0 siblings, 2 replies; 5+ messages in thread
From: Simon Horman @ 2007-11-14 18:24 UTC (permalink / raw)
  To: netdev
  Cc: Wensong Zhang, Julian Anastasov, jmack, graeme, Rumen Bogdanovski,
	David Miller

Two patches from Rumen Bogdanovski to enhance the connection
synchronisation code. Dave, please consider for inclusion,
they have been aired on lvs-devel.

-- 
Horms
  H: http://www.vergenet.net/~horms/
  W: http://www.valinux.co.jp/en/


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [patch 1/2] ipvs: Flag synced connections and expose them in proc
  2007-11-14 18:24 [patch 0/2] ipvs: Expose synced connections in proc Simon Horman
@ 2007-11-14 18:24 ` Simon Horman
  2007-11-20  5:52   ` David Miller
  2007-11-14 18:24 ` [patch 2/2] ipvs: Create synced connections with their real state Simon Horman
  1 sibling, 1 reply; 5+ messages in thread
From: Simon Horman @ 2007-11-14 18:24 UTC (permalink / raw)
  To: netdev
  Cc: Wensong Zhang, Julian Anastasov, jmack, graeme, Rumen Bogdanovski,
	David Miller

[-- Attachment #1: ipvs-showsync.patch --]
[-- Type: text/plain, Size: 3136 bytes --]

From: Rumen Bogdanovski <rumen@voicecho.com>

This patch labels the sync-created connections with IP_VS_CONN_F_SYNC
flag and creates /proc/net/ip_vs_conn_sync to enable monitoring of the
origin of the connections, if they are local or created by the 
synchronization.

Signed-off-by: Rumen G. Bogdanovski <rumen@voicecho.com>
Signed-off-by: Simon Horman <horms@verge.net.au>

diff -Naur net-2.6_orig/net/ipv4/ipvs/ip_vs_conn.c net-2.6_work/net/ipv4/ipvs/ip_vs_conn.c
--- net-2.6_orig/net/ipv4/ipvs/ip_vs_conn.c	2007-11-13 12:37:07.000000000 +0200
+++ net-2.6_work/net/ipv4/ipvs/ip_vs_conn.c	2007-11-13 21:57:58.000000000 +0200
@@ -783,6 +783,57 @@
 	.llseek  = seq_lseek,
 	.release = seq_release,
 };
+
+static const char *ip_vs_origin_name(unsigned flags)
+{
+	if (flags & IP_VS_CONN_F_SYNC)
+		return "SYNC";
+	else
+		return "LOCAL";
+}
+
+static int ip_vs_conn_sync_seq_show(struct seq_file *seq, void *v)
+{
+
+	if (v == SEQ_START_TOKEN)
+		seq_puts(seq,
+   "Pro FromIP   FPrt ToIP     TPrt DestIP   DPrt State       Origin Expires\n");
+	else {
+		const struct ip_vs_conn *cp = v;
+
+		seq_printf(seq,
+			"%-3s %08X %04X %08X %04X %08X %04X %-11s %-6s %7lu\n",
+				ip_vs_proto_name(cp->protocol),
+				ntohl(cp->caddr), ntohs(cp->cport),
+				ntohl(cp->vaddr), ntohs(cp->vport),
+				ntohl(cp->daddr), ntohs(cp->dport),
+				ip_vs_state_name(cp->protocol, cp->state),
+				ip_vs_origin_name(cp->flags),
+				(cp->timer.expires-jiffies)/HZ);
+	}
+	return 0;
+}
+
+static const struct seq_operations ip_vs_conn_sync_seq_ops = {
+	.start = ip_vs_conn_seq_start,
+	.next  = ip_vs_conn_seq_next,
+	.stop  = ip_vs_conn_seq_stop,
+	.show  = ip_vs_conn_sync_seq_show,
+};
+
+static int ip_vs_conn_sync_open(struct inode *inode, struct file *file)
+{
+	return seq_open(file, &ip_vs_conn_sync_seq_ops);
+}
+
+static const struct file_operations ip_vs_conn_sync_fops = {
+	.owner	 = THIS_MODULE,
+	.open    = ip_vs_conn_sync_open,
+	.read    = seq_read,
+	.llseek  = seq_lseek,
+	.release = seq_release,
+};
+
 #endif
 
 
@@ -942,6 +993,7 @@
 	}
 
 	proc_net_fops_create(&init_net, "ip_vs_conn", 0, &ip_vs_conn_fops);
+	proc_net_fops_create(&init_net, "ip_vs_conn_sync", 0, &ip_vs_conn_sync_fops);
 
 	/* calculate the random value for connection hash */
 	get_random_bytes(&ip_vs_conn_rnd, sizeof(ip_vs_conn_rnd));
@@ -958,5 +1010,6 @@
 	/* Release the empty cache */
 	kmem_cache_destroy(ip_vs_conn_cachep);
 	proc_net_remove(&init_net, "ip_vs_conn");
+	proc_net_remove(&init_net, "ip_vs_conn_sync");
 	vfree(ip_vs_conn_tab);
 }
diff -Naur net-2.6_orig/net/ipv4/ipvs/ip_vs_sync.c net-2.6_work/net/ipv4/ipvs/ip_vs_sync.c
--- net-2.6_orig/net/ipv4/ipvs/ip_vs_sync.c	2007-11-13 12:37:07.000000000 +0200
+++ net-2.6_work/net/ipv4/ipvs/ip_vs_sync.c	2007-11-13 21:42:59.000000000 +0200
@@ -308,7 +308,7 @@
 		unsigned flags;
 
 		s = (struct ip_vs_sync_conn *)p;
-		flags = ntohs(s->flags);
+		flags = ntohs(s->flags) | IP_VS_CONN_F_SYNC;
 		if (!(flags & IP_VS_CONN_F_TEMPLATE))
 			cp = ip_vs_conn_in_get(s->protocol,
 					       s->caddr, s->cport,

-- 

-- 
Horms
  H: http://www.vergenet.net/~horms/
  W: http://www.valinux.co.jp/en/


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [patch 2/2] ipvs: Create synced connections with their real state
  2007-11-14 18:24 [patch 0/2] ipvs: Expose synced connections in proc Simon Horman
  2007-11-14 18:24 ` [patch 1/2] ipvs: Flag synced connections and expose them " Simon Horman
@ 2007-11-14 18:24 ` Simon Horman
  2007-11-20  5:53   ` David Miller
  1 sibling, 1 reply; 5+ messages in thread
From: Simon Horman @ 2007-11-14 18:24 UTC (permalink / raw)
  To: netdev
  Cc: Wensong Zhang, Julian Anastasov, jmack, graeme, Rumen Bogdanovski,
	David Miller

[-- Attachment #1: ipvs-sync-setstate.patch --]
[-- Type: text/plain, Size: 4478 bytes --]

With this patch the synced connections are created with their real state,
which can be changed on the next synchronizations if necessary. This way 
on fail-over all the connections will be treated according to their actual
state, causing no scheduling problems (the active and the nonactive 
connections have different weights in the schedulers). 
The backwards compatibility is preserved and the existing tools will show
the true connection states even on the backup director. 
 
Signed-off-by: Rumen G. Bogdanovski <rumen@voicecho.com> 
Signed-off-by: Simon Horman <horms@verge.net.au>

diff -Naur net-2.6_work/net/ipv4/ipvs/ip_vs_conn.c net-2.6_work1/net/ipv4/ipvs/ip_vs_conn.c
--- net-2.6_work/net/ipv4/ipvs/ip_vs_conn.c	2007-11-13 21:57:58.000000000 +0200
+++ net-2.6_work1/net/ipv4/ipvs/ip_vs_conn.c	2007-11-13 23:12:39.000000000 +0200
@@ -393,7 +393,15 @@
 	atomic_inc(&dest->refcnt);
 
 	/* Bind with the destination and its corresponding transmitter */
-	cp->flags |= atomic_read(&dest->conn_flags);
+	if ((cp->flags & IP_VS_CONN_F_SYNC) &&
+	    (!(cp->flags & IP_VS_CONN_F_TEMPLATE)))
+		/* if the connection is not template and is created
+		 * by sync, preserve the activity flag.
+		 */
+		cp->flags |= atomic_read(&dest->conn_flags) &
+			     (~IP_VS_CONN_F_INACTIVE);
+	else
+		cp->flags |= atomic_read(&dest->conn_flags);
 	cp->dest = dest;
 
 	IP_VS_DBG(7, "Bind-dest %s c:%u.%u.%u.%u:%d v:%u.%u.%u.%u:%d "
@@ -412,7 +420,11 @@
 		/* It is a normal connection, so increase the inactive
 		   connection counter because it is in TCP SYNRECV
 		   state (inactive) or other protocol inacive state */
-		atomic_inc(&dest->inactconns);
+		if ((cp->flags & IP_VS_CONN_F_SYNC) &&
+		    (!(cp->flags & IP_VS_CONN_F_INACTIVE)))
+			atomic_inc(&dest->activeconns);
+		else
+			atomic_inc(&dest->inactconns);
 	} else {
 		/* It is a persistent connection/template, so increase
 		   the peristent connection counter */
diff -Naur net-2.6_work/net/ipv4/ipvs/ip_vs_sync.c net-2.6_work1/net/ipv4/ipvs/ip_vs_sync.c
--- net-2.6_work/net/ipv4/ipvs/ip_vs_sync.c	2007-11-13 21:42:59.000000000 +0200
+++ net-2.6_work1/net/ipv4/ipvs/ip_vs_sync.c	2007-11-13 23:04:04.000000000 +0200
@@ -305,10 +305,11 @@
 
 	p = (char *)buffer + sizeof(struct ip_vs_sync_mesg);
 	for (i=0; i<m->nr_conns; i++) {
-		unsigned flags;
+		unsigned flags, state;
 
 		s = (struct ip_vs_sync_conn *)p;
 		flags = ntohs(s->flags) | IP_VS_CONN_F_SYNC;
+		state = ntohs(s->state);
 		if (!(flags & IP_VS_CONN_F_TEMPLATE))
 			cp = ip_vs_conn_in_get(s->protocol,
 					       s->caddr, s->cport,
@@ -326,6 +327,13 @@
 			dest = ip_vs_find_dest(s->daddr, s->dport,
 					       s->vaddr, s->vport,
 					       s->protocol);
+			/*  Set the approprite ativity flag */
+			if (s->protocol == IPPROTO_TCP) {
+				if (state != IP_VS_TCP_S_ESTABLISHED)
+					flags |= IP_VS_CONN_F_INACTIVE;
+				else
+					flags &= ~IP_VS_CONN_F_INACTIVE;
+			}
 			cp = ip_vs_conn_new(s->protocol,
 					    s->caddr, s->cport,
 					    s->vaddr, s->vport,
@@ -337,7 +345,7 @@
 				IP_VS_ERR("ip_vs_conn_new failed\n");
 				return;
 			}
-			cp->state = ntohs(s->state);
+			cp->state = state;
 		} else if (!cp->dest) {
 			dest = ip_vs_try_bind_dest(cp);
 			if (!dest) {
@@ -346,8 +354,22 @@
 				cp->flags = flags | IP_VS_CONN_F_HASHED;
 			} else
 				atomic_dec(&dest->refcnt);
-		}	/* Note that we don't touch its state and flags
-			   if it is a normal entry. */
+		} else if ((cp->dest) && (cp->protocol == IPPROTO_TCP) &&
+			   (cp->state != state)) {
+			/* update active/inactive flag for the connection */
+			dest = cp->dest;
+			if (!(cp->flags & IP_VS_CONN_F_INACTIVE) &&
+				(state != IP_VS_TCP_S_ESTABLISHED)) {
+				atomic_dec(&dest->activeconns);
+				atomic_inc(&dest->inactconns);
+				cp->flags |= IP_VS_CONN_F_INACTIVE;
+			} else if ((cp->flags & IP_VS_CONN_F_INACTIVE) &&
+				(state == IP_VS_TCP_S_ESTABLISHED)) {
+				atomic_inc(&dest->activeconns);
+				atomic_dec(&dest->inactconns);
+				cp->flags &= ~IP_VS_CONN_F_INACTIVE;
+			}
+		}
 
 		if (flags & IP_VS_CONN_F_SEQ_MASK) {
 			opt = (struct ip_vs_sync_conn_options *)&s[1];
@@ -357,7 +379,7 @@
 			p += SIMPLE_CONN_SIZE;
 
 		atomic_set(&cp->in_pkts, sysctl_ip_vs_sync_threshold[0]);
-		cp->state = ntohs(s->state);
+		cp->state = state;
 		pp = ip_vs_proto_get(s->protocol);
 		cp->timeout = pp->timeout_table[cp->state];
 		ip_vs_conn_put(cp);

-- 

-- 
Horms
  H: http://www.vergenet.net/~horms/
  W: http://www.valinux.co.jp/en/


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [patch 1/2] ipvs: Flag synced connections and expose them in proc
  2007-11-14 18:24 ` [patch 1/2] ipvs: Flag synced connections and expose them " Simon Horman
@ 2007-11-20  5:52   ` David Miller
  0 siblings, 0 replies; 5+ messages in thread
From: David Miller @ 2007-11-20  5:52 UTC (permalink / raw)
  To: horms; +Cc: netdev, wensong, ja, jmack, graeme, rumen

From: Simon Horman <horms@verge.net.au>
Date: Wed, 14 Nov 2007 10:24:40 -0800

> From: Rumen Bogdanovski <rumen@voicecho.com>
> 
> This patch labels the sync-created connections with IP_VS_CONN_F_SYNC
> flag and creates /proc/net/ip_vs_conn_sync to enable monitoring of the
> origin of the connections, if they are local or created by the 
> synchronization.
> 
> Signed-off-by: Rumen G. Bogdanovski <rumen@voicecho.com>
> Signed-off-by: Simon Horman <horms@verge.net.au>

Applied to net-2.6.25

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [patch 2/2] ipvs: Create synced connections with their real state
  2007-11-14 18:24 ` [patch 2/2] ipvs: Create synced connections with their real state Simon Horman
@ 2007-11-20  5:53   ` David Miller
  0 siblings, 0 replies; 5+ messages in thread
From: David Miller @ 2007-11-20  5:53 UTC (permalink / raw)
  To: horms; +Cc: netdev, wensong, ja, jmack, graeme, rumen

From: Simon Horman <horms@verge.net.au>
Date: Wed, 14 Nov 2007 10:24:41 -0800

> With this patch the synced connections are created with their real state,
> which can be changed on the next synchronizations if necessary. This way 
> on fail-over all the connections will be treated according to their actual
> state, causing no scheduling problems (the active and the nonactive 
> connections have different weights in the schedulers). 
> The backwards compatibility is preserved and the existing tools will show
> the true connection states even on the backup director. 
>  
> Signed-off-by: Rumen G. Bogdanovski <rumen@voicecho.com> 
> Signed-off-by: Simon Horman <horms@verge.net.au>

Also applied to net-2.6.25, thanks!

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2007-11-20  5:53 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-11-14 18:24 [patch 0/2] ipvs: Expose synced connections in proc Simon Horman
2007-11-14 18:24 ` [patch 1/2] ipvs: Flag synced connections and expose them " Simon Horman
2007-11-20  5:52   ` David Miller
2007-11-14 18:24 ` [patch 2/2] ipvs: Create synced connections with their real state Simon Horman
2007-11-20  5:53   ` David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).