diff options
author | Lee Duncan <lduncan@suse.com> | 2021-02-04 13:09:48 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-02-04 13:09:48 -0800 |
commit | 0068fd9bea9939866735038bf8dac0c878ede867 (patch) | |
tree | ca08e6f91289d9f04401ee33c508c75b3f2116be | |
parent | f7231ca0e2336d3e26655d49adee1464cb592d01 (diff) | |
parent | 19f1ae0b7bbcc3376153cf9f18b33d5db9d6e176 (diff) | |
download | open-iscsi-0068fd9bea9939866735038bf8dac0c878ede867.tar.gz |
Merge pull request #248 from gonzoleeman/iscsistart-timeout-fix
Fix iscsistart login issue when target is delayed.
-rw-r--r-- | usr/iscsistart.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/usr/iscsistart.c b/usr/iscsistart.c index 73991b3..755489f 100644 --- a/usr/iscsistart.c +++ b/usr/iscsistart.c @@ -241,12 +241,25 @@ static int login_session(struct node_rec *rec) /* * Need to handle race where iscsid proc is starting up while we are * trying to connect. Retry with exponential backoff, start from 50 ms. + * + * NOTE: another race condition can occur if the system is just coming + * up, where our login request will be sent, but the login response + * takes a while. In such a case, if we timeout and give up, the + * login response may still show up once we give up, in which case + * it seems to get iscsistart into a state where it cannot try to + * login again because it thinks there's already a session. So make + * sure our timeout is long enough, on each try, to give the response + * a chance to show up. The old value of 1 second was not enough, + * so we multiply that by 10, which seems reasonable for initial + * login. */ for (msec = 50; msec <= 15000; msec <<= 1) { - rc = iscsid_exec_req(&req, &rsp, 0, ISCSID_REQ_TIMEOUT); + int tmo = ISCSID_REQ_TIMEOUT * 10; + + rc = iscsid_exec_req(&req, &rsp, 0, tmo); if (rc == 0) { return rc; - } else if (rc == ISCSI_ERR_ISCSID_NOTCONN) { + } else if (rc == ISCSI_ERR_SESSION_NOT_CONNECTED) { ts.tv_sec = msec / 1000; ts.tv_nsec = (msec % 1000) * 1000000L; |