ghobject_t hoid(hobject_t("test", "", CEPH_NOSNAP, 0, -1, ""));
ghobject_t hoid2(hobject_t("test2", "", CEPH_NOSNAP, 0, -1, ""));
- const PerfCounters* logger = store->get_perf_counters();
+ PerfCounters* logger = const_cast<PerfCounters*>(store->get_perf_counters());
auto ch = store->create_new_collection(cid);
{
ASSERT_LE(statfs.allocated, (unsigned)block_size * 64);
}
- // check whether overwrite (2 * prefer_deferred_size) partially
- // overlapping two adjacent blobs goes non-deferred if one of the part is
- // above prefer_deferred_size
+ logger->reset();
+ // check whether overwrite (prefer_deferred_size < 120K < 2 * prefer_defer_size) partially
+ // overlapping two adjacent blobs goes partly deferred
{
ObjectStore::Transaction t;
bufferlist bl;
ASSERT_EQ(r, 0);
}
sleep(2);
- ASSERT_EQ(logger->get(l_bluestore_write_big), 13u);
- ASSERT_EQ(logger->get(l_bluestore_write_big_deferred), 8u);
+ ASSERT_EQ(logger->get(l_bluestore_write_big), 1u);
+ ASSERT_EQ(logger->get(l_bluestore_write_big_deferred), 1u);
+ ASSERT_EQ(logger->get(l_bluestore_write_deferred), 1u);
+ ASSERT_EQ(logger->get(l_bluestore_write_deferred_bytes), block_size);
{
struct store_statfs_t statfs;
}
}
+TEST_P(StoreTestSpecificAUSize, DeferredOnBigOverwrite2) {
+
+ if (string(GetParam()) != "bluestore")
+ return;
+
+ size_t block_size = 4096;
+ StartDeferred(block_size);
+ SetVal(g_conf(), "bluestore_max_blob_size", "65536");
+ SetVal(g_conf(), "bluestore_prefer_deferred_size", "65536");
+
+ g_conf().apply_changes(nullptr);
+
+ int r;
+ coll_t cid;
+ ghobject_t hoid(hobject_t("test", "", CEPH_NOSNAP, 0, -1, ""));
+
+ PerfCounters* logger = const_cast<PerfCounters*>(store->get_perf_counters());
+
+ auto ch = store->create_new_collection(cid);
+ {
+ ObjectStore::Transaction t;
+ t.create_collection(cid, 0);
+ r = queue_transaction(store, ch, std::move(t));
+ ASSERT_EQ(r, 0);
+ }
+ {
+ ObjectStore::Transaction t;
+ bufferlist bl;
+
+ bl.append(std::string(128 * 1024, 'c'));
+
+ t.write(cid, hoid, 0x1000, bl.length(), bl, CEPH_OSD_OP_FLAG_FADVISE_NOCACHE);
+ r = queue_transaction(store, ch, std::move(t));
+ ASSERT_EQ(r, 0);
+ ASSERT_EQ(logger->get(l_bluestore_write_big), 1u);
+ ASSERT_EQ(logger->get(l_bluestore_write_big_bytes), bl.length());
+ ASSERT_EQ(logger->get(l_bluestore_write_big_blobs), 3u);
+ ASSERT_EQ(logger->get(l_bluestore_write_big_deferred), 0u);
+ ASSERT_EQ(logger->get(l_bluestore_write_deferred), 0u);
+ ASSERT_EQ(logger->get(l_bluestore_write_deferred_bytes), 0);
+ }
+
+ logger->reset();
+ {
+ ObjectStore::Transaction t;
+ bufferlist bl;
+
+ bl.append(std::string(128 * 1024, 'c'));
+
+ t.write(cid, hoid, 0x2000, bl.length(), bl, CEPH_OSD_OP_FLAG_FADVISE_NOCACHE);
+ r = queue_transaction(store, ch, std::move(t));
+ ASSERT_EQ(r, 0);
+
+ ASSERT_EQ(logger->get(l_bluestore_write_big), 1u);
+ ASSERT_EQ(logger->get(l_bluestore_write_big_bytes), bl.length());
+ ASSERT_EQ(logger->get(l_bluestore_write_big_blobs), 3u);
+ ASSERT_EQ(logger->get(l_bluestore_write_big_deferred), 1u);
+ ASSERT_EQ(logger->get(l_bluestore_write_deferred), 1u);
+ ASSERT_EQ(logger->get(l_bluestore_write_deferred_bytes), 57344);
+ }
+
+ {
+ ObjectStore::Transaction t;
+ t.remove(cid, hoid);
+ t.remove(cid, hoid);
+ t.remove_collection(cid);
+ cerr << "Cleaning" << std::endl;
+ r = queue_transaction(store, ch, std::move(t));
+ ASSERT_EQ(r, 0);
+ }
+}
+
+TEST_P(StoreTestSpecificAUSize, DeferredOnBigOverwrite3) {
+
+ if (string(GetParam()) != "bluestore")
+ return;
+
+ size_t block_size = 4096;
+ StartDeferred(block_size);
+ SetVal(g_conf(), "bluestore_max_blob_size", "65536");
+ SetVal(g_conf(), "bluestore_prefer_deferred_size", "65536");
+
+ g_conf().apply_changes(nullptr);
+
+ int r;
+ coll_t cid;
+ ghobject_t hoid(hobject_t("test", "", CEPH_NOSNAP, 0, -1, ""));
+
+ PerfCounters* logger = const_cast<PerfCounters*>(store->get_perf_counters());
+
+ auto ch = store->create_new_collection(cid);
+ {
+ ObjectStore::Transaction t;
+ t.create_collection(cid, 0);
+ r = queue_transaction(store, ch, std::move(t));
+ ASSERT_EQ(r, 0);
+ }
+
+ logger->reset();
+ {
+ ObjectStore::Transaction t;
+ bufferlist bl;
+
+ bl.append(std::string(4096 * 1024, 'c'));
+
+ t.write(cid, hoid, 0, bl.length(), bl, CEPH_OSD_OP_FLAG_FADVISE_NOCACHE);
+ r = queue_transaction(store, ch, std::move(t));
+ ASSERT_EQ(r, 0);
+
+ ASSERT_EQ(logger->get(l_bluestore_write_big), 1u);
+ ASSERT_EQ(logger->get(l_bluestore_write_big_bytes), bl.length());
+ ASSERT_EQ(logger->get(l_bluestore_write_big_blobs), 64u);
+ ASSERT_EQ(logger->get(l_bluestore_write_big_deferred), 0u);
+ ASSERT_EQ(logger->get(l_bluestore_write_deferred), 0u);
+ ASSERT_EQ(logger->get(l_bluestore_write_deferred_bytes), 0u);
+ }
+ logger->reset();
+ {
+ ObjectStore::Transaction t;
+ bufferlist bl;
+
+ bl.append(std::string(4096 * 1024, 'c'));
+
+ t.write(cid, hoid, 0x1000, bl.length(), bl, CEPH_OSD_OP_FLAG_FADVISE_NOCACHE);
+ r = queue_transaction(store, ch, std::move(t));
+ ASSERT_EQ(r, 0);
+
+ ASSERT_EQ(logger->get(l_bluestore_write_big), 1u);
+ ASSERT_EQ(logger->get(l_bluestore_write_big_bytes), bl.length());
+ ASSERT_EQ(logger->get(l_bluestore_write_big_blobs), 65u);
+ ASSERT_EQ(logger->get(l_bluestore_write_big_deferred), 1u);
+ ASSERT_EQ(logger->get(l_bluestore_write_deferred), 1u);
+ ASSERT_EQ(logger->get(l_bluestore_write_deferred_bytes), 61440);
+ }
+ {
+ ObjectStore::Transaction t;
+ t.remove(cid, hoid);
+ t.remove_collection(cid);
+ cerr << "Cleaning" << std::endl;
+ r = queue_transaction(store, ch, std::move(t));
+ ASSERT_EQ(r, 0);
+ }
+}
TEST_P(StoreTestSpecificAUSize, DeferredDifferentChunks) {
size_t alloc_size = 4096;
size_t large_object_size = 1 * 1024 * 1024;
+ size_t prefer_deferred_size = 65536;
StartDeferred(alloc_size);
SetVal(g_conf(), "bluestore_max_blob_size", "131072");
- SetVal(g_conf(), "bluestore_prefer_deferred_size", "65536");
+ SetVal(g_conf(), "bluestore_prefer_deferred_size",
+ stringify(prefer_deferred_size).c_str());
g_conf().apply_changes(nullptr);
int r;
r = queue_transaction(store, ch, std::move(t));
ASSERT_EQ(r, 0);
}
- for (size_t expected_write_size = 1024; expected_write_size <= 65536; expected_write_size *= 2) {
+ for (size_t expected_write_size = 1024; expected_write_size <= prefer_deferred_size; expected_write_size *= 2) {
//create object with hint
ghobject_t hoid(hobject_t("test-"+to_string(expected_write_size), "", CEPH_NOSNAP, 0, -1, ""));
{
CEPH_OSD_OP_FLAG_FADVISE_NOCACHE);
r = queue_transaction(store, ch, std::move(t));
++exp_bluestore_write_big;
- ++exp_bluestore_write_big_deferred;
+ if (expected_write_size < prefer_deferred_size)
+ ++exp_bluestore_write_big_deferred;
ASSERT_EQ(r, 0);
}
ASSERT_EQ(logger->get(l_bluestore_write_big), exp_bluestore_write_big);