]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph_test_libcephfs: tolerate duplicated entries in readdir 7246/head
authorYan, Zheng <zyan@redhat.com>
Fri, 15 Jan 2016 09:15:16 +0000 (17:15 +0800)
committerYan, Zheng <zyan@redhat.com>
Fri, 15 Jan 2016 09:20:35 +0000 (17:20 +0800)
If a dirfrag get fragmented in the middle of readdir, the readdir
result may contain duplicated entries. (but there shouldn't be
any missing entries)

Fixes: #14377
Signed-off-by: Yan, Zheng <zyan@redhat.com>
src/test/libcephfs/test.cc

index 6b088df5c427559f8651138d64f52d91da8fd4b8..9f0e2a8d94389bdbb31b5eb1c7ea27a43cef6a0f 100644 (file)
@@ -301,8 +301,10 @@ TEST(LibCephFS, DirLs) {
 
   int count = 0;
   std::set<std::string> found;
-  while (count < r) {
+  while (true) {
     int len = ceph_getdents(cmount, ls_dir, (char *)getdents_entries, r * sizeof(*getdents_entries));
+    if (len == 0)
+      break;
     ASSERT_GT(len, 0);
     ASSERT_TRUE((len % sizeof(*getdents_entries)) == 0);
     int n = len / sizeof(*getdents_entries);
@@ -311,19 +313,16 @@ TEST(LibCephFS, DirLs) {
       ASSERT_STREQ(getdents_entries[0].d_name, ".");
       ASSERT_STREQ(getdents_entries[1].d_name, "..");
       j = 2;
-      count += n - 2;
     } else {
       j = 0;
-      count += n;
     }
+    count += n;
     for(; j < n; ++i, ++j) {
       const char *name = getdents_entries[j].d_name;
-      ASSERT_TRUE(found.count(name) == 0);
       found.insert(name);
     }
   }
-
-  ASSERT_EQ(count, r);
+  ASSERT_EQ(found.size(), r);
   free(getdents_entries);
 
   // test readdir_r
@@ -337,12 +336,15 @@ TEST(LibCephFS, DirLs) {
   ASSERT_STREQ(result->d_name, "..");
 
   found.clear();
-  for(i = 0; i < r; ++i) {
+  while (true) {
     struct dirent rdent;
-    ASSERT_EQ(ceph_readdir_r(cmount, ls_dir, &rdent), 1);
-    ASSERT_TRUE(found.count(rdent.d_name) ==  0);
+    int len = ceph_readdir_r(cmount, ls_dir, &rdent);
+    if (len == 0)
+      break;
+    ASSERT_EQ(len, 1);
     found.insert(rdent.d_name);
   }
+  ASSERT_EQ(found.size(), r);
 
   // test readdirplus
   ceph_rewinddir(cmount, ls_dir);
@@ -355,13 +357,15 @@ TEST(LibCephFS, DirLs) {
   ASSERT_STREQ(result->d_name, "..");
 
   found.clear();
-  for(i = 0; i < r; ++i) {
+  while (true) {
     struct dirent rdent;
     struct stat st;
     int stmask;
-    ASSERT_EQ(ceph_readdirplus_r(cmount, ls_dir, &rdent, &st, &stmask), 1);
+    int len = ceph_readdirplus_r(cmount, ls_dir, &rdent, &st, &stmask);
+    if (len == 0)
+      break;
+    ASSERT_EQ(len, 1);
     const char *name = rdent.d_name;
-    ASSERT_TRUE(found.count(name) == 0);
     found.insert(name);
     int size;
     sscanf(name, "dirf%d", &size);
@@ -369,6 +373,7 @@ TEST(LibCephFS, DirLs) {
     ASSERT_EQ(st.st_ino, rdent.d_ino);
     //ASSERT_EQ(st.st_mode, (mode_t)0666);
   }
+  ASSERT_EQ(found.size(), r);
 
   ASSERT_EQ(ceph_closedir(cmount, ls_dir), 0);