summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--etc/iscsid.conf6
-rw-r--r--libopeniscsiusr/default.c2
-rw-r--r--libopeniscsiusr/default.h3
-rw-r--r--libopeniscsiusr/idbm.c2
-rw-r--r--libopeniscsiusr/idbm_fields.h1
-rw-r--r--usr/idbm.c4
-rw-r--r--usr/idbm_fields.h1
-rw-r--r--usr/initiator.c17
-rw-r--r--usr/initiator.h1
-rw-r--r--usr/iscsi_settings.h3
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