geo-rep: Fix syncing chown in xsync crawl

GEO-REP INTEROP WITH SHARD FEATURE

Problem:
    The sequence of entry creation and chown in master
 is recorded as creation of entry with resulted
 user:group in xsync changelog. During sync, entry
 creation is always split into two ops, MKNOD and
 SETATTR. Hence the issue is not being hit otherwise
 it would have failed with EPERM if parent is owned
 by different user. But with shard translator being
 enabled on slave, doing entry creation with MKNOD and
 SETATTR is not allowed, SETATTR fails as it accesses
 inode structure which is not linked.

Solution:
    The sequence of entry creation and chown in master
 should be recorded as MKNOD and SETATTR separately always
 and do entry creation with single op in gfid-access
 xlator. The gfid-access patch will be sent separately.

Change-Id: I93e554bf9342397a7660503f5128e9709f8a0cd8
BUG: 1265148
Signed-off-by: Kotresh HR <khiremat@redhat.com>
Reviewed-on: http://review.gluster.org/12205
Tested-by: NetBSD Build System <jenkins@build.gluster.org>
Reviewed-by: Aravinda VK <avishwan@redhat.com>
This commit is contained in:
Kotresh HR 2015-09-21 14:51:13 +05:30 committed by Venky Shankar
parent a37eb17911
commit dc8d65381b
4 changed files with 41 additions and 27 deletions

View File

