#include <iostream>
#include <boost/scoped_ptr.hpp>
#include "include/Context.h"
-#include "common/Mutex.h"
class OnApplied : public Context {
FileStoreTracker *tracker;
void FileStoreTracker::write(const pair<coll_t, string> &obj,
OutTransaction *out)
{
- Mutex::Locker l(lock);
+ std::lock_guard l{lock};
std::cerr << "Writing " << obj << std::endl;
ObjectContents contents = get_current_content(obj);
OutTransaction *out)
{
std::cerr << "Deleting " << obj << std::endl;
- Mutex::Locker l(lock);
+ std::lock_guard l{lock};
ObjectContents old_contents = get_current_content(obj);
if (!old_contents.exists())
return;
void FileStoreTracker::clone_range(const pair<coll_t, string> &from,
const pair<coll_t, string> &to,
OutTransaction *out) {
- Mutex::Locker l(lock);
+ std::lock_guard l{lock};
std::cerr << "CloningRange " << from << " to " << to << std::endl;
ceph_assert(from.first == to.first);
ObjectContents from_contents = get_current_content(from);
void FileStoreTracker::clone(const pair<coll_t, string> &from,
const pair<coll_t, string> &to,
OutTransaction *out) {
- Mutex::Locker l(lock);
+ std::lock_guard l{lock};
std::cerr << "Cloning " << from << " to " << to << std::endl;
ceph_assert(from.first == to.first);
if (from.second == to.second) {
void FileStoreTracker::verify(const coll_t &coll, const string &obj,
bool on_start) {
- Mutex::Locker l(lock);
+ std::lock_guard l{lock};
std::cerr << "Verifying " << make_pair(coll, obj) << std::endl;
pair<uint64_t, uint64_t> valid_reads = get_valid_reads(make_pair(coll, obj));
void FileStoreTracker::committed(const pair<coll_t, string> &obj,
uint64_t seq) {
- Mutex::Locker l(lock);
+ std::lock_guard l{lock};
ObjStatus status = get_obj_status(obj, db);
ceph_assert(status.last_committed < seq);
status.last_committed = seq;
void FileStoreTracker::applied(const pair<coll_t, string> &obj,
uint64_t seq) {
- Mutex::Locker l(lock);
+ std::lock_guard l{lock};
std::cerr << "Applied " << obj << " version " << seq << std::endl;
ObjStatus status = get_obj_status(obj, db);
ceph_assert(status.last_applied < seq);
#include "include/Context.h"
#include "common/ceph_argparse.h"
#include "global/global_init.h"
-#include "common/Mutex.h"
+#include "common/ceph_mutex.h"
#include "common/Cond.h"
#include "common/errno.h"
#include "include/stringify.h"
ObjectStore *store;
ObjectStore::CollectionHandle ch;
- Mutex lock;
- Cond cond;
+ ceph::mutex lock = ceph::make_mutex("State lock");
+ ceph::condition_variable cond;
struct EnterExit {
const char *msg;
: state(state), hoid(hoid) {}
void finish(int r) override {
- Mutex::Locker locker(state->lock);
+ std::lock_guard locker{state->lock};
EnterExit ee("onreadable finish");
ASSERT_TRUE(state->in_flight_objects.count(hoid));
ASSERT_EQ(r, 0);
if (state->contents.count(hoid))
state->available_objects.insert(hoid);
--(state->in_flight);
- state->cond.Signal();
+ state->cond.notify_all();
bufferlist r2;
r = state->store->read(state->ch, hoid, 0, state->contents[hoid].data.length(), r2);
ceph_assert(bl_eq(state->contents[hoid].data, r2));
- state->cond.Signal();
+ state->cond.notify_all();
}
};
: state(state), oid(oid), noid(noid) {}
void finish(int r) override {
- Mutex::Locker locker(state->lock);
+ std::lock_guard locker{state->lock};
EnterExit ee("stash finish");
ASSERT_TRUE(state->in_flight_objects.count(oid));
ASSERT_EQ(r, 0);
state->ch, noid, 0,
state->contents[noid].data.length(), r2);
ceph_assert(bl_eq(state->contents[noid].data, r2));
- state->cond.Signal();
+ state->cond.notify_all();
}
};
: state(state), oid(oid), noid(noid) {}
void finish(int r) override {
- Mutex::Locker locker(state->lock);
+ std::lock_guard locker{state->lock};
EnterExit ee("clone finish");
ASSERT_TRUE(state->in_flight_objects.count(oid));
ASSERT_EQ(r, 0);
bufferlist r2;
r = state->store->read(state->ch, noid, 0, state->contents[noid].data.length(), r2);
ceph_assert(bl_eq(state->contents[noid].data, r2));
- state->cond.Signal();
+ state->cond.notify_all();
}
};
unsigned alignment)
: cid(cid), write_alignment(alignment), max_object_len(max_size),
max_write_len(max_write), in_flight(0), object_gen(gen),
- rng(rng), store(store),
- lock("State lock") {}
+ rng(rng), store(store) {}
int init() {
ObjectStore::Transaction t;
store->statfs(&stat);
}
- ghobject_t get_uniform_random_object() {
- while (in_flight >= max_in_flight || available_objects.empty())
- cond.Wait(lock);
+ ghobject_t get_uniform_random_object(std::unique_lock<ceph::mutex>& locker) {
+ cond.wait(locker, [this] {
+ return in_flight < max_in_flight && !available_objects.empty();
+ });
boost::uniform_int<> choose(0, available_objects.size() - 1);
int index = choose(*rng);
set<ghobject_t>::iterator i = available_objects.begin();
return ret;
}
- void wait_for_ready() {
- while (in_flight >= max_in_flight)
- cond.Wait(lock);
+ void wait_for_ready(std::unique_lock<ceph::mutex>& locker) {
+ cond.wait(locker, [this] { return in_flight < max_in_flight; });
}
void wait_for_done() {
- Mutex::Locker locker(lock);
- while (in_flight)
- cond.Wait(lock);
+ std::unique_lock locker{lock};
+ cond.wait(locker, [this] { return in_flight == 0; });
}
bool can_create() {
}
int touch() {
- Mutex::Locker locker(lock);
+ std::unique_lock locker{lock};
EnterExit ee("touch");
if (!can_create())
return -ENOSPC;
- wait_for_ready();
+ wait_for_ready(locker);
ghobject_t new_obj = object_gen->create_object(rng);
available_objects.erase(new_obj);
ObjectStore::Transaction t;
}
int stash() {
- Mutex::Locker locker(lock);
+ std::unique_lock locker{lock};
EnterExit ee("stash");
if (!can_unlink())
return -ENOENT;
if (!can_create())
return -ENOSPC;
- wait_for_ready();
+ wait_for_ready(locker);
ghobject_t old_obj;
int max = 20;
do {
- old_obj = get_uniform_random_object();
+ old_obj = get_uniform_random_object(locker);
} while (--max && !contents[old_obj].data.length());
available_objects.erase(old_obj);
ghobject_t new_obj = old_obj;
}
int clone() {
- Mutex::Locker locker(lock);
+ std::unique_lock locker{lock};
EnterExit ee("clone");
if (!can_unlink())
return -ENOENT;
if (!can_create())
return -ENOSPC;
- wait_for_ready();
+ wait_for_ready(locker);
ghobject_t old_obj;
int max = 20;
do {
- old_obj = get_uniform_random_object();
+ old_obj = get_uniform_random_object(locker);
} while (--max && !contents[old_obj].data.length());
available_objects.erase(old_obj);
ghobject_t new_obj = object_gen->create_object(rng);
}
int clone_range() {
- Mutex::Locker locker(lock);
+ std::unique_lock locker{lock};
EnterExit ee("clone_range");
if (!can_unlink())
return -ENOENT;
if (!can_create())
return -ENOSPC;
- wait_for_ready();
+ wait_for_ready(locker);
ghobject_t old_obj;
int max = 20;
do {
- old_obj = get_uniform_random_object();
+ old_obj = get_uniform_random_object(locker);
} while (--max && !contents[old_obj].data.length());
bufferlist &srcdata = contents[old_obj].data;
if (srcdata.length() == 0) {
return 0;
}
available_objects.erase(old_obj);
- ghobject_t new_obj = get_uniform_random_object();
+ ghobject_t new_obj = get_uniform_random_object(locker);
available_objects.erase(new_obj);
boost::uniform_int<> u1(0, max_object_len - max_write_len);
int write() {
- Mutex::Locker locker(lock);
+ std::unique_lock locker{lock};
EnterExit ee("write");
if (!can_unlink())
return -ENOENT;
- wait_for_ready();
+ wait_for_ready(locker);
- ghobject_t new_obj = get_uniform_random_object();
+ ghobject_t new_obj = get_uniform_random_object(locker);
available_objects.erase(new_obj);
ObjectStore::Transaction t;
}
int truncate() {
- Mutex::Locker locker(lock);
+ std::unique_lock locker{lock};
EnterExit ee("truncate");
if (!can_unlink())
return -ENOENT;
- wait_for_ready();
+ wait_for_ready(locker);
- ghobject_t obj = get_uniform_random_object();
+ ghobject_t obj = get_uniform_random_object(locker);
available_objects.erase(obj);
ObjectStore::Transaction t;
}
int zero() {
- Mutex::Locker locker(lock);
+ std::unique_lock locker{lock};
EnterExit ee("zero");
if (!can_unlink())
return -ENOENT;
- wait_for_ready();
+ wait_for_ready(locker);
- ghobject_t new_obj = get_uniform_random_object();
+ ghobject_t new_obj = get_uniform_random_object(locker);
available_objects.erase(new_obj);
ObjectStore::Transaction t;
bufferlist expected;
int r;
{
- Mutex::Locker locker(lock);
+ std::unique_lock locker{lock};
EnterExit ee("read locked");
if (!can_unlink())
return ;
- wait_for_ready();
+ wait_for_ready(locker);
- obj = get_uniform_random_object();
+ obj = get_uniform_random_object(locker);
expected = contents[obj].data;
}
bufferlist bl, result;
}
int setattrs() {
- Mutex::Locker locker(lock);
+ std::unique_lock locker{lock};
EnterExit ee("setattrs");
if (!can_unlink())
return -ENOENT;
- wait_for_ready();
+ wait_for_ready(locker);
- ghobject_t obj = get_uniform_random_object();
+ ghobject_t obj = get_uniform_random_object(locker);
available_objects.erase(obj);
ObjectStore::Transaction t;
ghobject_t obj;
map<string, bufferlist> expected;
{
- Mutex::Locker locker(lock);
+ std::unique_lock locker{lock};
EnterExit ee("getattrs locked");
if (!can_unlink())
return ;
- wait_for_ready();
+ wait_for_ready(locker);
int retry = 10;
do {
- obj = get_uniform_random_object();
+ obj = get_uniform_random_object(locker);
if (!--retry)
return ;
} while (contents[obj].attrs.empty());
int retry;
map<string, bufferlist> expected;
{
- Mutex::Locker locker(lock);
+ std::unique_lock locker{lock};
EnterExit ee("getattr locked");
if (!can_unlink())
return ;
- wait_for_ready();
+ wait_for_ready(locker);
retry = 10;
do {
- obj = get_uniform_random_object();
+ obj = get_uniform_random_object(locker);
if (!--retry)
return ;
} while (contents[obj].attrs.empty());
}
int rmattr() {
- Mutex::Locker locker(lock);
+ std::unique_lock locker{lock};
EnterExit ee("rmattr");
if (!can_unlink())
return -ENOENT;
- wait_for_ready();
+ wait_for_ready(locker);
ghobject_t obj;
int retry = 10;
do {
- obj = get_uniform_random_object();
+ obj = get_uniform_random_object(locker);
if (!--retry)
return 0;
} while (contents[obj].attrs.empty());
}
void fsck(bool deep) {
- Mutex::Locker locker(lock);
+ std::unique_lock locker{lock};
EnterExit ee("fsck");
- while (in_flight)
- cond.Wait(lock);
+ cond.wait(locker, [this] { return in_flight == 0; });
ch.reset();
store->umount();
int r = store->fsck(deep);
}
void scan() {
- Mutex::Locker locker(lock);
+ std::unique_lock locker{lock};
EnterExit ee("scan");
- while (in_flight)
- cond.Wait(lock);
+ cond.wait(locker, [this] { return in_flight == 0; });
vector<ghobject_t> objects;
set<ghobject_t> objects_set, objects_set2;
ghobject_t next, current;
ghobject_t hoid;
uint64_t expected;
{
- Mutex::Locker locker(lock);
+ std::unique_lock locker{lock};
EnterExit ee("stat lock1");
if (!can_unlink())
return ;
- hoid = get_uniform_random_object();
+ hoid = get_uniform_random_object(locker);
in_flight_objects.insert(hoid);
available_objects.erase(hoid);
++in_flight;
ceph_assert((uint64_t)buf.st_size == expected);
ASSERT_TRUE((uint64_t)buf.st_size == expected);
{
- Mutex::Locker locker(lock);
+ std::lock_guard locker{lock};
EnterExit ee("stat lock2");
--in_flight;
- cond.Signal();
+ cond.notify_all();
in_flight_objects.erase(hoid);
available_objects.insert(hoid);
}
}
int unlink() {
- Mutex::Locker locker(lock);
+ std::unique_lock locker{lock};
EnterExit ee("unlink");
if (!can_unlink())
return -ENOENT;
- ghobject_t to_remove = get_uniform_random_object();
+ ghobject_t to_remove = get_uniform_random_object(locker);
ObjectStore::Transaction t;
t.remove(cid, to_remove);
++in_flight;
}
void print_internal_state() {
- Mutex::Locker locker(lock);
+ std::lock_guard locker{lock};
cerr << "available_objects: " << available_objects.size()
<< " in_flight_objects: " << in_flight_objects.size()
<< " total objects: " << in_flight_objects.size() + available_objects.size()