Forráskód Böngészése

net/rds: RDS-TCP: only initiate reconnect attempt on outgoing TCP socket.

When the peer of an RDS-TCP connection restarts, a reconnect
attempt should only be made from the active side  of the TCP
connection, i.e. the side that has a transient TCP port
number. Do not add the passive side of the TCP connection
to the c_hash_node and thus avoid triggering rds_queue_reconnect()
for passive rds connections.

Signed-off-by: Sowmini Varadhan <sowmini.varadhan@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Sowmini Varadhan 10 éve
szülő
commit
c82ac7e69e
1 módosított fájl, 11 hozzáadás és 2 törlés
  1. 11 2
      net/rds/connection.c

+ 11 - 2
net/rds/connection.c

@@ -234,13 +234,22 @@ new_conn:
 		/* Creating normal conn */
 		/* Creating normal conn */
 		struct rds_connection *found;
 		struct rds_connection *found;
 
 
-		found = rds_conn_lookup(head, laddr, faddr, trans);
+		if (!is_outgoing && otrans->t_type == RDS_TRANS_TCP)
+			found = NULL;
+		else
+			found = rds_conn_lookup(head, laddr, faddr, trans);
 		if (found) {
 		if (found) {
 			trans->conn_free(conn->c_transport_data);
 			trans->conn_free(conn->c_transport_data);
 			kmem_cache_free(rds_conn_slab, conn);
 			kmem_cache_free(rds_conn_slab, conn);
 			conn = found;
 			conn = found;
 		} else {
 		} else {
-			hlist_add_head_rcu(&conn->c_hash_node, head);
+			if ((is_outgoing && otrans->t_type == RDS_TRANS_TCP) ||
+			    (otrans->t_type != RDS_TRANS_TCP)) {
+				/* Only the active side should be added to
+				 * reconnect list for TCP.
+				 */
+				hlist_add_head_rcu(&conn->c_hash_node, head);
+			}
 			rds_cong_add_conn(conn);
 			rds_cong_add_conn(conn);
 			rds_conn_count++;
 			rds_conn_count++;
 		}
 		}