cluster/tier: Do not delete linkto file on demotion
authorN Balachandran <nbalacha@redhat.com>
Mon, 9 Nov 2015 10:19:50 +0000 (15:49 +0530)
committerDan Lambright <dlambrig@redhat.com>
Wed, 18 Nov 2015 15:16:12 +0000 (07:16 -0800)
The current DHT migration code will always delete the
src linkto file after migration as dht always moves
 files to the hashed subvol. This is not the case in tiering.
The lack of linkto files causes rename to fail leaving 2 files
 with the same name but different gfids on the volume.
Modified to leave the linkto file behind if the source
 volume is the hashed subvolume.

Change-Id: I2b99f7d34b4b719aee6232dc40c6a8f8ba88225d
BUG: 1279376
Signed-off-by: N Balachandran <nbalacha@redhat.com>
Reviewed-on: http://review.gluster.org/12551
Reviewed-by: Dan Lambright <dlambrig@redhat.com>
Tested-by: Dan Lambright <dlambrig@redhat.com>
tests/bugs/tier/bug-1279376-rename-demoted-file.t [new file with mode: 0755]
xlators/cluster/dht/src/dht-rebalance.c
xlators/cluster/dht/src/tier.h

diff --git a/tests/bugs/tier/bug-1279376-rename-demoted-file.t b/tests/bugs/tier/bug-1279376-rename-demoted-file.t
new file mode 100755 (executable)
index 0000000..c75c398
--- /dev/null
@@ -0,0 +1,88 @@
+#!/bin/bash
+
+. $(dirname $0)/../../include.rc
+. $(dirname $0)/../../volume.rc
+. $(dirname $0)/../../tier.rc
+
+
+NUM_BRICKS=2
+DEMOTE_FREQ=5
+DEMOTE_TIMEOUT=10
+PROMOTE_FREQ=500
+
+
+#Both src and dst files must hash to the same hot tier subvol
+SRC_FILE="file1.txt"
+DST_FILE="newfile1.txt"
+
+
+# Creates a tiered volume with pure distribute hot and cold tiers
+# Both hot and cold tiers will have an equal number of bricks.
+
+function create_dist_tier_vol () {
+        mkdir $B0/cold
+        mkdir $B0/hot
+        TEST $CLI volume create $V0 $H0:$B0/cold/${V0}{0..$1}
+        TEST $CLI volume set $V0 performance.quick-read off
+        TEST $CLI volume set $V0 performance.io-cache off
+        TEST $CLI volume start $V0
+        TEST $CLI volume tier $V0 attach $H0:$B0/hot/${V0}{0..$1}
+        TEST $CLI volume set $V0 cluster.tier-demote-frequency $DEMOTE_FREQ
+        TEST $CLI volume set $V0 cluster.tier-promote-frequency $PROMOTE_FREQ
+        TEST $CLI volume set $V0 cluster.tier-mode test
+
+#We do not want any files to be promoted during this test
+        TEST $CLI volume set $V0 cluster.read-freq-threshold 50
+        TEST $CLI volume set $V0 cluster.write-freq-threshold 50
+}
+
+
+cleanup;
+
+#Basic checks
+TEST glusterd
+TEST pidof glusterd
+TEST $CLI volume info
+
+
+#Create and start a tiered volume
+create_dist_tier_vol $NUM_BRICKS
+
+# Mount FUSE
+TEST glusterfs -s $H0 --volfile-id $V0 $M0
+
+
+# The file will be created on the hot tier
+
+touch "$M0/$SRC_FILE"
+
+# Get the path of the file on the hot tier
+HPATH=`find $B0/hot/ -name  "$SRC_FILE"`
+echo "File path on hot tier: "$HPATH
+
+
+EXPECT "yes" exists_and_regular_file $HPATH
+
+# Wait for the tier process to demote the file
+sleep $DEMOTE_TIMEOUT
+
+# Get the path of the file on the cold tier
+CPATH=`find $B0/cold/ -name  "$SRC_FILE"`
+echo "File path on cold tier: "$CPATH
+
+EXPECT "yes" exists_and_regular_file $CPATH
+
+#This will be created on the hot tier
+
+touch "$M0/$DST_FILE"
+HPATH=`find $B0/hot/ -name "$DST_FILE"`
+echo "File path on hot tier: "$HPATH
+
+TEST mv $M0/$SRC_FILE $M0/$DST_FILE
+
+# We expect a single file to exist at this point
+# when viewed on the mountpoint
+EXPECT 1 echo $(ls -l $M0 | grep $DST_FILE | wc -l)
+
+cleanup;
+
index 7e9ba11fb2663304bf235488e77a05b17872b399..f33ba227797be9cc56885ff0fa4b0393118ef671 100644 (file)
@@ -9,6 +9,7 @@
 */
 
 
+#include "tier.h"
 #include "dht-common.h"
 #include "xlator.h"
 #include "syscall.h"
@@ -1177,6 +1178,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to,
         gf_boolean_t    clean_src            = _gf_false;
         gf_boolean_t    clean_dst            = _gf_false;
         int             log_level            = GF_LOG_INFO;
+        gf_boolean_t    delete_src_linkto    = _gf_true;
 
         defrag = conf->defrag;
         if (!defrag)
@@ -1463,9 +1465,11 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to,
 
         /* store size of previous migrated file  */
         if (defrag->tier_conf.is_tier) {
-                if (from == conf->subvolumes[0]) {
+                if (from != TIER_HASHED_SUBVOL) {
                         defrag->tier_conf.st_last_promoted_size = stbuf.ia_size;
                 } else {
+                        /* Don't delete the linkto file on the hashed subvol */
+                        delete_src_linkto = _gf_false;
                         defrag->tier_conf.st_last_demoted_size = stbuf.ia_size;
                 }
         }
@@ -1532,8 +1536,9 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to,
                 rcvd_enoent_from_src = 1;
         }
 
+
         if ((gf_uuid_compare (empty_iatt.ia_gfid, loc->gfid) == 0 ) &&
-            (!rcvd_enoent_from_src)) {
+            (!rcvd_enoent_from_src) && delete_src_linkto) {
                 /* take out the source from namespace */
                 ret = syncop_unlink (from, loc, NULL, NULL);
                 if (ret) {
index 0f8107924eab04a46e5091162ce7f3b09c56ac65..2a72ae2caf6140d4dcbeae589102b74bfd7d0244 100644 (file)
@@ -33,6 +33,8 @@
 #define PROMOTION_QFILE "promotequeryfile"
 #define DEMOTION_QFILE "demotequeryfile"
 
+#define TIER_HASHED_SUBVOL   conf->subvolumes[1]
+
 #define GET_QFILE_PATH(is_promotion)\
         (is_promotion) ? promotion_qfile : demotion_qfile