From bf21699ad792071cc1c61b42b4c2ea9ca667c774 Mon Sep 17 00:00:00 2001 From: Zach Brown Date: Wed, 8 Nov 2023 15:01:54 -0800 Subject: [PATCH] bulk_create_paths test tool takes xattr name Previously the bulk_create_paths test tool used the same xattr name for each category of xattrs it was creating. This created a problem where two tests got their xattrs confused with each other. The first test created a bunch of srch xattrs, failed, and didn't clean up after itself. The second test saw these search xattrs as its own and got very confused when there were far more srch xattrs than it thought it had created. This lets each test specify the srch xattr names that are created by bulk_create_paths so that tests can work with their xattrs independent of each other. Signed-off-by: Zach Brown --- tests/src/bulk_create_paths.c | 95 ++++++++++++++----------- tests/tests/srch-basic-functionality.sh | 47 ++++++------ tests/tests/srch-safe-merge-pos.sh | 2 +- 3 files changed, 80 insertions(+), 64 deletions(-) diff --git a/tests/src/bulk_create_paths.c b/tests/src/bulk_create_paths.c index e9886443..9e5a3db8 100644 --- a/tests/src/bulk_create_paths.c +++ b/tests/src/bulk_create_paths.c @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -35,10 +36,10 @@ struct opts { unsigned int dry_run:1, ls_output:1, quiet:1, - user_xattr:1, - same_srch_xattr:1, - group_srch_xattr:1, - unique_srch_xattr:1; + xattr_set:1, + xattr_file:1, + xattr_group:1; + char *xattr_name; }; struct stats { @@ -149,12 +150,31 @@ static void free_dir(struct dir *dir) free(dir); } +static size_t snprintf_off(void *buf, size_t sz, size_t off, char *fmt, ...) +{ + va_list ap; + int ret; + + if (off >= sz) + return sz; + + va_start(ap, fmt); + ret = vsnprintf(buf + off, sz - off, fmt, ap); + va_end(ap); + + if (ret <= 0) + return sz; + + return off + ret; +} + static void create_dir(struct dir *dir, struct opts *opts, struct stats *stats) { struct str_list *s; - char name[100]; + char name[256]; /* max len and null term */ char val = 'v'; + size_t off; int rc; int i; @@ -175,29 +195,21 @@ static void create_dir(struct dir *dir, struct opts *opts, rc = mknod(s->str, S_IFREG | 0644, 0); error_exit(rc, "mknod %s failed"ERRF, s->str, ERRA); - rc = 0; - if (rc == 0 && opts->user_xattr) { - strcpy(name, "user.scoutfs_bcp"); - rc = setxattr(s->str, name, &val, 1, 0); - } - if (rc == 0 && opts->same_srch_xattr) { - strcpy(name, "scoutfs.srch.scoutfs_bcp"); - rc = setxattr(s->str, name, &val, 1, 0); - } - if (rc == 0 && opts->group_srch_xattr) { - snprintf(name, sizeof(name), - "scoutfs.srch.scoutfs_bcp.group.%lu", - stats->files / 10000); - rc = setxattr(s->str, name, &val, 1, 0); - } - if (rc == 0 && opts->unique_srch_xattr) { - snprintf(name, sizeof(name), - "scoutfs.srch.scoutfs_bcp.unique.%lu", - stats->files); + if (opts->xattr_set) { + off = snprintf_off(name, sizeof(name), 0, "%s", opts->xattr_name); + if (opts->xattr_file) + off = snprintf_off(name, sizeof(name), off, + "-f-%lu", stats->files); + if (opts->xattr_group) + off = snprintf_off(name, sizeof(name), off, + "-g-%lu", stats->files / 10000); + + error_exit(off >= sizeof(name), "xattr name longer than 255 bytes"); + rc = setxattr(s->str, name, &val, 1, 0); + error_exit(rc, "setxattr %s %s failed"ERRF, s->str, name, ERRA); } - error_exit(rc, "setxattr %s %s failed"ERRF, s->str, name, ERRA); stats->files++; rate_banner(opts, stats); @@ -365,11 +377,10 @@ static void usage(void) " -d DIR | create all files in DIR top level directory\n" " -n | dry run, only parse, don't create any files\n" " -q | quiet, don't regularly print rates\n" + " -F | append \"-f-NR\" file nr to xattr name, requires -X\n" + " -G | append \"-g-NR\" file nr/10000 to xattr name, requires -X\n" " -L | parse ls output; only reg, skip meta, paths at ./\n" - " -X | set the same user. xattr name in all files\n" - " -S | set the same .srch. xattr name in all files\n" - " -G | set a .srch. xattr name shared by groups of files\n" - " -U | set a unique .srch. xattr name in all files\n"); + " -X NAM | set named xattr in all files\n"); } int main(int argc, char **argv) @@ -386,7 +397,7 @@ int main(int argc, char **argv) memset(&opts, 0, sizeof(opts)); - while ((c = getopt(argc, argv, "d:nqLXSGU")) != -1) { + while ((c = getopt(argc, argv, "d:nqFGLX:")) != -1) { switch(c) { case 'd': top_dir = strdup(optarg); @@ -397,20 +408,19 @@ int main(int argc, char **argv) case 'q': opts.quiet = 1; break; + case 'F': + opts.xattr_file = 1; + break; + case 'G': + opts.xattr_group = 1; + break; case 'L': opts.ls_output = 1; break; case 'X': - opts.user_xattr = 1; - break; - case 'S': - opts.same_srch_xattr = 1; - break; - case 'G': - opts.group_srch_xattr = 1; - break; - case 'U': - opts.unique_srch_xattr = 1; + opts.xattr_set = 1; + opts.xattr_name = strdup(optarg); + error_exit(!opts.xattr_name, "error allocating xattr name"); break; case '?': printf("Unknown option '%c'\n", optopt); @@ -419,6 +429,11 @@ int main(int argc, char **argv) } } + error_exit(opts.xattr_file && !opts.xattr_set, + "must specify xattr -X when appending file nr with -F"); + error_exit(opts.xattr_group && !opts.xattr_set, + "must specify xattr -X when appending file nr with -G"); + if (!opts.dry_run) { error_exit(!top_dir, "must specify top level directory with -d"); diff --git a/tests/tests/srch-basic-functionality.sh b/tests/tests/srch-basic-functionality.sh index 1b982489..34c221cf 100644 --- a/tests/tests/srch-basic-functionality.sh +++ b/tests/tests/srch-basic-functionality.sh @@ -9,6 +9,7 @@ LOG=340000 LIM=1000000 SEQF="%.20g" +SXA="scoutfs.srch.test-srch-basic-functionality" t_require_commands touch rm setfattr scoutfs find_xattrs @@ -27,20 +28,20 @@ diff_srch_find() echo "== create new xattrs" touch "$T_D0/"{create,update} -setfattr -n scoutfs.srch.test -v 1 "$T_D0/"{create,update} 2>&1 | t_filter_fs -diff_srch_find scoutfs.srch.test +setfattr -n $SXA -v 1 "$T_D0/"{create,update} 2>&1 | t_filter_fs +diff_srch_find $SXA echo "== update existing xattr" -setfattr -n scoutfs.srch.test -v 2 "$T_D0/update" 2>&1 | t_filter_fs -diff_srch_find scoutfs.srch.test +setfattr -n $SXA -v 2 "$T_D0/update" 2>&1 | t_filter_fs +diff_srch_find $SXA echo "== remove an xattr" -setfattr -x scoutfs.srch.test "$T_D0/create" 2>&1 | t_filter_fs -diff_srch_find scoutfs.srch.test +setfattr -x $SXA "$T_D0/create" 2>&1 | t_filter_fs +diff_srch_find $SXA echo "== remove xattr with files" rm -f "$T_D0/"{create,update} -diff_srch_find scoutfs.srch.test +diff_srch_find $SXA echo "== trigger small log merges by rotating single block with unmount" sv=$(t_server_nr) @@ -56,7 +57,7 @@ while [ "$i" -lt "8" ]; do eval path="\$T_D${nr}/single-block-$i" touch "$path" - setfattr -n scoutfs.srch.single-block-logs -v $i "$path" + setfattr -n $SXA -v $i "$path" t_umount $nr t_mount $nr @@ -71,45 +72,45 @@ echo "== create entries in current log" DIR="$T_D0/dir" NR=$((LOG / 4)) mkdir -p "$DIR" -seq -f "f-$SEQF" 1 $NR | src/bulk_create_paths -S -d "$DIR" > /dev/null -diff_srch_find scoutfs.srch.scoutfs_bcp +seq -f "f-$SEQF" 1 $NR | src/bulk_create_paths -X $SXA -d "$DIR" > /dev/null +diff_srch_find $SXA echo "== delete small fraction" -seq -f "$DIR/f-$SEQF" 1 7 $NR | xargs setfattr -x scoutfs.srch.scoutfs_bcp -diff_srch_find scoutfs.srch.scoutfs_bcp +seq -f "$DIR/f-$SEQF" 1 7 $NR | xargs setfattr -x $SXA +diff_srch_find $SXA echo "== remove files" rm -rf "$DIR" -diff_srch_find scoutfs.srch.scoutfs_bcp +diff_srch_find $SXA echo "== create entries that exceed one log" NR=$((LOG * 3 / 2)) mkdir -p "$DIR" -seq -f "f-$SEQF" 1 $NR | src/bulk_create_paths -S -d "$DIR" > /dev/null -diff_srch_find scoutfs.srch.scoutfs_bcp +seq -f "f-$SEQF" 1 $NR | src/bulk_create_paths -X $SXA -d "$DIR" > /dev/null +diff_srch_find $SXA echo "== delete fractions in phases" for i in $(seq 1 3); do - seq -f "$DIR/f-$SEQF" $i 3 $NR | xargs setfattr -x scoutfs.srch.scoutfs_bcp - diff_srch_find scoutfs.srch.scoutfs_bcp + seq -f "$DIR/f-$SEQF" $i 3 $NR | xargs setfattr -x $SXA + diff_srch_find $SXA done echo "== remove files" rm -rf "$DIR" -diff_srch_find scoutfs.srch.scoutfs_bcp +diff_srch_find $SXA echo "== create entries for exceed search entry limit" NR=$((LIM * 3 / 2)) mkdir -p "$DIR" -seq -f "f-$SEQF" 1 $NR | src/bulk_create_paths -S -d "$DIR" > /dev/null -diff_srch_find scoutfs.srch.scoutfs_bcp +seq -f "f-$SEQF" 1 $NR | src/bulk_create_paths -X $SXA -d "$DIR" > /dev/null +diff_srch_find $SXA echo "== delete half" -seq -f "$DIR/f-$SEQF" 1 2 $NR | xargs setfattr -x scoutfs.srch.scoutfs_bcp -diff_srch_find scoutfs.srch.scoutfs_bcp +seq -f "$DIR/f-$SEQF" 1 2 $NR | xargs setfattr -x $SXA +diff_srch_find $SXA echo "== entirely remove third batch" rm -rf "$DIR" -diff_srch_find scoutfs.srch.scoutfs_bcp +diff_srch_find $SXA t_pass diff --git a/tests/tests/srch-safe-merge-pos.sh b/tests/tests/srch-safe-merge-pos.sh index 99a131cc..bd388a18 100644 --- a/tests/tests/srch-safe-merge-pos.sh +++ b/tests/tests/srch-safe-merge-pos.sh @@ -47,7 +47,7 @@ for i in $(seq 1 $COMPACT_NR); do t_trigger_arm srch_force_log_rotate $sv seq -f "f-$i-$j-$SEQF" 1 10 | \ - bulk_create_paths -S -d "$T_D0" > \ + bulk_create_paths -X "scoutfs.srch.t-srch-safe-merge-pos" -d "$T_D0" > \ /dev/null sync