diff --git a/tests/golden/persistent-item-vers b/tests/golden/persistent-item-vers new file mode 100644 index 00000000..ff338d5d --- /dev/null +++ b/tests/golden/persistent-item-vers @@ -0,0 +1,4 @@ +== advance lock version by creating unrelated files +== create before file version +== verify before version, touch after version +== verify after version diff --git a/tests/sequence b/tests/sequence index d4be3741..9aa034d9 100644 --- a/tests/sequence +++ b/tests/sequence @@ -19,6 +19,7 @@ dirent-consistency.sh lock-ex-race-processes.sh lock-conflicting-batch-commit.sh cross-mount-data-free.sh +persistent-item-vers.sh setup-error-teardown.sh mount-unmount-race.sh createmany-parallel-mounts.sh diff --git a/tests/tests/persistent-item-vers.sh b/tests/tests/persistent-item-vers.sh new file mode 100644 index 00000000..1cb855c1 --- /dev/null +++ b/tests/tests/persistent-item-vers.sh @@ -0,0 +1,45 @@ +# +# make sure we increment item vers from persistent items +# +# Make sure that new locks are given a write_version that is greater +# than all existing items so that new items with greater versions are +# preferred over old versions with lesser versions. +# +# We create an inode in a mount that has been granted multiple locks, +# which could lead to a greater version. We then modify the item very +# early in a mount so that it's lock could have a lesser version. +# +# This was all written to test a bug where the write_version was +# statically initialized as the module was inserted. +# + +t_require_commands mkdir createmany touch stat sleep diff + +echo "== advance lock version by creating unrelated files" +mkdir "$T_D0/a" +createmany -o "$T_D0/a/file-" 10240 2>&1 > /dev/null +mkdir "$T_D0/b" +createmany -o "$T_D0/b/file-" 10240 2>&1 > /dev/null + +echo "== create before file version" +touch "$T_D0/file" +stat "$T_D0/file" | grep Modify: > "$T_TMP.before" + +# remount, possibly wiping the lock server's write_version +t_reinsert_remount_all + +echo "== verify before version, touch after version" +stat "$T_D0/file" | grep Modify: > "$T_TMP.b" +diff -u "$T_TMP.before" "$T_TMP.b" +sleep 1 +touch "$T_D0/file" +stat "$T_D0/file" | grep Modify: > "$T_TMP.after" + +# remount and make sure we got the newest version +t_remount_all + +echo "== verify after version" +stat "$T_D0/file" | grep Modify: > "$T_TMP.a" +diff -u "$T_TMP.after" "$T_TMP.a" + +t_pass