From: Sage Weil Date: Wed, 13 Aug 2014 21:10:31 +0000 (-0700) Subject: Merge remote-tracking branch 'gh/next' X-Git-Tag: v0.85~48 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=473f4bd39539cc0e33ffd47c04a3158763742590;p=ceph.git Merge remote-tracking branch 'gh/next' --- 473f4bd39539cc0e33ffd47c04a3158763742590 diff --cc src/osd/OSD.cc index 5f0635b0ef06,15f4000cc634..a6568d0526e7 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@@ -6780,13 -6710,15 +6783,15 @@@ bool OSD::require_same_peer_instance(Op map->get_cluster_addr(from) : entity_addr_t()) << dendl; ConnectionRef con = m->get_connection(); - cluster_messenger->mark_down(con.get()); + con->mark_down(); Session *s = static_cast(con->get_priv()); if (s) { - s->session_dispatch_lock.Lock(); + if (!is_fast_dispatch) + s->session_dispatch_lock.Lock(); clear_session_waiting_on_map(s); con->set_priv(NULL); // break ref <-> session cycle, if any - s->session_dispatch_lock.Unlock(); + if (!is_fast_dispatch) + s->session_dispatch_lock.Unlock(); s->put(); } return false; diff --cc src/test/librados/tier.cc index c2bd5feb86eb,426738957822..ad30d2516c21 --- a/src/test/librados/tier.cc +++ b/src/test/librados/tier.cc @@@ -2193,98 -2076,8 +2076,93 @@@ TEST_F(LibRadosTwoPoolsPP, HitSetTrim) sleep(1); } - - ASSERT_EQ(0, cluster.mon_command( - "{\"prefix\": \"osd tier remove\", \"pool\": \"" + pool_name + - "\", \"tierpool\": \"" + cache_pool_name + "\"}", - inbl, NULL, NULL)); } +TEST_F(LibRadosTwoPoolsPP, PromoteOn2ndRead) { + // create object + { + bufferlist bl; + bl.append("hi there"); + ObjectWriteOperation op; + op.write_full(bl); + ASSERT_EQ(0, ioctx.operate("foo", &op)); + } + + // configure cache + bufferlist inbl; + ASSERT_EQ(0, cluster.mon_command( + "{\"prefix\": \"osd tier add\", \"pool\": \"" + pool_name + + "\", \"tierpool\": \"" + cache_pool_name + + "\", \"force_nonempty\": \"--force-nonempty\" }", + inbl, NULL, NULL)); + ASSERT_EQ(0, cluster.mon_command( + "{\"prefix\": \"osd tier set-overlay\", \"pool\": \"" + pool_name + + "\", \"overlaypool\": \"" + cache_pool_name + "\"}", + inbl, NULL, NULL)); + ASSERT_EQ(0, cluster.mon_command( + "{\"prefix\": \"osd tier cache-mode\", \"pool\": \"" + cache_pool_name + + "\", \"mode\": \"writeback\"}", + inbl, NULL, NULL)); + + // enable hitset tracking for this pool + ASSERT_EQ(0, cluster.mon_command( + set_pool_str(cache_pool_name, "hit_set_count", 2), + inbl, NULL, NULL)); + ASSERT_EQ(0, cluster.mon_command( + set_pool_str(cache_pool_name, "hit_set_period", 600), + inbl, NULL, NULL)); + ASSERT_EQ(0, cluster.mon_command( + set_pool_str(cache_pool_name, "hit_set_type", "bloom"), + inbl, NULL, NULL)); + ASSERT_EQ(0, cluster.mon_command( + set_pool_str(cache_pool_name, "min_read_recency_for_promote", 1), + inbl, NULL, NULL)); + + // wait for maps to settle + cluster.wait_for_latest_osdmap(); + + // 1st read, don't trigger a promote + { + bufferlist bl; + ASSERT_EQ(1, ioctx.read("foo", bl, 1, 0)); + } + + // verify the object is NOT present in the cache tier + { + ObjectIterator it = cache_ioctx.objects_begin(); + ASSERT_TRUE(it == cache_ioctx.objects_end()); + } + + // Read until the object is present in the cache tier + while (true) { + bufferlist bl; + ASSERT_EQ(1, ioctx.read("foo", bl, 1, 0)); + + ObjectIterator it = cache_ioctx.objects_begin(); + if (it != cache_ioctx.objects_end()) { + ASSERT_TRUE(it->first == string("foo")); + ++it; + ASSERT_TRUE(it == cache_ioctx.objects_end()); + break; + } + + sleep(1); + } + + // tear down tiers + ASSERT_EQ(0, cluster.mon_command( + "{\"prefix\": \"osd tier remove-overlay\", \"pool\": \"" + pool_name + + "\"}", + inbl, NULL, NULL)); + ASSERT_EQ(0, cluster.mon_command( + "{\"prefix\": \"osd tier remove\", \"pool\": \"" + pool_name + + "\", \"tierpool\": \"" + cache_pool_name + "\"}", + inbl, NULL, NULL)); + + // wait for maps to settle before next test + cluster.wait_for_latest_osdmap(); +} + class LibRadosTwoPoolsECPP : public RadosTestECPP { public: @@@ -4275,98 -3941,8 +4026,93 @@@ TEST_F(LibRadosTwoPoolsECPP, HitSetTrim sleep(1); } delete[] buf; - - ASSERT_EQ(0, cluster.mon_command( - "{\"prefix\": \"osd tier remove\", \"pool\": \"" + pool_name + - "\", \"tierpool\": \"" + cache_pool_name + "\"}", - inbl, NULL, NULL)); } +TEST_F(LibRadosTwoPoolsECPP, PromoteOn2ndRead) { + // create object + { + bufferlist bl; + bl.append("hi there"); + ObjectWriteOperation op; + op.write_full(bl); + ASSERT_EQ(0, ioctx.operate("foo", &op)); + } + + // configure cache + bufferlist inbl; + ASSERT_EQ(0, cluster.mon_command( + "{\"prefix\": \"osd tier add\", \"pool\": \"" + pool_name + + "\", \"tierpool\": \"" + cache_pool_name + + "\", \"force_nonempty\": \"--force-nonempty\" }", + inbl, NULL, NULL)); + ASSERT_EQ(0, cluster.mon_command( + "{\"prefix\": \"osd tier set-overlay\", \"pool\": \"" + pool_name + + "\", \"overlaypool\": \"" + cache_pool_name + "\"}", + inbl, NULL, NULL)); + ASSERT_EQ(0, cluster.mon_command( + "{\"prefix\": \"osd tier cache-mode\", \"pool\": \"" + cache_pool_name + + "\", \"mode\": \"writeback\"}", + inbl, NULL, NULL)); + + // enable hitset tracking for this pool + ASSERT_EQ(0, cluster.mon_command( + set_pool_str(cache_pool_name, "hit_set_count", 2), + inbl, NULL, NULL)); + ASSERT_EQ(0, cluster.mon_command( + set_pool_str(cache_pool_name, "hit_set_period", 600), + inbl, NULL, NULL)); + ASSERT_EQ(0, cluster.mon_command( + set_pool_str(cache_pool_name, "hit_set_type", "bloom"), + inbl, NULL, NULL)); + ASSERT_EQ(0, cluster.mon_command( + set_pool_str(cache_pool_name, "min_read_recency_for_promote", 1), + inbl, NULL, NULL)); + + // wait for maps to settle + cluster.wait_for_latest_osdmap(); + + // 1st read, don't trigger a promote + { + bufferlist bl; + ASSERT_EQ(1, ioctx.read("foo", bl, 1, 0)); + } + + // verify the object is NOT present in the cache tier + { + ObjectIterator it = cache_ioctx.objects_begin(); + ASSERT_TRUE(it == cache_ioctx.objects_end()); + } + + // Read until the object is present in the cache tier + while (true) { + bufferlist bl; + ASSERT_EQ(1, ioctx.read("foo", bl, 1, 0)); + + ObjectIterator it = cache_ioctx.objects_begin(); + if (it != cache_ioctx.objects_end()) { + ASSERT_TRUE(it->first == string("foo")); + ++it; + ASSERT_TRUE(it == cache_ioctx.objects_end()); + break; + } + + sleep(1); + } + + // tear down tiers + ASSERT_EQ(0, cluster.mon_command( + "{\"prefix\": \"osd tier remove-overlay\", \"pool\": \"" + pool_name + + "\"}", + inbl, NULL, NULL)); + ASSERT_EQ(0, cluster.mon_command( + "{\"prefix\": \"osd tier remove\", \"pool\": \"" + pool_name + + "\", \"tierpool\": \"" + cache_pool_name + "\"}", + inbl, NULL, NULL)); + + // wait for maps to settle before next test + cluster.wait_for_latest_osdmap(); +} + int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv);