o.push_back(t);
t = new Transaction;
- coll_t c("foocoll");
- coll_t c2("foocoll2");
+ coll_t c(spg_t(pg_t(1,2), shard_id_t::NO_SHARD));
+ coll_t c2(spg_t(pg_t(4,5), shard_id_t::NO_SHARD));
ghobject_t o1(hobject_t("obj", "", 123, 456, -1, ""));
ghobject_t o2(hobject_t("obj2", "", 123, 456, -1, ""));
ghobject_t o3(hobject_t("obj3", "", 123, 456, -1, ""));
int pg_id = pg_range(gen);
if (pg_created.count(pg_id) > 0)
continue;
- char buf[100];
- snprintf(buf, 100, "%d.%x_head", pool_id, pg_id);
- _do_coll_create(coll_t(buf), (uint32_t) pg_num, (uint64_t) num_objs);
+ _do_coll_create(coll_t(spg_t(pg_t(pg_id,pool_id),shard_id_t::NO_SHARD)),
+ (uint32_t) pg_num, (uint64_t) num_objs);
pg_created.insert(pg_id);
}
return true;
class OnApplied : public Context {
FileStoreTracker *tracker;
- list<pair<pair<string, string>, uint64_t> > in_flight;
+ list<pair<pair<coll_t, string>, uint64_t> > in_flight;
ObjectStore::Transaction *t;
public:
OnApplied(FileStoreTracker *tracker,
- list<pair<pair<string, string>, uint64_t> > in_flight,
+ list<pair<pair<coll_t, string>, uint64_t> > in_flight,
ObjectStore::Transaction *t)
: tracker(tracker), in_flight(in_flight), t(t) {}
void finish(int r) {
- for (list<pair<pair<string, string>, uint64_t> >::iterator i =
+ for (list<pair<pair<coll_t, string>, uint64_t> >::iterator i =
in_flight.begin();
i != in_flight.end();
++i) {
class OnCommitted : public Context {
FileStoreTracker *tracker;
- list<pair<pair<string, string>, uint64_t> > in_flight;
+ list<pair<pair<coll_t, string>, uint64_t> > in_flight;
public:
OnCommitted(FileStoreTracker *tracker,
- list<pair<pair<string, string>, uint64_t> > in_flight)
+ list<pair<pair<coll_t, string>, uint64_t> > in_flight)
: tracker(tracker), in_flight(in_flight) {}
void finish(int r) {
- for (list<pair<pair<string, string>, uint64_t> >::iterator i =
+ for (list<pair<pair<coll_t, string>, uint64_t> >::iterator i =
in_flight.begin();
i != in_flight.end();
++i) {
void FileStoreTracker::submit_transaction(Transaction &t)
{
- list<pair<pair<string, string>, uint64_t> > in_flight;
+ list<pair<pair<coll_t, string>, uint64_t> > in_flight;
OutTransaction out;
out.t = new ObjectStore::Transaction;
out.in_flight = &in_flight;
new OnCommitted(this, in_flight));
}
-void FileStoreTracker::write(const pair<string, string> &obj,
+void FileStoreTracker::write(const pair<coll_t, string> &obj,
OutTransaction *out)
{
Mutex::Locker l(lock);
out->in_flight->push_back(make_pair(obj, set_content(obj, contents)));
}
-void FileStoreTracker::remove(const pair<string, string> &obj,
+void FileStoreTracker::remove(const pair<coll_t, string> &obj,
OutTransaction *out)
{
std::cerr << "Deleting " << obj << std::endl;
out->in_flight->push_back(make_pair(obj, set_content(obj, contents)));
}
-void FileStoreTracker::clone_range(const pair<string, string> &from,
- const pair<string, string> &to,
+void FileStoreTracker::clone_range(const pair<coll_t, string> &from,
+ const pair<coll_t, string> &to,
OutTransaction *out) {
Mutex::Locker l(lock);
std::cerr << "CloningRange " << from << " to " << to << std::endl;
out->in_flight->push_back(make_pair(to, set_content(to, to_contents)));
}
-void FileStoreTracker::clone(const pair<string, string> &from,
- const pair<string, string> &to,
+void FileStoreTracker::clone(const pair<coll_t, string> &from,
+ const pair<coll_t, string> &to,
OutTransaction *out) {
Mutex::Locker l(lock);
std::cerr << "Cloning " << from << " to " << to << std::endl;
}
-string obj_to_prefix(const pair<string, string> &obj) {
+string obj_to_prefix(const pair<coll_t, string> &obj) {
string sep;
sep.push_back('^');
- return obj.first + sep + obj.second + "_CONTENTS_";
+ return obj.first.to_str() + sep + obj.second + "_CONTENTS_";
}
-string obj_to_meta_prefix(const pair<string, string> &obj) {
+string obj_to_meta_prefix(const pair<coll_t, string> &obj) {
string sep;
sep.push_back('^');
- return obj.first + sep + obj.second;
+ return obj.first.to_str() + sep + obj.second;
}
string seq_to_key(uint64_t seq) {
}
-ObjStatus get_obj_status(const pair<string, string> &obj,
+ObjStatus get_obj_status(const pair<coll_t, string> &obj,
KeyValueDB *db)
{
set<string> to_get;
return retval;
}
-void set_obj_status(const pair<string, string> &obj,
+void set_obj_status(const pair<coll_t, string> &obj,
const ObjStatus &status,
KeyValueDB::Transaction t)
{
t->set(obj_to_meta_prefix(obj), to_set);
}
-void _clean_forward(const pair<string, string> &obj,
+void _clean_forward(const pair<coll_t, string> &obj,
uint64_t last_valid,
KeyValueDB *db)
{
}
-void FileStoreTracker::verify(const string &coll, const string &obj,
+void FileStoreTracker::verify(const coll_t &coll, const string &obj,
bool on_start) {
Mutex::Locker l(lock);
std::cerr << "Verifying " << make_pair(coll, obj) << std::endl;
}
ObjectContents FileStoreTracker::get_current_content(
- const pair<string, string> &obj)
+ const pair<coll_t, string> &obj)
{
KeyValueDB::Iterator iter = db->get_iterator(
obj_to_prefix(obj));
}
ObjectContents FileStoreTracker::get_content(
- const pair<string, string> &obj, uint64_t version)
+ const pair<coll_t, string> &obj, uint64_t version)
{
set<string> to_get;
map<string, bufferlist> got;
}
pair<uint64_t, uint64_t> FileStoreTracker::get_valid_reads(
- const pair<string, string> &obj)
+ const pair<coll_t, string> &obj)
{
pair<uint64_t, uint64_t> bounds = make_pair(0,1);
KeyValueDB::Iterator iter = db->get_iterator(
return bounds;
}
-void clear_obsolete(const pair<string, string> &obj,
+void clear_obsolete(const pair<coll_t, string> &obj,
const ObjStatus &status,
KeyValueDB *db,
KeyValueDB::Transaction t)
t->rmkeys(obj_to_prefix(obj), to_remove);
}
-void FileStoreTracker::committed(const pair<string, string> &obj,
+void FileStoreTracker::committed(const pair<coll_t, string> &obj,
uint64_t seq) {
Mutex::Locker l(lock);
ObjStatus status = get_obj_status(obj, db);
db->submit_transaction(t);
}
-void FileStoreTracker::applied(const pair<string, string> &obj,
+void FileStoreTracker::applied(const pair<coll_t, string> &obj,
uint64_t seq) {
Mutex::Locker l(lock);
std::cerr << "Applied " << obj << " version " << seq << std::endl;
}
-uint64_t FileStoreTracker::set_content(const pair<string, string> &obj,
+uint64_t FileStoreTracker::set_content(const pair<coll_t, string> &obj,
ObjectContents &content) {
KeyValueDB::Transaction t = db->get_transaction();
KeyValueDB::Iterator iter = db->get_iterator(
uint64_t restart_seq;
struct OutTransaction {
- list<pair<pair<string, string>, uint64_t> > *in_flight;
+ list<pair<pair<coll_t, string>, uint64_t> > *in_flight;
ObjectStore::Transaction *t;
};
public:
list<Op*> ops;
class Write : public Op {
public:
- string coll;
+ coll_t coll;
string oid;
- Write(const string &coll,
+ Write(const coll_t &coll,
const string &oid)
: coll(coll), oid(oid) {}
void operator()(FileStoreTracker *harness,
};
class CloneRange : public Op {
public:
- string coll;
+ coll_t coll;
string from;
string to;
- CloneRange(const string &coll,
+ CloneRange(const coll_t &coll,
const string &from,
const string &to)
: coll(coll), from(from), to(to) {}
};
class Clone : public Op {
public:
- string coll;
+ coll_t coll;
string from;
string to;
- Clone(const string &coll,
+ Clone(const coll_t &coll,
const string &from,
const string &to)
: coll(coll), from(from), to(to) {}
};
class Remove: public Op {
public:
- string coll;
+ coll_t coll;
string obj;
- Remove(const string &coll,
+ Remove(const coll_t &coll,
const string &obj)
: coll(coll), obj(obj) {}
void operator()(FileStoreTracker *harness,
}
};
public:
- void write(const string &coll, const string &oid) {
+ void write(const coll_t &coll, const string &oid) {
ops.push_back(new Write(coll, oid));
}
- void clone_range(const string &coll, const string &from,
+ void clone_range(const coll_t &coll, const string &from,
const string &to) {
ops.push_back(new CloneRange(coll, from, to));
}
- void clone(const string &coll, const string &from,
+ void clone(const coll_t &coll, const string &from,
const string &to) {
ops.push_back(new Clone(coll, from, to));
}
- void remove(const string &coll, const string &oid) {
+ void remove(const coll_t &coll, const string &oid) {
ops.push_back(new Remove(coll, oid));
}
friend class FileStoreTracker;
int init();
void submit_transaction(Transaction &t);
- void verify(const string &coll,
+ void verify(const coll_t &coll,
const string &from,
bool on_start = false);
private:
- ObjectContents get_current_content(const pair<string, string> &obj);
- pair<uint64_t, uint64_t> get_valid_reads(const pair<string, string> &obj);
- ObjectContents get_content(const pair<string, string> &obj, uint64_t version);
+ ObjectContents get_current_content(const pair<coll_t, string> &obj);
+ pair<uint64_t, uint64_t> get_valid_reads(const pair<coll_t, string> &obj);
+ ObjectContents get_content(const pair<coll_t, string> &obj, uint64_t version);
- void committed(const pair<string, string> &obj, uint64_t seq);
- void applied(const pair<string, string> &obj, uint64_t seq);
- uint64_t set_content(const pair<string, string> &obj, ObjectContents &content);
+ void committed(const pair<coll_t, string> &obj, uint64_t seq);
+ void applied(const pair<coll_t, string> &obj, uint64_t seq);
+ uint64_t set_content(const pair<coll_t, string> &obj, ObjectContents &content);
// ObjectContents Operations
- void write(const pair<string, string> &obj, OutTransaction *out);
- void remove(const pair<string, string> &obj, OutTransaction *out);
- void clone_range(const pair<string, string> &from,
- const pair<string, string> &to,
+ void write(const pair<coll_t, string> &obj, OutTransaction *out);
+ void remove(const pair<coll_t, string> &obj, OutTransaction *out);
+ void clone_range(const pair<coll_t, string> &from,
+ const pair<coll_t, string> &to,
OutTransaction *out);
- void clone(const pair<string, string> &from,
- const pair<string, string> &to,
+ void clone(const pair<coll_t, string> &from,
+ const pair<coll_t, string> &to,
OutTransaction *out);
friend class OnApplied;
friend class OnCommitted;
boost::uniform_int<> folders_range(5, 256);
uint64_t expected_num_objs = (uint64_t)objs_per_folder * (uint64_t)folders_range(rng);
- char buf[100];
- snprintf(buf, 100, "1.%x_head", pg_id);
-
- coll_t cid(buf);
+ coll_t cid(spg_t(pg_t(pg_id, 1), shard_id_t::NO_SHARD));
int r;
{
// Create a collection along with a hint
TEST_P(StoreTest, MultipoolListTest) {
int r;
- coll_t cid = coll_t("coll");
+ coll_t cid = coll_t(spg_t(pg_t(1, 1), shard_id_t::NO_SHARD));
{
ObjectStore::Transaction t;
t.create_collection(cid);
ObjectStore::Sequencer osr("test");
MixedGenerator gen;
gen_type rng(time(NULL));
- coll_t cid("synthetic_1");
+ coll_t cid(spg_t(pg_t(1,0), shard_id_t::NO_SHARD));
SyntheticWorkloadState test_obj(store.get(), &gen, &rng, &osr, cid);
test_obj.init();
ObjectStore::Sequencer osr("test");
MixedGenerator gen;
gen_type rng(time(NULL));
- coll_t cid("synthetic_2");
+ coll_t cid(spg_t(pg_t(4,0),shard_id_t::NO_SHARD));
SyntheticWorkloadState test_obj(store.get(), &gen, &rng, &osr, cid);
test_obj.init();
unsigned num_objects,
unsigned common_suffix_size
) {
- coll_t cid("from");
- coll_t tid("to");
+ coll_t cid(spg_t(pg_t(1,2),shard_id_t::NO_SHARD));
+ coll_t tid(spg_t(pg_t(3,2),shard_id_t::NO_SHARD));
int r = 0;
{
ObjectStore::Transaction t;
}
TEST_P(StoreTest, MoveRename) {
- coll_t temp_cid("mytemp");
+ coll_t cid(spg_t(pg_t(212,0),shard_id_t::NO_SHARD));
hobject_t temp_oid("tmp_oid", "", CEPH_NOSNAP, 0, 0, "");
- coll_t cid("dest");
hobject_t oid("dest_oid", "", CEPH_NOSNAP, 0, 0, "");
int r;
{
TEST_P(StoreTest, BigRGWObjectName) {
store->set_allow_sharded_objects();
store->sync_and_flush();
- coll_t temp_cid("mytemp");
+ coll_t cid(spg_t(pg_t(1,2),shard_id_t::NO_SHARD));
+ coll_t temp_cid = cid.get_temp();
hobject_t temp_oid("tmp_oid", "", CEPH_NOSNAP, 0, 0, "");
- coll_t cid("dest");
ghobject_t oid(
hobject_t(
"default.4106.50_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
boost::scoped_ptr<KeyValueDB> db(_db);
boost::scoped_ptr<ObjectStore> store(new FileStore(store_path, store_dev));
+ coll_t coll(spg_t(pg_t(1,2),shard_id_t::NO_SHARD));
if (start_new) {
std::cerr << "mkfs" << std::endl;
assert(!store->mkfs());
ObjectStore::Transaction t;
assert(!store->mount());
- t.create_collection(coll_t("coll"));
+ t.create_collection(coll);
store->apply_transaction(t);
} else {
assert(!store->mount());
for (unsigned i = 0; i < 10; ++i) {
stringstream stream;
stream << "Object_" << i;
- tracker.verify("coll", stream.str(), true);
+ tracker.verify(coll, stream.str(), true);
objects.insert(stream.str());
}
for (unsigned j = 0; j < 100; ++j) {
int val = rand() % 100;
if (val < 30) {
- t.write("coll", *rand_choose(objects));
+ t.write(coll, *rand_choose(objects));
} else if (val < 60) {
- t.clone("coll", *rand_choose(objects),
+ t.clone(coll, *rand_choose(objects),
*rand_choose(objects));
} else if (val < 70) {
- t.remove("coll", *rand_choose(objects));
+ t.remove(coll, *rand_choose(objects));
} else {
- t.clone_range("coll", *rand_choose(objects),
+ t.clone_range(coll, *rand_choose(objects),
*rand_choose(objects));
}
}
tracker.submit_transaction(t);
- tracker.verify("coll", *rand_choose(objects));
+ tracker.verify(coll, *rand_choose(objects));
}
return 0;
}
Cond cond;
int in_flight = 0;
ObjectStore::Transaction t;
- map<string, pair<set<string>, ObjectStore::Sequencer*> > collections;
+ map<coll_t, pair<set<string>, ObjectStore::Sequencer*> > collections;
for (int i = 0; i < 3*THREADS; ++i) {
- stringstream coll_str;
- coll_str << "coll_" << i << "_" << run;
- t.create_collection(coll_t(coll_str.str()));
+ coll_t coll(spg_t(pg_t(i, run), shard_id_t::NO_SHARD));
+ t.create_collection(coll);
set<string> objects;
for (int i = 0; i < transsize; ++i) {
stringstream obj_str;
obj_str << i;
- t.touch(coll_t(coll_str.str()),
+ t.touch(coll,
hobject_t(sobject_t(obj_str.str(), CEPH_NOSNAP)));
objects.insert(obj_str.str());
}
- collections[coll_str.str()] = make_pair(objects, new ObjectStore::Sequencer(coll_str.str()));
+ collections[coll] = make_pair(objects, new ObjectStore::Sequencer(coll.to_str()));
}
store->apply_transaction(t);
cond.Wait(lock);
}
ObjectStore::Transaction *t = new ObjectStore::Transaction;
- map<string, pair<set<string>, ObjectStore::Sequencer*> >::iterator iter =
+ map<coll_t, pair<set<string>, ObjectStore::Sequencer*> >::iterator iter =
rand_choose(collections);
for (set<string>::iterator obj = iter->second.first.begin();
obj != iter->second.first.end();
for (int j = 0; j < numattrs; ++j) {
stringstream ss;
ss << i << ", " << j << ", " << *obj;
- t->setattr(coll_t(iter->first),
+ t->setattr(iter->first,
hobject_t(sobject_t(*obj, CEPH_NOSNAP)),
ss.str().c_str(),
bl);