From b9afe470990082cdd91c481394f4e264dbc5a63b Mon Sep 17 00:00:00 2001 From: Lee Duncan Date: Tue, 25 Sep 2018 10:01:51 -0700 Subject: Limit session relogin attempts using config value. Add new configuration value session.relogin_max, which will default to 32. The limits the session-recovery relogin attempts to about 64 seconds (2 seconds between attempts) instead of an infinite number of retries. --- etc/iscsid.conf | 6 ++++++ libopeniscsiusr/default.c | 2 +- libopeniscsiusr/default.h | 3 +++ libopeniscsiusr/idbm.c | 2 ++ libopeniscsiusr/idbm_fields.h | 1 + usr/idbm.c | 4 +++- usr/idbm_fields.h | 1 + usr/initiator.c | 17 +++++++++++++++-- usr/initiator.h | 1 + usr/iscsi_settings.h | 3 +++ 10 files changed, 36 insertions(+), 4 deletions(-) diff --git a/etc/iscsid.conf b/etc/iscsid.conf index fee1148..dec3857 100644 --- a/etc/iscsid.conf +++ b/etc/iscsid.conf @@ -293,6 +293,12 @@ discovery.sendtargets.iscsi.MaxRecvDataSegmentLength = 32768 # appropriate number of sessions is created. node.session.nr_sessions = 1 +# When iscsid starts up it recovers existing sesssions, if possible. +# If the target has gone away when this occurs, this value +# limits the number of retries to re-login. +# Retries are done every 2 seconds. +node.session.reopen_max = 32 + #************ # Workarounds #************ diff --git a/libopeniscsiusr/default.c b/libopeniscsiusr/default.c index cd80e80..d01d892 100644 --- a/libopeniscsiusr/default.c +++ b/libopeniscsiusr/default.c @@ -76,7 +76,7 @@ void _default_node(struct iscsi_node *node) node->session.queue_depth = QUEUE_DEPTH; node->session.nr_sessions = 1; node->session.initial_login_retry_max = DEF_INITIAL_LOGIN_RETRIES_MAX; - node->session.reopen_max = 32; + node->session.reopen_max = DEF_SESSION_REOPEN_MAX; node->session.auth.authmethod = 0; node->session.auth.password_length = 0; node->session.auth.password_in_length = 0; diff --git a/libopeniscsiusr/default.h b/libopeniscsiusr/default.h index bb9e5fa..1ab951c 100644 --- a/libopeniscsiusr/default.h +++ b/libopeniscsiusr/default.h @@ -54,6 +54,9 @@ #define DEF_TGT_RESET_TIMEO 30 #define DEF_HOST_RESET_TIMEO 60 +/* session reopen max retries */ +#define DEF_SESSION_REOPEN_MAX 32 + /* default window size */ #define TCP_WINDOW_SIZE (512 * 1024) diff --git a/libopeniscsiusr/idbm.c b/libopeniscsiusr/idbm.c index 2639430..7724de2 100644 --- a/libopeniscsiusr/idbm.c +++ b/libopeniscsiusr/idbm.c @@ -981,6 +981,8 @@ static void _idbm_node_rec_link(struct iscsi_node *node, struct idbm_rec *recs) _CAN_MODIFY); _rec_int_o2(SESSION_SCAN, recs, node, session.scan, IDBM_SHOW, "manual", "auto", num, _CAN_MODIFY); + _rec_int64(SESSION_REOPEN_MAX, recs, node, session.reopen_max, IDBM_SHOW, num, + _CAN_MODIFY); _rec_str(CONN_ADDR, recs, node, conn.address, IDBM_SHOW, num, _CANNOT_MODIFY); diff --git a/libopeniscsiusr/idbm_fields.h b/libopeniscsiusr/idbm_fields.h index 3b28089..29a2090 100644 --- a/libopeniscsiusr/idbm_fields.h +++ b/libopeniscsiusr/idbm_fields.h @@ -136,6 +136,7 @@ #define SESSION_MAX_R2T "node.session.iscsi.MaxOutstandingR2T" #define SESSION_ERL "node.session.iscsi.ERL" #define SESSION_SCAN "node.session.scan" +#define SESSION_REOPEN_MAX "node.session.reopen_max" /* connections fields */ #define CONN_ADDR "node.conn[0].address" diff --git a/usr/idbm.c b/usr/idbm.c index 830189f..a0207e2 100644 --- a/usr/idbm.c +++ b/usr/idbm.c @@ -468,6 +468,8 @@ idbm_recinfo_node(node_rec_t *r, recinfo_t *ri) __recinfo_int_o2(SESSION_SCAN, ri, r, session.scan, IDBM_SHOW, "manual", "auto", num, 1); + __recinfo_int(SESSION_REOPEN_MAX, ri, r, + session.reopen_max, IDBM_SHOW, num, 1); for (i = 0; i < ISCSI_CONN_MAX; i++) { char key[NAME_MAXVAL]; @@ -2978,7 +2980,7 @@ void idbm_node_setup_defaults(node_rec_t *rec) rec->session.queue_depth = QUEUE_DEPTH; rec->session.nr_sessions = 1; rec->session.initial_login_retry_max = DEF_INITIAL_LOGIN_RETRIES_MAX; - rec->session.reopen_max = 32; + rec->session.reopen_max = DEF_SESSION_REOPEN_MAX; rec->session.auth.authmethod = 0; rec->session.auth.password_length = 0; rec->session.auth.password_in_length = 0; diff --git a/usr/idbm_fields.h b/usr/idbm_fields.h index f73febc..142c7ae 100644 --- a/usr/idbm_fields.h +++ b/usr/idbm_fields.h @@ -46,6 +46,7 @@ #define SESSION_MAX_R2T "node.session.iscsi.MaxOutstandingR2T" #define SESSION_ERL "node.session.iscsi.ERL" #define SESSION_SCAN "node.session.scan" +#define SESSION_REOPEN_MAX "node.session.reopen_max" /* connections fields */ #define CONN_ADDR "node.conn[%d].address" diff --git a/usr/initiator.c b/usr/initiator.c index 935056a..be53c35 100644 --- a/usr/initiator.c +++ b/usr/initiator.c @@ -253,6 +253,7 @@ __session_conn_create(iscsi_session_t *session, int cid) { iscsi_conn_t *conn = &session->conn[cid]; conn_rec_t *conn_rec = &session->nrec.conn[cid]; + node_rec_t *rec = &session->nrec; int err; if (iscsi_ev_context_alloc(conn)) { @@ -260,6 +261,9 @@ __session_conn_create(iscsi_session_t *session, int cid) return ISCSI_ERR_NOMEM; } + /* set session reconnection retry max */ + session->reopen_max = rec->session.reopen_max; + conn->state = ISCSI_CONN_STATE_FREE; conn->session = session; actor_init(&conn->login_timer, iscsi_login_timedout, NULL); @@ -416,6 +420,9 @@ __session_create(node_rec_t *rec, struct iscsi_transport *t, int *rc) } } + /* reset session reopen count */ + session->reopen_cnt = 0; + list_add_tail(&session->list, &t->sessions); return session; @@ -724,8 +731,14 @@ static void iscsi_login_eh(struct iscsi_conn *conn, struct queue_task *qtask, break; case R_STAGE_SESSION_REOPEN: log_debug(6, "login failed ISCSI_CONN_STATE_XPT_WAIT/" - "R_STAGE_SESSION_REOPEN %d", - session->reopen_cnt); + "R_STAGE_SESSION_REOPEN (reopen_cnt=%d, reopen_max=%d)", + session->reopen_cnt, session->reopen_max); + if (session->reopen_cnt > session->reopen_max) { + log_info("Giving up on session %d after %d retries", + session->id, session->reopen_max); + session_conn_shutdown(conn, qtask, err); + break; + } /* timeout during reopen connect. try again */ session_conn_reopen(conn, qtask, 0); break; diff --git a/usr/initiator.h b/usr/initiator.h index 3ee1454..841590a 100644 --- a/usr/initiator.h +++ b/usr/initiator.h @@ -248,6 +248,7 @@ typedef struct iscsi_session { /* connection reopens during recovery */ int reopen_cnt; + int reopen_max; queue_task_t reopen_qtask; iscsi_session_r_stage_e r_stage; uint32_t replacement_timeout; diff --git a/usr/iscsi_settings.h b/usr/iscsi_settings.h index 296ff40..da2bdf9 100644 --- a/usr/iscsi_settings.h +++ b/usr/iscsi_settings.h @@ -14,6 +14,9 @@ #define DEF_TGT_RESET_TIMEO 30 #define DEF_HOST_RESET_TIMEO 60 +/* session reopen max retries */ +#define DEF_SESSION_REOPEN_MAX 32 + /* q depths */ #define CMDS_MAX 128 #define QUEUE_DEPTH 32 -- cgit v1.2.1