[Ocfs2-test-devel] [PATCH 49/59] discontig: fix active discontig block group

Junxiao Bi junxiao.bi at oracle.com
Sun Sep 13 19:44:35 PDT 2015


First make fs fragile and can't alloca a contig block group, then
use up all available extent block or inode block, once the new total
extent/inode block number is bigger than old one, a discontig block
group is actived.

Signed-off-by: Junxiao Bi <junxiao.bi at oracle.com>
---
 .../discontig_bg_test/activate_discontig_bg.sh     |    8 +-
 programs/discontig_bg_test/fillup_contig_bg.sh     |  114 +++-----------------
 2 files changed, 19 insertions(+), 103 deletions(-)

diff --git a/programs/discontig_bg_test/activate_discontig_bg.sh b/programs/discontig_bg_test/activate_discontig_bg.sh
index 0bb5482..14b57ea 100755
--- a/programs/discontig_bg_test/activate_discontig_bg.sh
+++ b/programs/discontig_bg_test/activate_discontig_bg.sh
@@ -37,7 +37,7 @@ LOG_FILE=
 BLOCKSIZE=4096
 CLUSTERSIZE=4096
 TYPE=inode
-SLOTS=0
+SLOTS=1
 JOURNALSIZE=0
 LABELNAME="ocfs2-discontig-bg-tests"
 MOUNT_OPTS="localalloc=0"
@@ -261,9 +261,9 @@ function f_fillup_volume_almost_full()
 	local -i recs=`f_get_recs_in_eb`
 
 	FILL_CONTIG_IBG_NUM=`f_get_inodes_num_of_contig_bg`
-	FILL_CONTIG_EBG_M=$((${extents}*${recs}*${BLOCKSIZE}/1024/1024))
-
+	FILL_CONTIG_EBG_M=$((${extents}*${recs}*${CLUSTERSIZE}/1024/1024))
 
+	f_LogMsg ${LOG_FILE} "IBG_NUM: ${FILL_CONTIG_IBG_NUM} FILL_CONTIG_EBG_M: ${FILL_CONTIG_EBG_M} extents: ${extents} recs: ${recs} disk_free: ${DISK_FREE_M} resv_mem: ${RESV_SIZE_M} slots: ${SLOTS}"
 	if [ "${TYPE}" == "extent" ];then
 		if [ "${DISK_FREE_M}" -le "$((2*${RESV_SIZE_M}+2*${FILL_CONTIG_EBG_M}*${SLOTS}))" ]; then
 			RESV_SIZE_M=$((${DISK_FREE_M}/2-${FILL_CONTIG_EBG_M}*${SLOTS}))
@@ -276,7 +276,7 @@ function f_fillup_volume_almost_full()
 		FILE_MAJOR_SIZE_M=$((${DISK_FREE_M}-2*${RESV_SIZE_M}))
 	fi
 
-	f_LogMsg ${LOG_FILE} "[*] Reserve ${FILE_MAJOR_SIZE_M}M space for a LARGE file"
+	f_LogMsg ${LOG_FILE} "[*] Reserve ${FILE_MAJOR_SIZE_M}M space for a LARGE file, reserve ${RESV_SIZE_M}M space for future test."
 	${RESV_UNWRITTEN_BIN} -f ${WORK_PLACE}/large_testfile -s 0 -l $((${FILE_MAJOR_SIZE_M}*1024*1024)) >>${LOG_FILE} 2>&1
 	RET=$?
 	f_exit_or_not ${RET}
diff --git a/programs/discontig_bg_test/fillup_contig_bg.sh b/programs/discontig_bg_test/fillup_contig_bg.sh
index dfa801f..255a3e3 100755
--- a/programs/discontig_bg_test/fillup_contig_bg.sh
+++ b/programs/discontig_bg_test/fillup_contig_bg.sh
@@ -162,6 +162,7 @@ function f_fillup_ibg()
 	local filename_prefix=
 	local filename=
 	local inode_alloc="//inode_alloc:000${SLOTNUM}"
+	local bitmap_total=`${DEBUGFS_BIN} -R "stat ${inode_alloc}" ${DEVICE} | grep "Bitmap Total" | awk -F ' ' '{print $3}'`
 
 	f_LogMsg ${LOG_FILE} "Fill inode block groups by touching ${FILL_CONTIG_IBG_NUM} files."
 	filename_prefix=fill_contig_igb_testfile
@@ -175,41 +176,14 @@ function f_fillup_ibg()
 	done
 
 	sync
