On Mon, Jan 09, 2017 at 08:58:07PM +0000, Ankireddypalle Reddy wrote: > Neils, > Thanks for pointing to the sample code. The use case is to use GFID as a unique key for maintaining indexing information about a file when it is being backed up from GlusterFS storage. Extending GFAPI to extract GFID for a file would be great. > As per the example If I need to find GFID for a path p1/p2/p3/p4 on a glusterfs volume then should I do a look up for every level? > LOOKUP (/)->LOOKUP(p1)-> LOOKUP(p2)-> LOOKUP(p3)-> LOOKUP(p4) No, that is not required. You can use glfs_h_lookupat() with the full path. Note that glfs_h_extract_handle() just does a memcpy() of the GFID into the given (unsigned char*), the format is of 'uuid_t'. Attached is the modified test that shows the UUID without the need for a lookup of each component of the directory (a LOOKUP will be done by gfapi if needed). $ make CFLAGS="-lgfapi -luuid" resolve cc -lgfapi -luuid resolve.c -o resolve $ ./resolve storage.example.com media resolve.log Starting libgfapi_fini glfs_set_volfile_server : returned 0 glfs_set_logging : returned 0 glfs_init : returned 0 glfs_set_volfile_server : returned 0 glfs_set_logging : returned 0 glfs_init : returned 0 glfs_h_extract_handle : returned 0 UUID of /installation/CentOS-7-x86_64-Everything-1503-01.iso: b1b20352-c71c-4579-b678-a7a38b0e9a84 glfs_fini : returned 0 End of libgfapi_fini $ getfattr -n glusterfs.gfid -ehex /lan/storage.example.com/media/installation/CentOS-7-x86_64-Everything-1503-01.iso getfattr: Removing leading '/' from absolute path names # file: lan/storage.example.com/media/installation/CentOS-7-x86_64-Everything-1503-01.iso glusterfs.gfid=0xb1b20352c71c4579b678a7a38b0e9a84 HTH, Niels > > Thanks and Regards, > Ram > > > -----Original Message----- > From: Niels de Vos [mailto:ndevos@xxxxxxxxxx] > Sent: Monday, January 09, 2017 3:39 PM > To: Ankireddypalle Reddy > Cc: Gluster Devel (gluster-devel@xxxxxxxxxxx); integration@xxxxxxxxxxx > Subject: Re: Get GFID for a file through libgfapi > > On Mon, Jan 09, 2017 at 05:53:03PM +0000, Ankireddypalle Reddy wrote: > > Hi, > > I am trying to extract the GFID for a file through libgfapi interface. When I try to extract the value of extended attribute glusterfs.gfid through libgfapi I get the errorno: 95. This works for FUSE though. Is there a way to extract the GFID for a file through libgfapi. > > It seems that this is a case where FUSE handles the xatts special. The glusterfs.gfid and glusterfs.gfid.string (VIRTUAL_GFID_XATTR_KEY and > VIRTUAL_GFID_XATTR_KEY_STR) are specifically handled in xlators/mount/fuse/src/fuse-bridge.c. > > There is a way to get the GFID, but it probably is rather a cumbersome workaround for you. The handle-API is used heavily by NFS-Ganesha (because NFS uses filehandles more than filenames), and extracts the GFID from the 'struct glfs_object' with glfs_h_extract_handle(). A basic example of how to obtain and extract the handle is in https://github.com/gluster/glusterfs/blob/master/tests/basic/gfapi/bug1291259.c > > Could you explain the need for knowing the GFID in the application? We can extend gfapi with fetching the GFID if that would help you. > > Niels > > > PS: we have a new integration@xxxxxxxxxxx where external projects can ask gfapi related questions. The gluster-devel list tends to be a little heavy on traffic for non-Gluster developers. > ***************************Legal Disclaimer*************************** > "This communication may contain confidential and privileged material for the > sole use of the intended recipient. Any unauthorized review, use or distribution > by others is strictly prohibited. If you have received the message by mistake, > please advise the sender by reply email and delete the message. Thank you." > ********************************************************************** >
#include <fcntl.h> #include <unistd.h> #include <time.h> #include <limits.h> #include <string.h> #include <stdio.h> #include <errno.h> #include <stdlib.h> #include <glusterfs/api/glfs.h> #include <glusterfs/api/glfs-handles.h> #include <uuid/uuid.h> int gfapi = 1; #define LOG_ERR(func, ret) do { \ if (ret != 0) { \ fprintf (stderr, "%s : returned error ret(%d), errno(%d)\n", \ func, ret, errno); \ exit(1); \ } else { \ fprintf (stderr, "%s : returned %d\n", func, ret); \ } \ } while (0) #define LOG_IF_NO_ERR(func, ret) do { \ if (ret == 0) { \ fprintf (stderr, "%s : hasn't returned error %d\n", \ func, ret); \ exit(1); \ } else { \ fprintf (stderr, "%s : returned %d\n", func, ret); \ } \ } while (0) #define GLAPI_UUID_LENGTH 16 int main (int argc, char *argv[]) { glfs_t *fs = NULL; glfs_t *fs2 = NULL; int ret = 0, i; glfs_fd_t *fd = NULL; char *filename = "/installation/CentOS-7-x86_64-Everything-1503-01.iso"; struct stat sb = {0, }; char *logfile = NULL; char *volname = NULL; char *hostname = NULL; struct glfs_object *root = NULL, *leaf = NULL; // unsigned char globjhdl[GFAPI_HANDLE_LENGTH]; uuid_t globjhdl; char gfid[37]; fprintf (stderr, "Starting libgfapi_fini\n"); if (argc != 4) { fprintf (stderr, "Invalid argument\n"); exit(1); } hostname = argv[1]; volname = argv[2]; logfile = argv[3]; fs = glfs_new (volname); if (!fs) { fprintf (stderr, "glfs_new: returned NULL\n"); return 1; } ret = glfs_set_volfile_server (fs, "tcp", hostname, 24007); LOG_ERR("glfs_set_volfile_server", ret); ret = glfs_set_logging (fs, logfile, 7); LOG_ERR("glfs_set_logging", ret); ret = glfs_init (fs); LOG_ERR("glfs_init", ret); fs2 = glfs_new (volname); if (!fs) { fprintf (stderr, "glfs_new: returned NULL\n"); return 1; } ret = glfs_set_volfile_server (fs2, "tcp", hostname, 24007); LOG_ERR("glfs_set_volfile_server", ret); ret = glfs_set_logging (fs2, logfile, 7); LOG_ERR("glfs_set_logging", ret); ret = glfs_init (fs2); LOG_ERR("glfs_init", ret); sleep (2); #if 0 root = glfs_h_lookupat (fs, NULL, "/", &sb, 0); if (!root) { ret = -1; LOG_ERR ("glfs_h_lookupat root", ret); } leaf = glfs_h_lookupat (fs, root, filename, &sb, 0); #endif leaf = glfs_h_lookupat (fs, NULL, filename, &sb, 0); if (!leaf) { ret = -1; LOG_IF_NO_ERR ("glfs_h_lookupat leaf", ret); } ret = glfs_h_extract_handle (leaf, (unsigned char*) globjhdl, GFAPI_HANDLE_LENGTH); LOG_ERR("glfs_h_extract_handle", (ret != 16)); uuid_unparse (globjhdl, gfid); fprintf (stderr, "UUID of %s: %s\n", filename, gfid); ret = glfs_fini(fs); LOG_ERR("glfs_fini", ret); fprintf (stderr, "End of libgfapi_fini\n"); exit(0); }
Attachment:
signature.asc
Description: PGP signature
_______________________________________________ Gluster-devel mailing list Gluster-devel@xxxxxxxxxxx http://www.gluster.org/mailman/listinfo/gluster-devel