Take for example nfs3_FhandleToCache(). It gets wire handle and calls extract_handle() method. What is the job of extract_handle method? Assuming that it is supposed to return "key" handle as the comments there say. Then nfs3_FhandleToCache calls create_handle() with the "key" handle. This is unexpected, right?
Note that GPFS fsal indeed returns "key" handle in V2.3 and handles get corrupted due to create_handle() getting "key" handle rather than the full handle! In V2.5, GPFS extract_handle() returns full handle (after some endian conversions). Note that it doesn't actually return "key" handle as expected, but mdcache_create_handle() assumes that it is given a "key" handle. So the "mdcache_create_handle --> mdcache_locate_keyed --> mdcache_find_keyed" **should** never returns success with GPFS objects! Am I missing something? On Mon, Apr 10, 2017 at 11:32 PM, Frank Filz <ffilz...@mindspring.com> wrote: >> On 04/10/2017 11:57 AM, Frank Filz wrote: >> >> Hi All, there is usually a 1:1 relationship (ignoring handles across >> > architectures >> >> and versions) between nfs handle and object handle. One thing that is >> >> not clear is the "key" which is used for hashing the objects >> > (mdcache_entry_t). >> >> Ganesha 2.5 has handle_to_key() method to take unique bits from the >> >> handle for acching purpose. How did this work in ganesha 2.3? Ganesha >> >> 2.3 comments say that extract_handle method is used to get the key, >> >> but this eventually results in losing the actual handle. >> >> >> >> >> >> Also comment at mdcache_create_handle() indicates that it takes "key" >> >> but the actual argument "struct gsh_buffdesc *hdl_desc" is written as >> >> "Buffer descriptor for the "wire" handle". Is this wire handle or key? >> >> If this is not the "key", then we will be looking for an incorrect >> >> object, >> > right? >> > >> > Looking over the code, I THINK everything is right... >> > >> > There is still a handle_digest method, and for GPFS it uses >> > gpfs_sizeof_handle to determine the size to copy, so that may well >> > copy the full handle. >> > >> > The code is definitely very confusing... >> > >> > There IS a handle_cmp method... >> > >> > I suggest we consider re-writing and clarifying all of this handle >> > processing code. >> > >> > I think everywhere, the handle digest should be whatever the FSAL >> > wants encapsulated. >> > >> > The handle_to_key function should be used to extract the key to be >> > hashed by anything that wants to hash things, and since we will be >> > using that for hashing, we should drop the handle_cmp method (or have >> > a default version that just calls handle_to_key on the two handles it >> > will compare, and then compare memory using the buffer descriptors >> returned by handle_to_key). >> >> This is, in fact, what it does. > > Yea, it does look like handle_to_key is passed a gsh_buffdesc which is then > filled in with the start address and length of what the FSAL would like to > be the key, so no memcpy occurs. On the other hand, handle_digest is passed > a gsh_buffdesc which describes where to place the handle, so a memcpy > occurs. That is probably unavoidable since to create a wire handle we have > to append the handle to the Ganesha handle header. > >> > FSALs having a custom handle_cmp isn't useful because they can't pick >> > and choose fields in the handle to compare (since a hash of such a >> > discontinuous handles would hash bytes that aren't part of the >> > comparison, generating different hashes for handles that are the same >> key). >> >> But it may be able to do this comparison faster, and avoiding copying > things >> around. > > We shouldn't need to copy the handle bytes around, just form a new buffer > descriptor that indicates the start of the key and it's length. > > If we want keys that are not a contiguous set of bytes, then the hashing > needs to be done by the FSAL also, we can't hash bytes 0-31 but only compare > 0-3, 8-11, 16-19, 24-27... Since the hash would include bytes that could be > different in different versions of the same handle. > > So yea, everything works. But it confuses people until they follow through > all of the code... > > Frank > >> > I THINK this really only affects GPFS which puts extra stuff into some >> > of it's handles that may be different at different times for the same > object. >> > >> > Part of why this was never really clear is the folks who did all the >> > stuff really didn't understand GPFS handles (I remember lots of >> > confusion before we got it right). >> > >> > Frank >> > >> > >> >> Daniel >> >> >> > ---------------------------------------------------------------------------- > -- >> Check out the vibrant tech community on one of the world's most engaging >> tech sites, Slashdot.org! http://sdm.link/slashdot >> _______________________________________________ >> Nfs-ganesha-devel mailing list >> Nfs-ganesha-devel@lists.sourceforge.net >> https://lists.sourceforge.net/lists/listinfo/nfs-ganesha-devel > > > --- > This email has been checked for viruses by Avast antivirus software. > https://www.avast.com/antivirus > > > ------------------------------------------------------------------------------ > Check out the vibrant tech community on one of the world's most > engaging tech sites, Slashdot.org! http://sdm.link/slashdot > _______________________________________________ > Nfs-ganesha-devel mailing list > Nfs-ganesha-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/nfs-ganesha-devel ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Nfs-ganesha-devel mailing list Nfs-ganesha-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/nfs-ganesha-devel