Project

General

Profile

Bug #19247 » 19247.cc

A test case with an unsuccessful attempt to reproduce the bug - Igor Fedotov, 03/09/2017 12:02 PM

 
//!!!! to be included into src/test/objectstore/store_test.cc!!!

TEST_P(StoreTestSpecificAUSize, BlobReuseBug) {

if (string(GetParam()) != "bluestore")
return;

size_t block_size = 0x10000;
StartDeferred(block_size);
g_conf->set_val("bluestore_max_blob_size", "131072");
g_conf->set_val("bluestore_compression_mode", "force");
g_conf->apply_changes(NULL);

ObjectStore::Sequencer osr("test");
int r;
coll_t cid;
ghobject_t hoid1(hobject_t(sobject_t("Object 1", CEPH_NOSNAP)));
ghobject_t hoid2(hobject_t(sobject_t("Object 2", CEPH_NOSNAP)));

const PerfCounters* logger = store->get_perf_counters();

{
ObjectStore::Transaction t;
t.create_collection(cid, 0);
r = apply_transaction(store, &osr, std::move(t));
ASSERT_EQ(r, 0);
}
{
ObjectStore::Transaction t;
bufferlist bl, bl2;

t.touch(cid, hoid1);
t.touch(cid, hoid2);
t.set_alloc_hint(cid, hoid1,
0x20000,
0x4000,
0);
t.set_alloc_hint(cid, hoid2,
0x20000,
0x4000,
0);

bl.append(std::string(0x17000, 'a'));
t.write(cid, hoid1, 0, bl.length(), bl, 0);
bl2.append(std::string(0x1000, 'c'));
t.write(cid, hoid1, 0x17000, bl2.length(), bl2, 0);
t.zero(cid, hoid1, 0, 0x14a00);

t.touch(cid, hoid2);
r = apply_transaction(store, &osr, std::move(t));
ASSERT_EQ(r, 0);
}

{
ObjectStore::Transaction t;
bufferlist bl, expected;

t.clone_range(cid, hoid1, hoid2, 0x400, 0x17c00, 0x400);
r = apply_transaction(store, &osr, std::move(t));
ASSERT_EQ(r, 0);

r = store->read(cid, hoid1, 0x14a00, 0x3600, bl);
ASSERT_EQ(r, (int)0x3600);
expected.append(string(0x2600, 'a'));
expected.append(string(0x1000, 'c'));
ASSERT_TRUE(bl_eq(expected, bl));
bl.clear();
r = store->read(cid, hoid2, 0x14a00, 0x3600, bl);
ASSERT_EQ(r, (int)0x3600);
ASSERT_TRUE(bl_eq(expected, bl));

}
{
// partially zero source
ObjectStore::Transaction t;
bufferlist bl, expected;

t.zero(cid, hoid1, 0x14e00, 0x19600);
r = apply_transaction(store, &osr, std::move(t));
ASSERT_EQ(r, 0);

r = store->read(cid, hoid1, 0x14a00, 0x3600, bl);
ASSERT_EQ(r, (int)0x3600);
expected.append(string(0x400, 'a'));
expected.append(string(0x3200, 0));
ASSERT_TRUE(bl_eq(expected, bl));
bl.clear();
expected.clear();
expected.append(string(0x2600, 'a'));
expected.append(string(0x1000, 'c'));
r = store->read(cid, hoid2, 0x14a00, 0x3600, bl);
ASSERT_EQ(r, (int)bl.length());
ASSERT_TRUE(bl_eq(expected, bl));
}

{
ObjectStore::Transaction t;
t.remove(cid, hoid1);
t.remove(cid, hoid2);
t.remove_collection(cid);
cerr << "Cleaning" << std::endl;
r = apply_transaction(store, &osr, std::move(t));
ASSERT_EQ(r, 0);
}
g_conf->set_val("bluestore_compression_mode", "none");
g_conf->set_val("bluestore_max_blob_size", "524288");

}
(2-2/2)