[Gluster-users] unexpected ENOENT on symlinks
Willem Jan Palenstijn
wjp at usecode.org
Thu Jul 17 14:14:30 UTC 2014
Hi,
I'm running into unexpected behaviour with symlinks on a glusterfs volume
(3.5.1 on Arch Linux), where sometimes accessing a symlink on the volume
results in ENOENT (No such file or directory).
The following consistently reproduces it for me from a shell. At the end of
this post I've also included a short snippet of C that shows this inconsistency
between repeated readlink() syscalls.
$ ln -s x y
$ ls -al
ls: cannot read symbolic link y: No such file or directory
total 16
drwxr-xr-x 2 wjp wjp 4096 Jul 17 15:40 .
drwx------ 7 wjp wjp 4096 Jul 17 15:40 ..
lrwxrwxrwx 1 wjp wjp 1 Jul 17 15:40 y
$ ls -l y
lrwxrwxrwx 1 wjp wjp 1 Jul 17 15:40 y -> x
Is this indeed unexpected, and if so, what would be a good next step to
investigate this?
The setup is glusterfs 3.5.1 on Arch Linux, with a stripe glusterfs volume
consisting of two bricks.
Thanks,
Willem Jan
----
$ gcc -o t test_glusterfs_symlink.c && ./t
First readlink: -1 (errno 2)
Second readlink: 1
$ cat test_glusterfs_symlink.c
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <dirent.h>
#include <errno.h>
int main()
{
FILE *f;
int r1, r2, r3, e2, e3;
struct dirent *p;
DIR *d;
char buf[2];
struct stat s;
r1 = symlink("x", "y");
if (r1 != 0) {
printf("Failed to create symlink\n");
return -1;
}
d = opendir(".");
p = readdir(d);
r2 = readlink("y", buf, 2);
e2 = errno;
r3 = readlink("y", buf, 2);
e3 = errno;
printf("First readlink: %d", r2);
if (r2 < 0) printf(" (errno %d)", e2);
printf("\nSecond readlink: %d", r3);
if (r3 < 0) printf(" (errno %d)", e3);
printf("\n");
unlink("y");
return 0;
}
More information about the Gluster-users
mailing list