@ -1401,9 +1401,8 @@ class GMasterXsyncMixin(GMasterChangelogMixin):
self.sync_done(self.stimes, False)
self.stimes = []
if stat.S_ISDIR(mo):
self.write_entry_change("E", [gfid, 'MKDIR', str(mo), str(
st.st_uid), str(st.st_gid), escape(os.path.join(pargfid,
bname))])
self.write_entry_change("E", [gfid, 'MKDIR', str(mo),
str(0), str(0), escape(os.path.join(pargfid, bname))])
self.write_entry_change("M", [gfid, "SETATTR", str(st.st_uid),
str(st.st_gid), str(st.st_mode),
str(st.st_atime),
@ -1433,8 +1432,7 @@ class GMasterXsyncMixin(GMasterChangelogMixin):
if nlink == 1:
self.write_entry_change("E",
[gfid, 'MKNOD', str(mo),
str(st.st_uid),
str(st.st_gid),
str(0), str(0),
escape(os.path.join(
pargfid, bname))])
else:

View File

@ -58,6 +58,16 @@ function create_data()
# Rename - Dir
mv ${master_mnt}/${prefix}_d3 ${master_mnt}/${prefix}_d4
# chown
touch ${master_mnt}/${prefix}_chown_f1
chown 1000:1000 ${master_mnt}/${prefix}_chown_f1
}
function chown_file_ok()
{
local file_owner=$(stat --format "%u:%g" "$1" 2>/dev/null)
if test "X$file_owner" != "X1000:1000"; then return 1;fi
}
function regular_file_ok()

View File

@ -75,11 +75,12 @@ TEST hardlink_file_ok ${slave_mnt}/hybrid_f1 ${slave_mnt}/hybrid_hl1 #25
TEST unlink_ok ${slave_mnt}/hybrid_f2
TEST unlink_ok ${slave_mnt}/hybrid_d2
TEST data_ok ${slave_mnt}/hybrid_f1 "HelloWorld!"
TEST chown_file_ok ${slave_mnt}/hybrid_chown_f1
#Check History Crawl.
TEST $GEOREP_CLI $master $slave stop
TEST create_data "history" #30
TEST $GEOREP_CLI $master $slave stop #30
TEST create_data "history"
TEST $GEOREP_CLI $master $slave start
sleep 10
EXPECT 2 check_status_num_rows "Active"
@ -89,37 +90,39 @@ EXPECT 2 check_status_num_rows "Passive"
#data_tests "history"
sleep 15
TEST regular_file_ok ${slave_mnt}/history_f1
TEST directory_ok ${slave_mnt}/history_d1 #35
TEST regular_file_ok ${slave_mnt}/history_f1 #35
TEST directory_ok ${slave_mnt}/history_d1
TEST rename_ok ${slave_mnt}/history_f3 ${slave_mnt}/history_f4
TEST rename_ok ${slave_mnt}/history_d3 ${slave_mnt}/history_d4
TEST symlink_ok history_f1 ${slave_mnt}/history_sl1
TEST hardlink_file_ok ${slave_mnt}/history_f1 ${slave_mnt}/history_hl1
TEST unlink_ok ${slave_mnt}/history_f2 #40
TEST hardlink_file_ok ${slave_mnt}/history_f1 ${slave_mnt}/history_hl1 #40
TEST unlink_ok ${slave_mnt}/history_f2
TEST unlink_ok ${slave_mnt}/history_d2
TEST data_ok ${slave_mnt}/history_f1 "HelloWorld!"
TEST chown_file_ok ${slave_mnt}/history_chown_f1
#Check History Crawl.
TEST create_data "changelog"
TEST create_data "changelog" #45
sleep 15
TEST check_status "Changelog Crawl"
#data_tests "changelog"
sleep 15
TEST regular_file_ok ${slave_mnt}/changelog_f1 #45
TEST regular_file_ok ${slave_mnt}/changelog_f1
TEST directory_ok ${slave_mnt}/changelog_d1
TEST rename_ok ${slave_mnt}/changelog_f3 ${slave_mnt}/changelog_f4
TEST rename_ok ${slave_mnt}/changelog_d3 ${slave_mnt}/changelog_d4
TEST rename_ok ${slave_mnt}/changelog_d3 ${slave_mnt}/changelog_d4 #50
TEST symlink_ok changelog_f1 ${slave_mnt}/changelog_sl1
TEST hardlink_file_ok ${slave_mnt}/changelog_f1 ${slave_mnt}/changelog_hl1 #50
TEST hardlink_file_ok ${slave_mnt}/changelog_f1 ${slave_mnt}/changelog_hl1
TEST unlink_ok ${slave_mnt}/changelog_f2
TEST unlink_ok ${slave_mnt}/changelog_d2
TEST data_ok ${slave_mnt}/changelog_f1 "HelloWorld!"
TEST data_ok ${slave_mnt}/changelog_f1 "HelloWorld!" #55
TEST chown_file_ok ${slave_mnt}/changelog_chown_f1
#Stop Geo-rep
TEST $GEOREP_CLI $master $slave stop
#Delete Geo-rep
TEST $GEOREP_CLI $master $slave delete #55
TEST $GEOREP_CLI $master $slave delete
cleanup;

View File

@ -80,46 +80,49 @@ TEST hardlink_file_ok ${slave_mnt}/hybrid_f1 ${slave_mnt}/hybrid_hl1
TEST unlink_ok ${slave_mnt}/hybrid_f2
TEST unlink_ok ${slave_mnt}/hybrid_d2
TEST data_ok ${slave_mnt}/hybrid_f1 "HelloWorld!"
TEST chown_file_ok ${slave_mnt}/hybrid_chown_f1 #30
#Check History Crawl.
TEST $GEOREP_CLI $master $slave stop #30
TEST $GEOREP_CLI $master $slave stop
TEST create_data "history"
TEST $GEOREP_CLI $master $slave start
sleep 10
EXPECT 2 check_status_num_rows "Active"
EXPECT 2 check_status_num_rows "Passive"
EXPECT 2 check_status_num_rows "Passive" #35
#data_tests "history"
sleep 15
TEST regular_file_ok ${slave_mnt}/history_f1 #35
TEST regular_file_ok ${slave_mnt}/history_f1
TEST directory_ok ${slave_mnt}/history_d1
TEST rename_ok ${slave_mnt}/history_f3 ${slave_mnt}/history_f4
TEST rename_ok ${slave_mnt}/history_d3 ${slave_mnt}/history_d4
TEST symlink_ok history_f1 ${slave_mnt}/history_sl1
TEST hardlink_file_ok ${slave_mnt}/history_f1 ${slave_mnt}/history_hl1 #40
TEST symlink_ok history_f1 ${slave_mnt}/history_sl1 #40
TEST hardlink_file_ok ${slave_mnt}/history_f1 ${slave_mnt}/history_hl1
TEST unlink_ok ${slave_mnt}/history_f2
TEST unlink_ok ${slave_mnt}/history_d2
TEST data_ok ${slave_mnt}/history_f1 "HelloWorld!"
TEST chown_file_ok ${slave_mnt}/history_chown_f1 #45
#Check History Crawl.
TEST create_data "changelog"
sleep 15
TEST check_status "Changelog Crawl" #45
TEST check_status "Changelog Crawl"
#data_tests "changelog"
sleep 15
TEST regular_file_ok ${slave_mnt}/changelog_f1
TEST directory_ok ${slave_mnt}/changelog_d1
TEST rename_ok ${slave_mnt}/changelog_f3 ${slave_mnt}/changelog_f4
TEST rename_ok ${slave_mnt}/changelog_f3 ${slave_mnt}/changelog_f4 #50
TEST rename_ok ${slave_mnt}/changelog_d3 ${slave_mnt}/changelog_d4
TEST symlink_ok changelog_f1 ${slave_mnt}/changelog_sl1 #50
TEST symlink_ok changelog_f1 ${slave_mnt}/changelog_sl1
TEST hardlink_file_ok ${slave_mnt}/changelog_f1 ${slave_mnt}/changelog_hl1
TEST unlink_ok ${slave_mnt}/changelog_f2
TEST unlink_ok ${slave_mnt}/changelog_d2
TEST unlink_ok ${slave_mnt}/changelog_d2 #55
TEST data_ok ${slave_mnt}/changelog_f1 "HelloWorld!"
TEST chown_file_ok ${slave_mnt}/changelog_chown_f1
#Stop Geo-rep
TEST $GEOREP_CLI $master $slave stop #55
TEST $GEOREP_CLI $master $slave stop
#Delete Geo-rep
TEST $GEOREP_CLI $master $slave delete