[libvirt] [PATCH] storage: Add timeout for iscsi volume's stable path discovery

It might need some time till the LUN's stable path shows up on initiator host, and although the time window is not foreseeable, as a better than nothing fix, this patch adds timeout for the stable path discovery process. --- src/storage/storage_backend.c | 14 ++++++++++++-- 1 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c index 1d32232..e159bd2 100644 --- a/src/storage/storage_backend.c +++ b/src/storage/storage_backend.c @@ -1347,6 +1347,7 @@ virStorageBackendStablePath(virStoragePoolObjPtr pool, struct dirent *dent; char *stablepath; int opentries = 0; + int retry = 0; /* Short circuit if pool has no target, or if its /dev */ if (pool->def->target.path == NULL || @@ -1355,7 +1356,7 @@ virStorageBackendStablePath(virStoragePoolObjPtr pool, goto ret_strdup; /* Skip whole thing for a pool which isn't in /dev - * so we don't mess will filesystem/dir based pools + * so we don't mess filesystem/dir based pools */ if (!STRPREFIX(pool->def->target.path, "/dev")) goto ret_strdup; @@ -1384,8 +1385,12 @@ virStorageBackendStablePath(virStoragePoolObjPtr pool, /* The pool is pointing somewhere like /dev/disk/by-path * or /dev/disk/by-id, so we need to check all symlinks in * the target directory and figure out which one points - * to this device node + * to this device node. + * + * And it might need some time till the stabe path shows + * up, so add timeout to retry here. */ + retry: while ((dent = readdir(dh)) != NULL) { if (dent->d_name[0] == '.') continue; @@ -1406,6 +1411,11 @@ virStorageBackendStablePath(virStoragePoolObjPtr pool, VIR_FREE(stablepath); } + if (++retry < 100) { + usleep(100 * 1000); + goto retry; + } + closedir(dh); ret_strdup: -- 1.7.7.3

On 09/24/2012 02:44 AM, Osier Yang wrote:
It might need some time till the LUN's stable path shows up on initiator host, and although the time window is not foreseeable, as a better than nothing fix, this patch adds timeout for the stable path discovery process. --- src/storage/storage_backend.c | 14 ++++++++++++-- 1 files changed, 12 insertions(+), 2 deletions(-)
@@ -1384,8 +1385,12 @@ virStorageBackendStablePath(virStoragePoolObjPtr pool, /* The pool is pointing somewhere like /dev/disk/by-path * or /dev/disk/by-id, so we need to check all symlinks in * the target directory and figure out which one points - * to this device node + * to this device node. + * + * And it might need some time till the stabe path shows
s/stabe/stable/
+ * up, so add timeout to retry here. */ + retry: while ((dent = readdir(dh)) != NULL) { if (dent->d_name[0] == '.') continue; @@ -1406,6 +1411,11 @@ virStorageBackendStablePath(virStoragePoolObjPtr pool, VIR_FREE(stablepath); }
+ if (++retry < 100) {
Why a magic number of 100? Not even a comment mentioning the maximum time we are waiting?
+ usleep(100 * 1000);
This says up to 100ms * 100, or 10 seconds. I guess that seems reasonable enough. ACK if you fix those issues. -- Eric Blake eblake@redhat.com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

On 2012年09月25日 00:42, Eric Blake wrote:
On 09/24/2012 02:44 AM, Osier Yang wrote:
It might need some time till the LUN's stable path shows up on initiator host, and although the time window is not foreseeable, as a better than nothing fix, this patch adds timeout for the stable path discovery process. --- src/storage/storage_backend.c | 14 ++++++++++++-- 1 files changed, 12 insertions(+), 2 deletions(-)
@@ -1384,8 +1385,12 @@ virStorageBackendStablePath(virStoragePoolObjPtr pool, /* The pool is pointing somewhere like /dev/disk/by-path * or /dev/disk/by-id, so we need to check all symlinks in * the target directory and figure out which one points - * to this device node + * to this device node. + * + * And it might need some time till the stabe path shows
s/stabe/stable/
+ * up, so add timeout to retry here. */ + retry: while ((dent = readdir(dh)) != NULL) { if (dent->d_name[0] == '.') continue; @@ -1406,6 +1411,11 @@ virStorageBackendStablePath(virStoragePoolObjPtr pool, VIR_FREE(stablepath); }
+ if (++retry< 100) {
Why a magic number of 100? Not even a comment mentioning the maximum time we are waiting?
+ usleep(100 * 1000);
This says up to 100ms * 100, or 10 seconds. I guess that seems reasonable enough.
ACK if you fix those issues.
Thanks, pushed with nits fixed.
participants (2)
-
Eric Blake
-
Osier Yang