diff options
| -rw-r--r-- | glusterfsd/src/glusterfsd.c | 6 | ||||
| -rwxr-xr-x | libglusterfsclient/src/libglusterfsclient.c | 156 | ||||
| -rw-r--r-- | xlators/features/locks/src/common.c | 4 | ||||
| -rw-r--r-- | xlators/features/locks/src/internal.c | 18 | ||||
| -rw-r--r-- | xlators/features/locks/src/posix.c | 8 | ||||
| -rw-r--r-- | xlators/protocol/server/src/server-protocol.c | 12 | 
6 files changed, 149 insertions, 55 deletions
diff --git a/glusterfsd/src/glusterfsd.c b/glusterfsd/src/glusterfsd.c index 2ad644e9f..3c9e77822 100644 --- a/glusterfsd/src/glusterfsd.c +++ b/glusterfsd/src/glusterfsd.c @@ -178,14 +178,14 @@ _gf_dump_details (int argc, char **argv)  	mypid = getpid ();  	uname_ret   = uname (&uname_buf); -        /* Which TLA? What time? */ +        /* Which git? What time? */          strftime (timestr, 256, "%Y-%m-%d %H:%M:%S", tm);   	fprintf (gf_log_logfile,   		 "========================================"  		 "========================================\n"); -        fprintf (gf_log_logfile, "Version      : %s %s built on %s %s\n",  +        fprintf (gf_log_logfile, "Version      : %s %s built on %s %s\n",                   PACKAGE_NAME, PACKAGE_VERSION, __DATE__, __TIME__); -        fprintf (gf_log_logfile, "TLA Revision : %s\n",  +        fprintf (gf_log_logfile, "git: %s\n",                   GLUSTERFS_REPOSITORY_REVISION);          fprintf (gf_log_logfile, "Starting Time: %s\n", timestr);          fprintf (gf_log_logfile, "Command line : "); diff --git a/libglusterfsclient/src/libglusterfsclient.c b/libglusterfsclient/src/libglusterfsclient.c index 7ef55393d..24e73a827 100755 --- a/libglusterfsclient/src/libglusterfsclient.c +++ b/libglusterfsclient/src/libglusterfsclient.c @@ -1330,46 +1330,96 @@ libgf_free_vmp_entry (struct vmp_entry *entry)          FREE (entry);  } -/* Returns the number of characters that match between an entry - * and the path. Assumes string1 is vmp entry. +int +libgf_count_path_components (char *path) +{ +        int     compos = 0; +        char    *pathdup = NULL; +        int     len = 0; + +        if (!path) +                return -1; + +        pathdup = strdup (path); +        if (!pathdup) +                return -1; + +        len = strlen (pathdup); +        if (pathdup[len - 1] == '/') +                pathdup[len - 1] = '\0'; + +        path = pathdup; +        while ((path = strchr (path, '/'))) { +                compos++; +                ++path; +        } + +        free (pathdup); +        return compos; +} + +/* Returns the number of components that match between + * the VMP and the path. Assumes string1 is vmp entry.   * Assumes both are absolute paths.   */  int -libgf_strmatchcount (char *string1, int s1len, char *string2, int s2len) +libgf_strmatchcount (char *string1, char *string2)  { -        int     i = 0; -        int     tosearch = 0;          int     matchcount = 0; +        char    *s1dup = NULL, *s2dup = NULL; +        char    *tok1 = NULL, *saveptr1 = NULL; +        char    *tok2 = NULL, *saveptr2 = NULL; -        if (s1len <= s2len) -                tosearch = s1len; -        else -                tosearch = s2len; +        if ((!string1) || (!string2)) +                return 0; -        for (;i < tosearch; i++) { -                if (string1[i] == string2[i]) -                        matchcount++; -                else +        s1dup = strdup (string1); +        if (!s1dup) +                return 0; + +        s2dup  = strdup (string2); +        if (!s2dup) +                goto free_s1; + +        string1 = s1dup; +        string2 = s2dup; + +        tok1 = strtok_r(string1, "/", &saveptr1); +        tok2 = strtok_r (string2, "/", &saveptr2); +        while (tok1) { +                if (!tok2)                          break; + +                if (strcmp (tok1, tok2) != 0) +                        break; + +                matchcount++; +                tok1 = strtok_r(NULL, "/", &saveptr1); +                tok2 = strtok_r (NULL, "/", &saveptr2);          } +        free (s2dup); +free_s1: +        free (s1dup);          return matchcount;  }  int  libgf_vmp_entry_match (struct vmp_entry *entry, char *path)  { -        return libgf_strmatchcount (entry->vmp, (entry->vmplen - 1), path, -                                        strlen(path)); +        return libgf_strmatchcount (entry->vmp, path);  } +#define LIBGF_VMP_EXACT          1 +#define LIBGF_VMP_LONGESTPREFIX  0  struct vmp_entry * -_libgf_vmp_search_entry (char *path) +_libgf_vmp_search_entry (char *path, int searchtype)  {          struct vmp_entry        *entry = NULL;          int                     matchcount = 0;          struct vmp_entry        *maxentry = NULL;          int                     maxcount = 0; +        int                     vmpcompcount = 0;          if (vmplist.entries == 0) {                  gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "Virtual Mount Point " @@ -1379,17 +1429,56 @@ _libgf_vmp_search_entry (char *path)          list_for_each_entry(entry, &vmplist.list, list) {                  matchcount = libgf_vmp_entry_match (entry, path); -                if ((matchcount == (entry->vmplen - 1)) && -                                        (matchcount > maxcount)) { +                if (matchcount > maxcount) {                          maxcount = matchcount;                          maxentry = entry;                  }          } +        /* To ensure that the longest prefix matched entry is also an exact +         * match, this is used to check whether duplicate entries are present +         * in the vmplist. +         */ +        if ((searchtype == LIBGF_VMP_EXACT) && (maxentry)) { +                vmpcompcount = libgf_count_path_components (maxentry->vmp); +                if (vmpcompcount != matchcount) +                        maxentry = NULL; +        } +  out:                  return maxentry;  }  +/* Used to search for a exactly matching VMP entry. + */ +struct vmp_entry * +libgf_vmp_search_exact_entry (char *path) +{ +        struct vmp_entry        *entry = NULL; + +        if (!path) +                goto out; + +        pthread_mutex_lock (&vmplock); +        { +                entry = _libgf_vmp_search_entry (path, LIBGF_VMP_EXACT); +        } +        pthread_mutex_unlock (&vmplock); + +out: +        if (entry) +                gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "VMP Entry found: path :%s" +                        " vmp: %s", path, entry->vmp); +        else +                gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "VMP Entry not found: path" +                        ": %s", path); + +        return entry; +} + + +/* Used to search for a longest prefix matching VMP entry. + */  struct vmp_entry *  libgf_vmp_search_entry (char *path)  { @@ -1400,16 +1489,17 @@ libgf_vmp_search_entry (char *path)          pthread_mutex_lock (&vmplock);          { -                entry = _libgf_vmp_search_entry (path); +                entry = _libgf_vmp_search_entry (path, LIBGF_VMP_LONGESTPREFIX);          }          pthread_mutex_unlock (&vmplock);  out:          if (entry) -                gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "VMP Entry found: %s: %s", -                        path, entry->vmp); +                gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "VMP Entry found: path :%s" +                        " vmp: %s", path, entry->vmp);          else -                gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "VMP Entry not found"); +                gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "VMP Entry not found: path" +                        ": %s", path);          return entry;  } @@ -1424,16 +1514,16 @@ libgf_vmp_map_ghandle (char *vmp, glusterfs_handle_t *vmphandle)          if (!vmpentry)                  goto out; -        /*  -           FIXME: this is not thread-safe, but I couldn't find other place to -           do initialization. -        */  -        if (vmplist.entries == 0) { -                INIT_LIST_HEAD (&vmplist.list); -        } +        pthread_mutex_lock (&vmplock); +        { +                if (vmplist.entries == 0) { +                        INIT_LIST_HEAD (&vmplist.list); +                } -        list_add_tail (&vmpentry->list, &vmplist.list); -        ++vmplist.entries; +                list_add_tail (&vmpentry->list, &vmplist.list); +                ++vmplist.entries; +        } +        pthread_mutex_unlock (&vmplock);          ret = 0;  out: @@ -1473,7 +1563,7 @@ glusterfs_mount (char *vmp, glusterfs_init_params_t *ipars)          vmphash = (dev_t)ReallySimpleHash (vmp, strlen (vmp));          pthread_mutex_lock (&mountlock);          { -                vmp_entry = _libgf_vmp_search_entry (vmp); +                vmp_entry = libgf_vmp_search_exact_entry (vmp);                  if (vmp_entry) {                          ret = 0;                          goto unlock; @@ -1506,7 +1596,7 @@ _libgf_umount (char *vmp)          struct vmp_entry *entry= NULL;          int               ret = -1; -        entry = _libgf_vmp_search_entry (vmp); +        entry = libgf_vmp_search_exact_entry (vmp);          if (entry == NULL) {                  gf_log ("libglusterfsclient", GF_LOG_ERROR,                          "path (%s) not mounted", vmp); diff --git a/xlators/features/locks/src/common.c b/xlators/features/locks/src/common.c index 92441bde0..1f10aa20c 100644 --- a/xlators/features/locks/src/common.c +++ b/xlators/features/locks/src/common.c @@ -139,8 +139,8 @@ posix_lock_to_flock (posix_lock_t *lock, struct flock *flock)  	flock->l_type  = lock->fl_type;  	flock->l_start = lock->fl_start; -	if (lock->fl_end == 0) -		flock->l_len = LLONG_MAX; +	if (lock->fl_end == LLONG_MAX) +		flock->l_len = 0;  	else  		flock->l_len = lock->fl_end - lock->fl_start + 1;  } diff --git a/xlators/features/locks/src/internal.c b/xlators/features/locks/src/internal.c index 817dab4a1..6524721b4 100644 --- a/xlators/features/locks/src/internal.c +++ b/xlators/features/locks/src/internal.c @@ -181,9 +181,9 @@ pl_inodelk (call_frame_t *frame, xlator_t *this,  	default:  		op_errno = ENOTSUP; -		gf_log (this->name, GF_LOG_DEBUG, -			"Lock command F_GETLK not supported for [f]inodelk " -                        "(cmd=%d)",  +		gf_log (this->name, GF_LOG_ERROR, +			"Unexpected case in inodelk (cmd=%d). " +                        "Please file a bug report at http://bugs.gluster.com",  			cmd);  			goto unwind;  	} @@ -284,8 +284,8 @@ pl_finodelk (call_frame_t *frame, xlator_t *this,  	default:  		op_errno = ENOTSUP;  		gf_log (this->name, GF_LOG_ERROR, -			"Lock command F_GETLK not supported for [f]inodelk " -                        "(cmd=%d)",  +			"Unexpected case in finodelk (cmd=%d). " +                        "Please file a bug report at http://bugs.gluster.com",   			cmd);  			goto unwind;  	} @@ -775,8 +775,8 @@ pl_entrylk (call_frame_t *frame, xlator_t *this,  	default:  		gf_log (this->name, GF_LOG_ERROR, -			"Unexpected case in entrylk (cmd=%d). Please send" -                        "a bug report to gluster-devel@nongnu.org", cmd); +			"Unexpected case in entrylk (cmd=%d). Please file" +                        "a bug report at http://bugs.gluster.com", cmd);  		goto out;  	} @@ -879,9 +879,9 @@ pl_fentrylk (call_frame_t *frame, xlator_t *this,  		break;  	default: -		gf_log (this->name, GF_LOG_DEBUG, +		gf_log (this->name, GF_LOG_ERROR,  			"Unexpected case in fentrylk (cmd=%d). " -                        "Please send a bug report to gluster-devel@nongnu.org",  +                        "Please file a bug report at http://bugs.gluster.com",                           cmd);  		goto out;  	} diff --git a/xlators/features/locks/src/posix.c b/xlators/features/locks/src/posix.c index 144c8fedf..d672beaeb 100644 --- a/xlators/features/locks/src/posix.c +++ b/xlators/features/locks/src/posix.c @@ -715,7 +715,7 @@ pl_forget (xlator_t *this,  	pl_inode = pl_inode_get (this, inode);  	if (!list_empty (&pl_inode->rw_list)) { -		gf_log (this->name, GF_LOG_WARNING, +		gf_log (this->name, GF_LOG_DEBUG,  			"Pending R/W requests found, releasing.");                  list_for_each_entry_safe (rw_req, rw_tmp, &pl_inode->rw_list,  @@ -727,7 +727,7 @@ pl_forget (xlator_t *this,  	}  	if (!list_empty (&pl_inode->ext_list)) { -		gf_log (this->name, GF_LOG_WARNING, +		gf_log (this->name, GF_LOG_DEBUG,  			"Pending fcntl locks found, releasing.");                  list_for_each_entry_safe (ext_l, ext_tmp, &pl_inode->ext_list,  @@ -739,7 +739,7 @@ pl_forget (xlator_t *this,  	}  	if (!list_empty (&pl_inode->int_list)) { -		gf_log (this->name, GF_LOG_WARNING, +		gf_log (this->name, GF_LOG_DEBUG,  			"Pending inode locks found, releasing.");                  list_for_each_entry_safe (int_l, int_tmp, &pl_inode->int_list,  @@ -751,7 +751,7 @@ pl_forget (xlator_t *this,  	}  	if (!list_empty (&pl_inode->dir_list)) { -		gf_log (this->name, GF_LOG_WARNING, +		gf_log (this->name, GF_LOG_DEBUG,  			"Pending entry locks found, releasing.");                  list_for_each_entry_safe (entry_l, entry_tmp,  diff --git a/xlators/protocol/server/src/server-protocol.c b/xlators/protocol/server/src/server-protocol.c index 86c8be962..220f5b3b4 100644 --- a/xlators/protocol/server/src/server-protocol.c +++ b/xlators/protocol/server/src/server-protocol.c @@ -51,6 +51,7 @@ protocol_server_reply (call_frame_t *frame, int type, int op,  	server_state_t *state = NULL;  	xlator_t       *bound_xl = NULL;  	transport_t    *trans = NULL; +        int             ret = 0;  	bound_xl = BOUND_XL (frame);  	state    = CALL_STATE (frame); @@ -60,10 +61,13 @@ protocol_server_reply (call_frame_t *frame, int type, int op,  	hdr->type   = hton32 (type);  	hdr->op     = hton32 (op); -	transport_submit (trans, (char *)hdr, hdrlen, vector, count, iobref); -	/* TODO: If transport submit fails, there is no reply sent to client,  -	 * its bailed out as of now.. loggically, only this frame should fail.  -	 */ +	ret = transport_submit (trans, (char *)hdr, hdrlen, vector,  +                                count, iobref); +        if (ret < 0) { +                gf_log ("protocol/server", GF_LOG_ERROR, +                        "frame %"PRId64": failed to submit. op= %d, type= %d", +                        frame->root->unique, op, type); +        }  	STACK_DESTROY (frame->root);  | 