-
-	${DEBUGFS_BIN} -R "stat ${inode_alloc}" ${DEVICE} |grep -q "Tree Depth" && {
+	cur_bitmap_total=`${DEBUGFS_BIN} -R "stat ${inode_alloc}" ${DEVICE} | grep "Bitmap Total" | awk -F ' ' '{print $3}'`
+	if [ $cur_bitmap_total -gt $bitmap_total ]; then
 		f_LogMsg ${LOG_FILE} "Oh, boy, now we have activated discontiguous inode block group."
 		return 0
-	}
-
-	i=1
-	filename_prefix=fill_contig_igb_testfile_addup_inode
-	while :;do
-		filename=${filename_prefix}${i}
-		if [ "${i}" -gt "$OCFS2_LINK_MAX" ];then
-			mkdir -p ${WORK_PLACE}/${filename}
-			i=1
-			filename_prefix=${filename}/
-			continue
-		else
-			dd if=/dev/zero of=${WORK_PLACE}/$filename bs=4k count=1 >/dev/null  2>&1|| {
-				f_LogMsg ${LOG_FILE} "No discontig block group created until volume gets full."
-				RET=1
-				break
-			}
-		fi
-
-		sync
-
-		${DEBUGFS_BIN} -R "stat ${WORK_PLACE_DIRENT}/${filename}" ${DEVICE} |grep -q "Sub Alloc Group" && {
-			f_LogMsg ${LOG_FILE} "Oh, boy, now we have activated one discontiguous inode block group."
-			break;
-		}
-
-		((i++))
-	done
-	RET=$?
-
-	return $RET
+	else
+		f_LogMsg ${LOG_FILE} "sorry, activated discontiguous inode block group failed."
+		return 1
+	fi
 }
 
 function f_is_xattr_in_block()
@@ -229,8 +203,9 @@ function f_fillup_ebg()
 	local filename=${WORK_PLACE}/fill_contig_egb_testfile_`hostname`
 	local fileszie=
 	local extent_alloc="//extent_alloc:000${SLOTNUM}"
+	local bitmap_total=`${DEBUGFS_BIN} -R "stat ${extent_alloc}" ${DEVICE} | grep "Bitmap Total" | awk -F ' ' '{print $3}'`
 
-	filesize=$((${FILL_CONTIG_EBG_M}*1024*1024/2))
+	filesize=$((${FILL_CONTIG_EBG_M}*1024*1024/2+1))
 
 	f_LogMsg ${LOG_FILE} "Fill contiguous extent block groups by gen_extents"
 	f_LogMsg ${LOG_FILE} "CMD: ${GEN_EXTENTS_BIN} -f ${filename} -l ${filesize} -c ${CLUSTERSIZE} -k 1"
@@ -241,73 +216,14 @@ function f_fillup_ebg()
 
 	sync
 
-	${DEBUGFS_BIN} -R "stat ${extent_alloc}" ${DEVICE} |grep -q "Tree Depth" && {
+	cur_bitmap_total=`${DEBUGFS_BIN} -R "stat ${extent_alloc}" ${DEVICE} | grep "Bitmap Total" | awk -F ' ' '{print $3}'`
+	if [ $cur_bitmap_total -gt $bitmap_total ]; then
 		f_LogMsg ${LOG_FILE} "Oh, boy, now we have activated one discontiguous extent block group."
 		return 0
-	}
-
-	# if above operation didn't consume up the contig extent block
-	# exactly, we need to slowly force the filling-up by populating
-	# xattr blocks from exteng bg.
-	local -i i=1
-	local filename_prefix=fill_contig_egb_testfile_addup_xattr
-	f_LogMsg ${LOG_FILE} "Use additional xattr extents to activate the discontig."
-	while :;do
-		filename=${filename_prefix}${i}
-		if [ "${i}" -gt "$OCFS2_LINK_MAX" ];then
-			mkdir -p ${WORK_PLACE}/${filename}
-			# We should not trying to make more directories
-			# if the test run out of inodes against the test
-			# file system, which means that the test failed
-			# to make the test storage fragmented this time
-			# so that the discontig block group did not took
-			# affected.  By breaking the test per mkdir failure,
-			# we can fix the test hanging issue with meaningful
-			# log information to indicate that.
-			# TODO: Figure out a better approach to make discontig
-			# block group ASAP.
-                        if [ "$?" -ne "0" ];then
-                                f_LogMsg ${LOG_FILE} "mkdir ${WORK_PLACE}/${filename} failed."
-                                break;
-                        fi
-
-			i=1
-			filename_prefix=${filename}/
-			continue
-		else
-			${TOUCH_BIN} ${WORK_PLACE}/$filename >>${LOG_FILE} 2>&1|| {
-				f_LogMsg ${LOG_FILE} "touch ${filename} failed."
-				RET=1
-				break
-			}
-
-			sync
-
-			for j in $(seq 100);do
-				${SETXATTR} -n user.name${j} -v value${j} ${WORK_PLACE}/${filename} >>${LOG_FILE} 2>&1 || {
-					f_LogMsg ${LOG_FILE} "setxattr failed."
-					break
-				}
-
-				f_is_xattr_in_block ${WORK_PLACE_DIRENT}/${filename} ${DEVICE} && {
-					break
-				}
-			done
-
-		fi
-
-		sync
-
-		${DEBUGFS_BIN} -R "stat ${extent_alloc}" ${DEVICE} |grep -q "Tree Depth" && {
-			f_LogMsg ${LOG_FILE} "Oh, boy, now we have activated one discontiguous extent block group."
-			break;
-		}
-
-		((i++))
-	done
-	RET=$?
-
-	return $RET
+	else
+		f_LogMsg ${LOG_FILE} "discontig extent block group is not enabled, old bitmap $bitmap_total new bitmap $cur_bitmap_total"
+		return 1
+	fi
 }
 
 function f_fillup_bg()
-- 
1.7.9.5




More information about the Ocfs2-test-devel mailing list