From 7b496d4c03bb4a5bd27258c67186cd57c89b68a4 Mon Sep 17 00:00:00 2001 From: jacob Date: Fri, 20 May 2005 23:25:36 +0000 Subject: [PATCH] b=6359 r=adilger, phil Severity: : enhancement Bugzilla : 3262, 6359 Description: Attempts to reconnect to servers are now more aggressive. Details : This builds on the enhanced upcall-less recovery that was added in 1.4.2. When trying to reconnect to servers, clients will now try each server in the failover group every 10 seconds. By default, clients would previously try one server every 25 seconds. --- lustre/ChangeLog | 8 ++++ lustre/ldlm/ldlm_lib.c | 10 +++-- lustre/ptlrpc/import.c | 82 ++++++++++++++++++++++++----------------- lustre/ptlrpc/pinger.c | 10 ++++- lustre/ptlrpc/ptlrpc_internal.h | 1 + 5 files changed, 72 insertions(+), 39 deletions(-) diff --git a/lustre/ChangeLog b/lustre/ChangeLog index 3f69618..1ec8321 100644 --- a/lustre/ChangeLog +++ b/lustre/ChangeLog @@ -52,6 +52,14 @@ Description: Racing close and eviction MDS could cause assertion in mds_close Details : It was possible to get multiple mfd references during close and client eviction, leading to one thread referencing a freed mfd. +Severity: : enhancement +Bugzilla : 3262, 6359 +Description: Attempts to reconnect to servers are now more aggressive. +Details : This builds on the enhanced upcall-less recovery that was added + in 1.4.2. When trying to reconnect to servers, clients will + now try each server in the failover group every 10 seconds. By + default, clients would previously try one server every 25 seconds. + ------------------------------------------------------------------------------ 2005-05-05 Cluster File Systems, Inc. diff --git a/lustre/ldlm/ldlm_lib.c b/lustre/ldlm/ldlm_lib.c index b2808b4..7b3706e 100644 --- a/lustre/ldlm/ldlm_lib.c +++ b/lustre/ldlm/ldlm_lib.c @@ -71,7 +71,6 @@ static int import_set_conn(struct obd_import *imp, struct obd_uuid *uuid, if (priority) { list_del(&item->oic_item); list_add(&item->oic_item, &imp->imp_conn_list); - item->oic_last_attempt = 0; } CDEBUG(D_HA, "imp %p@%s: found existing conn %s%s\n", imp, imp->imp_obd->obd_name, uuid->uuid, @@ -84,7 +83,6 @@ static int import_set_conn(struct obd_import *imp, struct obd_uuid *uuid, if (create) { imp_conn->oic_conn = ptlrpc_conn; imp_conn->oic_uuid = *uuid; - imp_conn->oic_last_attempt = 0; if (priority) list_add(&imp_conn->oic_item, &imp->imp_conn_list); else @@ -122,13 +120,13 @@ int client_import_add_conn(struct obd_import *imp, struct obd_uuid *uuid, int client_import_del_conn(struct obd_import *imp, struct obd_uuid *uuid) { struct obd_import_conn *imp_conn; + struct obd_import_conn *cur_conn; struct obd_export *dlmexp; int rc = -ENOENT; ENTRY; spin_lock(&imp->imp_lock); if (list_empty(&imp->imp_conn_list)) { - LASSERT(!imp->imp_conn_current); LASSERT(!imp->imp_connection); GOTO(out, rc); } @@ -138,8 +136,12 @@ int client_import_del_conn(struct obd_import *imp, struct obd_uuid *uuid) continue; LASSERT(imp_conn->oic_conn); + cur_conn = list_entry(imp->imp_conn_list.next, + struct obd_import_conn, + oic_item); + /* is current conn? */ - if (imp_conn == imp->imp_conn_current) { + if (imp_conn == cur_conn) { LASSERT(imp_conn->oic_conn == imp->imp_connection); if (imp->imp_state != LUSTRE_IMP_CLOSED && diff --git a/lustre/ptlrpc/import.c b/lustre/ptlrpc/import.c index bf590b4..3eed4f4 100644 --- a/lustre/ptlrpc/import.c +++ b/lustre/ptlrpc/import.c @@ -243,14 +243,10 @@ void ptlrpc_fail_import(struct obd_import *imp, int generation) EXIT; } -#define ATTEMPT_TOO_SOON(last) \ - ((last) && ((long)(jiffies - (last)) <= (long)(obd_timeout * 2 * HZ))) - static int import_select_connection(struct obd_import *imp) { - struct obd_import_conn *imp_conn, *tmp; + struct obd_import_conn *imp_conn; struct obd_export *dlmexp; - int found = 0; ENTRY; spin_lock(&imp->imp_lock); @@ -262,34 +258,13 @@ static int import_select_connection(struct obd_import *imp) RETURN(-EINVAL); } - list_for_each_entry(imp_conn, &imp->imp_conn_list, oic_item) { - if (!imp_conn->oic_last_attempt || - time_after(jiffies, imp_conn->oic_last_attempt + - obd_timeout * 2 * HZ)) { - found = 1; - break; - } - } - - /* if not found, simply choose the current one */ - if (!found) { - CDEBUG(D_NET, "%s: continuing with current connection\n", - imp->imp_obd->obd_name); - LASSERT(imp->imp_conn_current); - imp_conn = imp->imp_conn_current; - } - LASSERT(imp_conn->oic_conn); - - imp_conn->oic_last_attempt = jiffies; - - /* move the items ahead of the selected one to list tail */ - while (1) { - tmp= list_entry(imp->imp_conn_list.next, - struct obd_import_conn, oic_item); - if (tmp == imp_conn) - break; - list_del(&tmp->oic_item); - list_add_tail(&tmp->oic_item, &imp->imp_conn_list); + if (imp->imp_conn_current && + !(imp->imp_conn_current->oic_item.next == &imp->imp_conn_list)) { + imp_conn = list_entry(imp->imp_conn_current->oic_item.next, + struct obd_import_conn, oic_item); + } else { + imp_conn = list_entry(imp->imp_conn_list.next, + struct obd_import_conn, oic_item); } /* switch connection, don't mind if it's same as the current one */ @@ -405,6 +380,36 @@ out: RETURN(rc); } +static void ptlrpc_maybe_ping_import_soon(struct obd_import *imp) +{ + struct obd_import_conn *imp_conn; + unsigned long flags; + int wake_pinger = 0; + + ENTRY; + + spin_lock_irqsave(&imp->imp_lock, flags); + if (list_empty(&imp->imp_conn_list)) + GOTO(unlock, 0); + + imp_conn = list_entry(imp->imp_conn_list.prev, + struct obd_import_conn, + oic_item); + + if (imp->imp_conn_current != imp_conn) { + ptlrpc_ping_import_soon(imp); + wake_pinger = 1; + } + + unlock: + spin_unlock_irqrestore(&imp->imp_lock, flags); + + if (wake_pinger) + ptlrpc_pinger_wake_up(); + + EXIT; +} + static int ptlrpc_connect_interpret(struct ptlrpc_request *request, void * data, int rc) { @@ -426,7 +431,6 @@ static int ptlrpc_connect_interpret(struct ptlrpc_request *request, GOTO(out, rc); LASSERT(imp->imp_conn_current); - imp->imp_conn_current->oic_last_attempt = 0; msg_flags = lustre_msg_get_op_flags(request->rq_repmsg); @@ -442,6 +446,7 @@ static int ptlrpc_connect_interpret(struct ptlrpc_request *request, imp->imp_replayable = 0; } imp->imp_remote_handle = request->rq_repmsg->handle; + IMPORT_SET_STATE(imp, LUSTRE_IMP_FULL); GOTO(finish, rc = 0); } @@ -520,13 +525,22 @@ finish: ptlrpc_connect_import(imp, NULL); RETURN(0); } + } else { + list_del(&imp->imp_conn_current->oic_item); + list_add(&imp->imp_conn_current->oic_item, + &imp->imp_conn_list); + imp->imp_conn_current = NULL; } + out: if (rc != 0) { IMPORT_SET_STATE(imp, LUSTRE_IMP_DISCON); if (aa->pcaa_initial_connect && !imp->imp_initial_recov) { ptlrpc_deactivate_import(imp); } + + ptlrpc_maybe_ping_import_soon(imp); + CDEBUG(D_HA, "recovery of %s on %s failed (%d)\n", imp->imp_target_uuid.uuid, (char *)imp->imp_connection->c_remote_uuid.uuid, rc); diff --git a/lustre/ptlrpc/pinger.c b/lustre/ptlrpc/pinger.c index 165f36a..63fc101 100644 --- a/lustre/ptlrpc/pinger.c +++ b/lustre/ptlrpc/pinger.c @@ -66,7 +66,15 @@ int ptlrpc_ping(struct obd_import *imp) static inline void ptlrpc_update_next_ping(struct obd_import *imp) { - imp->imp_next_ping = jiffies + PING_INTERVAL * HZ; + imp->imp_next_ping = jiffies + HZ * + (imp->imp_state == LUSTRE_IMP_DISCON + ? 10 + : PING_INTERVAL); +} + +void ptlrpc_ping_import_soon(struct obd_import *imp) +{ + imp->imp_next_ping = jiffies; } #ifdef __KERNEL__ diff --git a/lustre/ptlrpc/ptlrpc_internal.h b/lustre/ptlrpc/ptlrpc_internal.h index e49b5f9..1c92f6f 100644 --- a/lustre/ptlrpc/ptlrpc_internal.h +++ b/lustre/ptlrpc/ptlrpc_internal.h @@ -117,5 +117,6 @@ int ptlrpc_start_pinger(void); int ptlrpc_stop_pinger(void); void ptlrpc_pinger_sending_on_import(struct obd_import *imp); void ptlrpc_pinger_wake_up(void); +void ptlrpc_ping_import_soon(struct obd_import *imp); #endif /* PTLRPC_INTERNAL_H */ -- 1.8.3.1