}
}
+TEST_P(StoreTest, TrivialRemount) {
+ store->umount();
+ int r = store->mount();
+ ASSERT_EQ(0, r);
+}
+
+TEST_P(StoreTest, SimpleRemount) {
+ coll_t cid;
+ ghobject_t hoid(hobject_t(sobject_t("Object 1", CEPH_NOSNAP)));
+ ghobject_t hoid2(hobject_t(sobject_t("Object 2", CEPH_NOSNAP)));
+ bufferlist bl;
+ bl.append("1234512345");
+ int r;
+ {
+ cerr << "create collection + write" << std::endl;
+ ObjectStore::Transaction t;
+ t.create_collection(cid, 0);
+ t.write(cid, hoid, 0, bl.length(), bl);
+ r = store->apply_transaction(t);
+ ASSERT_EQ(r, 0);
+ }
+ store->umount();
+ r = store->mount();
+ ASSERT_EQ(0, r);
+ {
+ ObjectStore::Transaction t;
+ t.write(cid, hoid2, 0, bl.length(), bl);
+ r = store->apply_transaction(t);
+ ASSERT_EQ(r, 0);
+ }
+ {
+ ObjectStore::Transaction t;
+ t.remove(cid, hoid);
+ t.remove(cid, hoid2);
+ t.remove_collection(cid);
+ cerr << "remove collection" << std::endl;
+ r = store->apply_transaction(t);
+ ASSERT_EQ(r, 0);
+ }
+}
+
+TEST_P(StoreTest, IORemount) {
+ coll_t cid;
+ bufferlist bl;
+ bl.append("1234512345");
+ int r;
+ {
+ cerr << "create collection + objects" << std::endl;
+ ObjectStore::Transaction t;
+ t.create_collection(cid, 0);
+ for (int n=1; n<=100; ++n) {
+ ghobject_t hoid(hobject_t(sobject_t("Object " + stringify(n), CEPH_NOSNAP)));
+ t.write(cid, hoid, 0, bl.length(), bl);
+ }
+ r = store->apply_transaction(t);
+ ASSERT_EQ(r, 0);
+ }
+ // overwrites
+ {
+ cout << "overwrites" << std::endl;
+ for (int n=1; n<=100; ++n) {
+ ObjectStore::Transaction t;
+ ghobject_t hoid(hobject_t(sobject_t("Object " + stringify(n), CEPH_NOSNAP)));
+ t.write(cid, hoid, 1, bl.length(), bl);
+ r = store->apply_transaction(t);
+ ASSERT_EQ(r, 0);
+ }
+ }
+ store->umount();
+ r = store->mount();
+ ASSERT_EQ(0, r);
+ {
+ ObjectStore::Transaction t;
+ for (int n=1; n<=100; ++n) {
+ ghobject_t hoid(hobject_t(sobject_t("Object " + stringify(n), CEPH_NOSNAP)));
+ t.remove(cid, hoid);
+ }
+ t.remove_collection(cid);
+ r = store->apply_transaction(t);
+ ASSERT_EQ(r, 0);
+ }
+}
+
TEST_P(StoreTest, SimpleMetaColTest) {
coll_t cid;
int r = 0;
TEST_P(StoreTest, SimpleObjectTest) {
int r;
coll_t cid;
+ ghobject_t hoid(hobject_t(sobject_t("Object 1", CEPH_NOSNAP)));
+ {
+ bufferlist in;
+ r = store->read(cid, hoid, 0, 5, in);
+ ASSERT_EQ(-ENOENT, r);
+ }
{
ObjectStore::Transaction t;
t.create_collection(cid, 0);
r = store->apply_transaction(t);
ASSERT_EQ(r, 0);
}
- ghobject_t hoid(hobject_t(sobject_t("Object 1", CEPH_NOSNAP)));
{
+ bool exists = store->exists(cid, hoid);
+ ASSERT_TRUE(!exists);
+
ObjectStore::Transaction t;
t.touch(cid, hoid);
cerr << "Creating object " << hoid << std::endl;
r = store->apply_transaction(t);
ASSERT_EQ(r, 0);
+
+ exists = store->exists(cid, hoid);
+ ASSERT_EQ(true, exists);
}
{
ObjectStore::Transaction t;
}
{
ObjectStore::Transaction t;
- bufferlist bl;
+ bufferlist bl, orig;
bl.append("abcde");
+ orig = bl;
t.remove(cid, hoid);
- t.write(cid, hoid, 10, 5, bl);
+ t.write(cid, hoid, 0, 5, bl);
cerr << "Remove then create" << std::endl;
r = store->apply_transaction(t);
ASSERT_EQ(r, 0);
+
+ bufferlist in;
+ r = store->read(cid, hoid, 0, 5, in);
+ ASSERT_EQ(5, r);
+ ASSERT_TRUE(in.contents_equal(orig));
+ }
+ {
+ ObjectStore::Transaction t;
+ bufferlist bl, exp;
+ bl.append("abcde");
+ exp = bl;
+ exp.append(bl);
+ t.write(cid, hoid, 5, 5, bl);
+ cerr << "Append" << std::endl;
+ r = store->apply_transaction(t);
+ ASSERT_EQ(r, 0);
+
+ bufferlist in;
+ r = store->read(cid, hoid, 0, 10, in);
+ ASSERT_EQ(10, r);
+ ASSERT_TRUE(in.contents_equal(exp));
+ }
+ {
+ ObjectStore::Transaction t;
+ bufferlist bl, exp;
+ bl.append("abcdeabcde");
+ exp = bl;
+ t.write(cid, hoid, 0, 10, bl);
+ cerr << "Full overwrite" << std::endl;
+ r = store->apply_transaction(t);
+ ASSERT_EQ(r, 0);
+
+ bufferlist in;
+ r = store->read(cid, hoid, 0, 10, in);
+ ASSERT_EQ(10, r);
+ ASSERT_TRUE(in.contents_equal(exp));
+ }
+ {
+ ObjectStore::Transaction t;
+ bufferlist bl;
+ bl.append("abcde");
+ t.write(cid, hoid, 3, 5, bl);
+ cerr << "Partial overwrite" << std::endl;
+ r = store->apply_transaction(t);
+ ASSERT_EQ(r, 0);
+
+ bufferlist in, exp;
+ exp.append("abcabcdede");
+ r = store->read(cid, hoid, 0, 10, in);
+ ASSERT_EQ(10, r);
+ in.hexdump(cout);
+ ASSERT_TRUE(in.contents_equal(exp));
}
{
ObjectStore::Transaction t;
}
}
+TEST_P(StoreTest, SimpleAttrTest) {
+ int r;
+ coll_t cid;
+ ghobject_t hoid(hobject_t(sobject_t("attr object 1", CEPH_NOSNAP)));
+ bufferlist val, val2;
+ val.append("value");
+ val.append("value2");
+ {
+ bufferptr bp;
+ map<string,bufferptr> aset;
+ r = store->getattr(cid, hoid, "nofoo", bp);
+ ASSERT_EQ(-ENOENT, r);
+ r = store->getattrs(cid, hoid, aset);
+ ASSERT_EQ(-ENOENT, r);
+ }
+ {
+ ObjectStore::Transaction t;
+ t.create_collection(cid, 0);
+ r = store->apply_transaction(t);
+ ASSERT_EQ(r, 0);
+ }
+ {
+ bool r = store->collection_empty(cid);
+ ASSERT_TRUE(r);
+ }
+ {
+ bufferptr bp;
+ r = store->getattr(cid, hoid, "nofoo", bp);
+ ASSERT_EQ(-ENOENT, r);
+ }
+ {
+ ObjectStore::Transaction t;
+ t.touch(cid, hoid);
+ t.setattr(cid, hoid, "foo", val);
+ t.setattr(cid, hoid, "bar", val2);
+ r = store->apply_transaction(t);
+ ASSERT_EQ(r, 0);
+ }
+ {
+ bool r = store->collection_empty(cid);
+ ASSERT_TRUE(!r);
+ }
+ {
+ bufferptr bp;
+ r = store->getattr(cid, hoid, "nofoo", bp);
+ ASSERT_EQ(-ENODATA, r);
+
+ r = store->getattr(cid, hoid, "foo", bp);
+ ASSERT_EQ(0, r);
+ bufferlist bl;
+ bl.append(bp);
+ ASSERT_TRUE(bl.contents_equal(val));
+
+ map<string,bufferptr> bm;
+ r = store->getattrs(cid, hoid, bm);
+ ASSERT_EQ(0, r);
+
+ }
+ {
+ ObjectStore::Transaction t;
+ t.remove(cid, hoid);
+ t.remove_collection(cid);
+ r = store->apply_transaction(t);
+ ASSERT_EQ(r, 0);
+ }
+}
+
TEST_P(StoreTest, SimpleListTest) {
int r;
coll_t cid(spg_t(pg_t(0, 1), shard_id_t(1)));
name += stringify(i);
ghobject_t hoid(hobject_t(sobject_t(name, CEPH_NOSNAP)));
if (rand() & 1)
- hoid.hobj.pool = -3;
+ hoid.hobj.pool = -2 - poolid;
else
- hoid.hobj.pool = 1;
+ hoid.hobj.pool = poolid;
all.insert(hoid);
t.touch(cid, hoid);
cerr << "Creating object " << hoid << std::endl;
class MixedGenerator : public ObjectGenerator {
public:
unsigned seq;
- MixedGenerator() : seq(0) {}
+ int64_t poolid;
+ MixedGenerator(int64_t p) : seq(0), poolid(p) {}
ghobject_t create_object(gen_type *gen) {
char buf[100];
snprintf(buf, sizeof(buf), "%u", seq);
// hash
//boost::binomial_distribution<uint32_t> bin(0xFFFFFF, 0.5);
++seq;
- return ghobject_t(hobject_t(name, string(), rand() & 2 ? CEPH_NOSNAP : rand(), rand() & 0xFF, 0, ""));
+ return ghobject_t(hobject_t(name, string(), rand() & 2 ? CEPH_NOSNAP : rand(), rand() & 0xFF, poolid, ""));
}
};
}
void wait_for_done() {
+ osr->flush();
Mutex::Locker locker(lock);
while (in_flight)
cond.Wait(lock);
size_t max_len = contents[obj].data.length() - offset;
if (len > max_len)
len = max_len;
+ assert(len == result.length());
ASSERT_EQ(len, result.length());
contents[obj].data.copy(offset, len, bl);
ASSERT_EQ(r, (int)len);
+ if (!result.contents_equal(bl)) {
+ cout << "result:\n";
+ result.hexdump(cout);
+ cout << "expected:\n";
+ bl.hexdump(cout);
+ assert(0);
+ }
ASSERT_TRUE(result.contents_equal(bl));
}
}
if (next.is_max()) break;
current = next;
}
+ if (objects_set.size() != available_objects.size()) {
+ for (set<ghobject_t>::iterator p = objects_set.begin();
+ p != objects_set.end();
+ ++p)
+ if (available_objects.count(*p) == 0) {
+ cerr << "+ " << *p << std::endl;
+ assert(0);
+ }
+ for (set<ghobject_t>::iterator p = available_objects.begin();
+ p != available_objects.end();
+ ++p)
+ if (objects_set.count(*p) == 0)
+ cerr << "- " << *p << std::endl;
+ //cerr << " objects_set: " << objects_set << std::endl;
+ //cerr << " available_set: " << available_objects << std::endl;
+ assert(0 == "badness");
+ }
+
ASSERT_EQ(objects_set.size(), available_objects.size());
for (set<ghobject_t, ghobject_t::BitwiseComparator>::iterator i = objects_set.begin();
i != objects_set.end();
i != objects_set2.end();
++i) {
ASSERT_GT(available_objects.count(*i), (unsigned)0);
+ if (available_objects.count(*i) == 0) {
+ cerr << "+ " << *i << std::endl;
+ }
}
}
struct stat buf;
int r = store->stat(cid, hoid, &buf);
ASSERT_EQ(0, r);
+ assert(buf.st_size == contents[hoid].data.length());
ASSERT_TRUE(buf.st_size == contents[hoid].data.length());
{
Mutex::Locker locker(lock);
TEST_P(StoreTest, Synthetic) {
ObjectStore::Sequencer osr("test");
- MixedGenerator gen;
+ MixedGenerator gen(555);
gen_type rng(time(NULL));
- coll_t cid(spg_t(pg_t(1,0), shard_id_t::NO_SHARD));
+ coll_t cid(spg_t(pg_t(0,555), shard_id_t::NO_SHARD));
SyntheticWorkloadState test_obj(store.get(), &gen, &rng, &osr, cid);
test_obj.init();
TEST_P(StoreTest, AttrSynthetic) {
ObjectStore::Sequencer osr("test");
- MixedGenerator gen;
+ MixedGenerator gen(447);
gen_type rng(time(NULL));
- coll_t cid(spg_t(pg_t(4,0),shard_id_t::NO_SHARD));
+ coll_t cid(spg_t(pg_t(0,447),shard_id_t::NO_SHARD));
SyntheticWorkloadState test_obj(store.get(), &gen, &rng, &osr, cid);
test_obj.init();
}
TEST_P(StoreTest, HashCollisionTest) {
- coll_t cid(spg_t(pg_t(11,0),shard_id_t::NO_SHARD));
+ int64_t poolid = 11;
+ coll_t cid(spg_t(pg_t(0,poolid),shard_id_t::NO_SHARD));
int r;
{
ObjectStore::Transaction t;
if (!(i % 5)) {
cerr << "Object n" << n << " "<< i << std::endl;
}
- ghobject_t hoid(hobject_t(string(buf) + base, string(), CEPH_NOSNAP, 0, 0, string(nbuf)));
+ ghobject_t hoid(hobject_t(string(buf) + base, string(), CEPH_NOSNAP, 0, poolid, string(nbuf)));
{
ObjectStore::Transaction t;
t.touch(cid, hoid);
}
TEST_P(StoreTest, ScrubTest) {
- coll_t cid(spg_t(pg_t(111,0),shard_id_t(1)));
+ int64_t poolid = 111;
+ coll_t cid(spg_t(pg_t(0, poolid),shard_id_t(1)));
int r;
{
ObjectStore::Transaction t;
if (!(i % 5)) {
cerr << "Object " << i << std::endl;
}
- ghobject_t hoid(hobject_t(string(buf) + base, string(), CEPH_NOSNAP, i, 0, ""),
+ ghobject_t hoid(hobject_t(string(buf) + base, string(), CEPH_NOSNAP, i,
+ poolid, ""),
ghobject_t::NO_GEN, shard_id_t(1));
{
ObjectStore::Transaction t;
// Add same hobject_t but different generation
{
- ghobject_t hoid1(hobject_t("same-object", string(), CEPH_NOSNAP, 0, 0, ""),
+ ghobject_t hoid1(hobject_t("same-object", string(), CEPH_NOSNAP, 0, poolid, ""),
ghobject_t::NO_GEN, shard_id_t(1));
- ghobject_t hoid2(hobject_t("same-object", string(), CEPH_NOSNAP, 0, 0, ""), (gen_t)1, shard_id_t(1));
- ghobject_t hoid3(hobject_t("same-object", string(), CEPH_NOSNAP, 0, 0, ""), (gen_t)2, shard_id_t(1));
+ ghobject_t hoid2(hobject_t("same-object", string(), CEPH_NOSNAP, 0, poolid, ""), (gen_t)1, shard_id_t(1));
+ ghobject_t hoid3(hobject_t("same-object", string(), CEPH_NOSNAP, 0, poolid, ""), (gen_t)2, shard_id_t(1));
ObjectStore::Transaction t;
t.touch(cid, hoid1);
t.touch(cid, hoid2);
ASSERT_EQ(keys.size(), size_t(1));
}
+ // test omap_clear, omap_rmkey_range
+ {
+ {
+ map<string,bufferlist> to_set;
+ for (int n=0; n<10; ++n) {
+ to_set[stringify(n)].append("foo");
+ }
+ bufferlist h;
+ h.append("header");
+ ObjectStore::Transaction t;
+ t.remove(cid, hoid);
+ t.touch(cid, hoid);
+ t.omap_setheader(cid, hoid, h);
+ t.omap_setkeys(cid, hoid, to_set);
+ store->apply_transaction(t);
+ }
+ {
+ ObjectStore::Transaction t;
+ t.omap_rmkeyrange(cid, hoid, "3", "7");
+ store->apply_transaction(t);
+ }
+ {
+ bufferlist hdr;
+ map<string,bufferlist> m;
+ store->omap_get(cid, hoid, &hdr, &m);
+ ASSERT_EQ(6, hdr.length());
+ ASSERT_TRUE(m.count("2"));
+ ASSERT_TRUE(!m.count("3"));
+ ASSERT_TRUE(!m.count("6"));
+ ASSERT_TRUE(m.count("7"));
+ ASSERT_TRUE(m.count("8"));
+ //cout << m << std::endl;
+ ASSERT_EQ(6, m.size());
+ }
+ {
+ ObjectStore::Transaction t;
+ t.omap_clear(cid, hoid);
+ store->apply_transaction(t);
+ }
+ {
+ bufferlist hdr;
+ map<string,bufferlist> m;
+ store->omap_get(cid, hoid, &hdr, &m);
+ ASSERT_EQ(0, hdr.length());
+ ASSERT_EQ(0, m.size());
+ }
+ }
+
ObjectStore::Transaction t;
t.remove(cid, hoid);
t.remove_collection(cid);
"",
CEPH_NOSNAP,
i<<common_suffix_size,
- 0, "")));
+ 52, "")));
}
r = store->apply_transaction(t);
ASSERT_EQ(r, 0);
for (vector<ghobject_t>::iterator i = objects.begin();
i != objects.end();
++i) {
- ASSERT_EQ(!(i->hobj.get_hash() & (1<<common_suffix_size)), 0u);
+ ASSERT_EQ(!!(i->hobj.get_hash() & (1<<common_suffix_size)), 0u);
t.remove(cid, *i);
}
for (vector<ghobject_t>::iterator i = objects.begin();
i != objects.end();
++i) {
- ASSERT_EQ(i->hobj.get_hash() & (1<<common_suffix_size), 0u);
+ ASSERT_EQ(!(i->hobj.get_hash() & (1<<common_suffix_size)), 0u);
t.remove(tid, *i);
}
}
TEST_P(StoreTest, MoveRename) {
- coll_t cid(spg_t(pg_t(212,0),shard_id_t::NO_SHARD));
+ coll_t cid(spg_t(pg_t(0, 212),shard_id_t::NO_SHARD));
ghobject_t temp_oid(hobject_t("tmp_oid", "", CEPH_NOSNAP, 0, 0, ""));
ghobject_t oid(hobject_t("dest_oid", "", CEPH_NOSNAP, 0, 0, ""));
int r;
TEST_P(StoreTest, BigRGWObjectName) {
store->set_allow_sharded_objects();
- coll_t cid(spg_t(pg_t(1,2),shard_id_t::NO_SHARD));
- hobject_t temp_oid("tmp_oid", "", CEPH_NOSNAP, 0, 0, "");
+ coll_t cid(spg_t(pg_t(0,12),shard_id_t::NO_SHARD));
ghobject_t oid(
hobject_t(
"default.4106.50_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"",
CEPH_NOSNAP,
0x81920472,
- 3,
+ 12,
""),
15,
- shard_id_t(1));
+ shard_id_t::NO_SHARD);
ghobject_t oid2(oid);
oid2.generation = 17;
ghobject_t oidhead(oid);
INSTANTIATE_TEST_CASE_P(
ObjectStore,
StoreTest,
- ::testing::Values("memstore", "filestore", "keyvaluestore"));
+ ::testing::Values("memstore", "filestore", "keyvaluestore", "newstore"));
#else
int main(int argc, char **argv) {
vector<const char*> args;
argv_to_vec(argc, (const char **)argv, args);
+ env_to_vec(args);
global_init(NULL, args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, 0);
common_init_finish(g_ceph_context);
g_ceph_context->_conf->set_val("filestore_fiemap", "true");
g_ceph_context->_conf->set_val(
"enable_experimental_unrecoverable_data_corrupting_features",
- "keyvaluestore");
+ "keyvaluestore, newstore, rocksdb");
g_ceph_context->_conf->apply_changes(NULL);
::testing::InitGoogleTest(&argc, argv);