[Gluster-devel] Fail when calling syncop_create

Anand Avati anand.avati at gmail.com
Mon Sep 10 19:30:15 UTC 2012


On Mon, Sep 10, 2012 at 12:11 PM, Gustavo Bervian Brand <gugabrand at gmail.com
> wrote:

> Hello,
>
>    I wasn't using the synctask_new worker, but now I implemented my code
> using it to trigger the create/write call. Btw, is the usage of syncop
> calls documented somewhere? I found it through the history of the dev-list.
>
>   But going ahead on my issue, I was able to create the file avoiding the
> NFS stale handle error. The file is being created at the backend, but the
> syncop_create call it's still returning an error from the posix translator
> at the server side. I copied the error from the glusterd log below... I am
> checking the code trying to figure it out.
>
>   To write the file I am generating a new gfid for the local file and
> setting the pargfid as 1 (root node) with the loc.parent pointing to the
> inode->table->root inode. Below I copied what is being copied the loc, fd,
> flag and mode_t structures being used at the create call.
>
> *** From the glusterd log:
> [2012-09-10 18:12:34.035940] W [posix-handle.c:590:posix_handle_hard]
> 0-examplevol1: mismatching ino/dev between file
> /bricks/exampleDir_local/1ccfca9f (146628/2049) and handle
> /bricks/exampleDir_local/.glusterfs/00/00/00000000-0000-0000-0000-000000000000
> (146617/2049)
> [2012-09-10 18:12:34.035977] E [posix.c:1724:posix_create] 0-examplevol1:
> setting gfid on /bricks/exampleDir_local/1ccfca9f failed
>
> *** Relevant code before calling the create function
>   107                 inode_t *newinode = inode_new
> (old_loc.inode->table);
>  108
>  109                 loc.path = strdup(hashed_path_str);
>  110                 loc.name = strdup(hashed_filename_str);
>  111                 loc.inode = newinode;
>  113                 loc.parent = loc.inode->table->root;
>  115                 uuid_copy(loc.gfid, gfid);
>  116
>  118                 memset (loc.pargfid, 0, 16);
>  119                 loc.pargfid[15] = 1;
>  120
>  121                 fd = fd_create (loc.inode, getpid());
> ...
>  127
>  128                 uint32_t flags = O_CREAT | O_RDWR | O_EXCL;
>  129                 mode_t mode = (mode_t)0700;
>  130                 fd->flags = flags;
>  131                 fd = fd_ref(fd);
>
>
It is very likely you are just missing setting the "gfid-req" field in the
dictionary. You can check how fuse-bridge, nfs, api/src/glfs.c are all
setting gfid-req. In your case you would want to copy the GFID of the
original file for the cached file as well.

Avati
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://supercolony.gluster.org/pipermail/gluster-devel/attachments/20120910/392ecb5e/attachment-0004.html>


More information about the Gluster-devel mailing list