The wording is off a bit I see for this patch. It should be something more like:
> When scanning current sessions for the last session used, keep > track of the last session used and sort the list such that this session > is presented first in sort order. This will make the search much faster > when there are hundreds of sessions. Would you like me to resubmit? > On Nov 18, 2014, at 1:35 PM, Lee Duncan <[email protected]> wrote: > > From: Lee Duncan <[email protected]> > > When scanning current session to find a match for > a particular session, keep track of the current session > and sort the list such that this session is presented > first in sort order. This will make matching the current > session orders of magnitude faster when hundreds of > sessions are present. > > Signed-off-by: Lee Duncan <[email protected]> > --- > usr/iscsi_sysfs.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 51 insertions(+), 1 deletion(-) > > diff --git a/usr/iscsi_sysfs.c b/usr/iscsi_sysfs.c > index c916ed8e11a1..61414aff0495 100644 > --- a/usr/iscsi_sysfs.c > +++ b/usr/iscsi_sysfs.c > @@ -1407,6 +1407,28 @@ int iscsi_sysfs_get_sessioninfo_by_id(struct > session_info *info, char *session) > return 0; > } > > +/* > + * If one of the names being sorted matches 'last_valid_session', > + * return a value which makes the last_valid_session appear to be the > + * 'lowest' string (in sort order). This will sort last_valid_session > + * so it will be the first item on the list to speed up the session > + * lookup. Otherwise, let alphasort() return a normal sort-order > + * result. > + */ > +static char *last_valid_session; > +int valid_session_alphasort(const struct dirent **s1, const struct dirent > **s2) > +{ > + if (last_valid_session && > + !strcmp(last_valid_session, (*s1)->d_name)) { > + return -1; > + } > + if (last_valid_session && > + !strcmp(last_valid_session, (*s2)->d_name)) { > + return 1; > + } > + return alphasort(s1, s2); > +} > + > int iscsi_sysfs_for_each_session(void *data, int *nr_found, > iscsi_sysfs_session_op_fn *fn, > int in_parallel) > @@ -1421,7 +1443,7 @@ int iscsi_sysfs_for_each_session(void *data, int > *nr_found, > return ISCSI_ERR_NOMEM; > > n = scandir(ISCSI_SESSION_DIR, &namelist, trans_filter, > - alphasort); > + valid_session_alphasort); > if (n <= 0) > goto free_info; > > @@ -1484,6 +1506,34 @@ int iscsi_sysfs_for_each_session(void *data, int > *nr_found, > } > } > > + /* > + * If rc > 0 then a session ID match has been found. If there > + * is already a session ID in last_valid_session see if the > + * session ID is changing. If so, then delete the old > + * last_valid_session number and mark last_valid_session as > + * NULL. It will be filled in directly. > + * > + * If last_valid_session is NULL update it with the current > + * session ID that was found and flush the lookup cache. The > + * cache will get repopulated on the next lookup cycle but > + * the cache will get filled with information from just the > + * current session ID since it will be sorted to the top of > + * the scan list so it will be the first session scanned and > + * matched. > + */ > + if (rc > 0) { > + if (last_valid_session && > + strcmp(last_valid_session, namelist[i]->d_name)) { > + free(last_valid_session); > + last_valid_session = NULL; > + } > + > + if (last_valid_session == NULL) { > + last_valid_session = strdup(namelist[i]->d_name); > + sysfs_cleanup(); > + } > + } > + > for (i = 0; i < n; i++) > free(namelist[i]); > free(namelist); > -- > 2.1.2 > -- The Lee-Man Rides Again "...And maddest of all, to see life as it is and not as it should be!" — Cervantes -- You received this message because you are subscribed to the Google Groups "open-iscsi" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/open-iscsi. For more options, visit https://groups.google.com/d/optout.
