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