I'm looking at the code and I'm not sure if there's a missing UNLOCK there
(location marked in bold red) for cache->gc_lock :

    LOCK(&cache->gc_lock);
    bucket = id % cache->gc_nbuckets;
    agl = BUCKET_START(cache->gc_cache, bucket);
    for (i = 0; i < AUX_GID_CACHE_ASSOC; i++, agl++) {
        if (!agl->gl_list || agl->gl_id != id)
            continue;

        /*
          @uid and @gid reflect the latest UID/GID of the
           process performing the syscall (taken from frame->root).

           If the UID and GID has changed for the PID since the
           time we cached it, we should treat the cache as having
           stale values and query them freshly.
        */
        if (agl->gl_uid != uid || agl->gl_gid != gid)
            break;

        /*
         * We don't put new entries in the cache when expiration=0, but
         * there might be entries still in there if expiration was
         * changed very recently.  Writing the check this way ensures
         * that they're not used.
         */
        if (now < agl->gl_deadline) {
            *return agl;*
        }

        /*
         * We're not going to find any more UID matches, and reaping
         * is handled further down to maintain LRU order.
         */
        break;
    }
    UNLOCK(&cache->gc_lock);
    return NULL;
}


TIA,
Y.
_______________________________________________
Gluster-devel mailing list
Gluster-devel@gluster.org
https://lists.gluster.org/mailman/listinfo/gluster-devel

Reply via email to