diff options
author | N Balachandran <nbalacha@redhat.com> | 2015-10-16 15:10:28 +0530 |
---|---|---|
committer | Dan Lambright <dlambrig@redhat.com> | 2015-10-18 07:23:27 -0700 |
commit | 66992a18e06105dfe6f7a14b1f30227f985a94bc (patch) | |
tree | 0d4366227b7a915490775c20cced4cc9a3d4fc1f /tests/basic/tier/file_lock.c | |
parent | 429669168f6e13798c04ad0641909493c213f22e (diff) |
cluster/dht : Do not migrate files with POSIX locks held
dht_migrate_file does not migrate file locks to the dst file.
Any locks held on the source file are lost once the migration
is complete. This issue is magnified in the case of a tier volume
as file migrations occur more frequently and repeatedly as compared
to a DHT rebalance.
The fix makes 2 changes:
1. Before starting the actual migration process, check if there are
any locks held on the file. If yes, do not migrate the file.
2. The rebalance process tries to lock on the entire file just before
moving into the Phase 2 of the file migration. If the lock acquisition
fails, the file migration does not proceed.
If the lock is granted, the file migration proceeds.
This still leaves a small window where conflicting locks can be granted to
different clients. If client1 requests a lock on the src file just after
it is converted to a linkto file and client2 requests a lock on the dst
data file, they will both be granted, but all FOPs will be redirected
to the dst data file. This issue will be taken up in a subsequent patch.
Change-Id: I8c895fc3cced50dd2894259d40a827c7b43d58ac
BUG: 1272331
Signed-off-by: N Balachandran <nbalacha@redhat.com>
> Reviewed-on: http://review.gluster.org/12347
> Tested-by: NetBSD Build System <jenkins@build.gluster.org>
> Tested-by: Gluster Build System <jenkins@build.gluster.com>
> Reviewed-by: Dan Lambright <dlambrig@redhat.com>
> Tested-by: Dan Lambright <dlambrig@redhat.com>
> Signed-off-by: N Balachandran <nbalacha@redhat.com>
Reviewed-on: http://review.gluster.org/12369
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Tested-by: NetBSD Build System <jenkins@build.gluster.org>
Reviewed-by: Dan Lambright <dlambrig@redhat.com>
Tested-by: Dan Lambright <dlambrig@redhat.com>
Diffstat (limited to 'tests/basic/tier/file_lock.c')
-rw-r--r-- | tests/basic/tier/file_lock.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/tests/basic/tier/file_lock.c b/tests/basic/tier/file_lock.c new file mode 100644 index 00000000000..730cca92e42 --- /dev/null +++ b/tests/basic/tier/file_lock.c @@ -0,0 +1,75 @@ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <fcntl.h> + + +void usage (void) +{ + + printf ("Usage: testlock <filepath> [R|W]\n"); + return; +} + + +int main (int argc, char *argv[]) +{ + char *file_path = NULL; + int fd = -1; + struct flock lock = {0}; + int ret = -1; + int c = 0; + + if (argc != 3) { + usage (); + exit (1); + } + + file_path = argv[1]; + fd = open (file_path, O_RDWR); + + if (-1 == fd) { + printf ("Failed to open file %s. %m\n", file_path); + exit (1); + } + + /* TODO: Check for invalid input*/ + + if (!strcmp (argv[2], "W")) { + lock.l_type = F_WRLCK; + printf("Taking write lock\n"); + + } else { + lock.l_type = F_RDLCK; + printf("Taking read lock\n"); + } + + lock.l_whence = SEEK_SET; + lock.l_start = 0; + lock.l_len = 0; + lock.l_pid = getpid (); + + + printf ("Acquiring lock on %s\n", file_path); + ret = fcntl (fd, F_SETLK, &lock); + if (ret) { + printf ("Failed to acquire lock on %s (%m)\n", file_path); + close (fd); + exit (1); + } + + sleep(10); + + /*Unlock*/ + + printf ("Releasing lock on %s\n", file_path); + lock.l_type = F_UNLCK; + ret = fcntl (fd, F_SETLK, &lock); + if (ret) { + printf ("Failed to release lock on %s (%m)\n", file_path); + } + + close (fd); + return ret; + +} |