]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
test/filestore/store_test: add test for 5723
authorSamuel Just <sam.just@inktank.com>
Wed, 24 Jul 2013 00:34:25 +0000 (17:34 -0700)
committerSamuel Just <sam.just@inktank.com>
Thu, 25 Jul 2013 17:32:59 +0000 (10:32 -0700)
Signed-off-by: Samuel Just <sam.just@inktank.com>
Reviewed-by: Sage Weil <sage@inktank.com>
src/os/LFNIndex.cc
src/test/filestore/store_test.cc

index edf361a44f0fa6061aba4a96a063e4184e0fc208..09d0f02267f8c1e5c032165484ce816b007ac4b1 100644 (file)
@@ -75,16 +75,19 @@ int LFNIndex::init()
 
 int LFNIndex::created(const hobject_t &hoid, const char *path)
 {
+  WRAP_RETRY(
   vector<string> path_comp;
   string short_name;
-  int r;
   r = decompose_full_path(path, &path_comp, 0, &short_name);
   if (r < 0)
-    return r;
+    goto out;
   r = lfn_created(path_comp, hoid, short_name);
   if (r < 0)
-    return r;
-  return _created(path_comp, hoid, short_name);
+    goto out;
+  r = _created(path_comp, hoid, short_name);
+  if (r < 0)
+    goto out;
+    );
 }
 
 int LFNIndex::unlink(const hobject_t &hoid)
index 87482ef702d8c3da72f81b81b9c2af3af8511cb6..80c775052eca31423cd12c07b23226a5551eebcc 100644 (file)
@@ -829,6 +829,75 @@ TEST_F(StoreTest, ColSplitTest3) {
 }
 #endif
 
+/**
+ * This test tests adding two different groups
+ * of objects, each with 1 common prefix and 1
+ * different prefix.  We then remove half
+ * in order to verify that the merging correctly
+ * stops at the common prefix subdir.  See bug
+ * #5273 */
+TEST_F(StoreTest, TwoHash) {
+  coll_t cid("asdf");
+  int r;
+  {
+    ObjectStore::Transaction t;
+    t.create_collection(cid);
+    r = store->apply_transaction(t);
+    ASSERT_EQ(r, 0);
+  }
+  std::cout << "Making objects" << std::endl;
+  for (int i = 0; i < 360; ++i) {
+    ObjectStore::Transaction t;
+    hobject_t o;
+    if (i < 8) {
+      o.hash = (i << 16) | 0xA1;
+      t.touch(cid, o);
+    }
+    o.hash = (i << 16) | 0xB1;
+    t.touch(cid, o);
+    r = store->apply_transaction(t);
+    ASSERT_EQ(r, 0);
+  }
+  std::cout << "Removing half" << std::endl;
+  for (int i = 1; i < 8; ++i) {
+    ObjectStore::Transaction t;
+    hobject_t o;
+    o.hash = (i << 16) | 0xA1;
+    t.remove(cid, o);
+    r = store->apply_transaction(t);
+    ASSERT_EQ(r, 0);
+  }
+  std::cout << "Checking" << std::endl;
+  for (int i = 1; i < 8; ++i) {
+    ObjectStore::Transaction t;
+    hobject_t o;
+    o.hash = (i << 16) | 0xA1;
+    bool exists = store->exists(cid, o);
+    ASSERT_EQ(exists, false);
+  }
+  {
+    hobject_t o;
+    o.hash = 0xA1;
+    bool exists = store->exists(cid, o);
+    ASSERT_EQ(exists, true);
+  }
+  std::cout << "Cleanup" << std::endl;
+  for (int i = 0; i < 360; ++i) {
+    ObjectStore::Transaction t;
+    hobject_t o;
+    o.hash = (i << 16) | 0xA1;
+    t.remove(cid, o);
+    o.hash = (i << 16) | 0xB1;
+    t.remove(cid, o);
+    r = store->apply_transaction(t);
+    ASSERT_EQ(r, 0);
+  }
+  ObjectStore::Transaction t;
+  t.remove_collection(cid);
+  r = store->apply_transaction(t);
+  ASSERT_EQ(r, 0);
+}
+
 //
 // support tests for qa/workunits/filestore/filestore.sh
 //
@@ -892,7 +961,7 @@ int main(int argc, char **argv) {
   global_init(NULL, args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, 0);
   common_init_finish(g_ceph_context);
   g_ceph_context->_conf->set_val("osd_journal_size", "400");
-  g_ceph_context->_conf->set_val("filestore_index_retry_probability", "1");
+  g_ceph_context->_conf->set_val("filestore_index_retry_probability", "0.5");
   g_ceph_context->_conf->set_val("filestore_op_thread_timeout", "1000");
   g_ceph_context->_conf->set_val("filestore_op_thread_suicide_timeout", "10000");
   g_ceph_context->_conf->apply_changes(NULL);