/**
* Input:
* @param id (string) - unique client id
- * @param description (string) - human-readable description of the client
+ * @param data (bufferlist) - opaque data associated to client
*
* Output:
* @returns 0 on success, negative error code on failure
int journal_client_register(cls_method_context_t hctx, bufferlist *in,
bufferlist *out) {
std::string id;
- std::string description;
+ bufferlist data;
try {
bufferlist::iterator iter = in->begin();
::decode(id, iter);
- ::decode(description, iter);
+ ::decode(data, iter);
} catch (const buffer::error &err) {
CLS_ERR("failed to decode input parameters: %s", err.what());
return -EINVAL;
return -EEXIST;
}
- cls::journal::Client client(id, description);
+ cls::journal::Client client(id, data);
key = key_from_client_id(id);
r = write_key(hctx, key, client);
if (r < 0) {
}
void client_register(librados::ObjectWriteOperation *op,
- const std::string &id, const std::string &description) {
+ const std::string &id, const bufferlist &data) {
bufferlist bl;
::encode(id, bl);
- ::encode(description, bl);
+ ::encode(data, bl);
op->exec("journal", "client_register", bl);
}
int client_register(librados::IoCtx &ioctx, const std::string &oid,
- const std::string &id, const std::string &description) {
+ const std::string &id, const bufferlist &data) {
librados::ObjectWriteOperation op;
- client_register(&op, id, description);
+ client_register(&op, id, data);
return ioctx.operate(oid, &op);
}
// journal client helpers
void client_register(librados::ObjectWriteOperation *op,
- const std::string &id, const std::string &description);
+ const std::string &id, const bufferlist &data);
int client_register(librados::IoCtx &ioctx, const std::string &oid,
- const std::string &id, const std::string &description);
+ const std::string &id, const bufferlist &data);
int client_unregister(librados::IoCtx &ioctx, const std::string &oid,
const std::string &id);
void client_commit(librados::ObjectWriteOperation *op, const std::string &id,
void Client::encode(bufferlist& bl) const {
ENCODE_START(1, 1, bl);
::encode(id, bl);
- ::encode(description, bl);
+ ::encode(data, bl);
::encode(commit_position, bl);
ENCODE_FINISH(bl);
}
void Client::decode(bufferlist::iterator& iter) {
DECODE_START(1, iter);
::decode(id, iter);
- ::decode(description, iter);
+ ::decode(data, iter);
::decode(commit_position, iter);
DECODE_FINISH(iter);
}
void Client::dump(Formatter *f) const {
f->dump_string("id", id);
- f->dump_string("description", description);
+
+ std::stringstream data_ss;
+ data.hexdump(data_ss);
+ f->dump_string("data", data_ss.str());
f->open_object_section("commit_position");
commit_position.dump(f);
}
void Client::generate_test_instances(std::list<Client *> &o) {
+ bufferlist data;
+ data.append(std::string('1', 128));
+
o.push_back(new Client());
- o.push_back(new Client("id", "desc"));
- o.push_back(new Client("id", "desc", {1, {{1, 120}, {2, 121}}}));
+ o.push_back(new Client("id", data));
+ o.push_back(new Client("id", data, {1, {{1, 120}, {2, 121}}}));
}
void Tag::encode(bufferlist& bl) const {
std::ostream &operator<<(std::ostream &os, const Client &client) {
os << "[id=" << client.id << ", "
- << "description=" << client.description << ", "
+ << "data=";
+ client.data.hexdump(os);
+ os << ", "
<< "commit_position=" << client.commit_position << "]";
return os;
}
struct Client {
std::string id;
- std::string description;
+ bufferlist data;
ObjectSetPosition commit_position;
Client() {}
- Client(const std::string& _id, const std::string& _description,
+ Client(const std::string& _id, const bufferlist &_data,
const ObjectSetPosition &_commit_position = ObjectSetPosition())
- : id(_id), description(_description), commit_position(_commit_position) {}
+ : id(_id), data(_data), commit_position(_commit_position) {}
inline bool operator==(const Client &rhs) const {
return (id == rhs.id &&
- description == rhs.description &&
+ data.contents_equal(rhs.data) &&
commit_position == rhs.commit_position);
}
inline bool operator<(const Client &rhs) const {
m_ioctx.aio_flush();
}
-int JournalMetadata::register_client(const std::string &description) {
+int JournalMetadata::register_client(const bufferlist &data) {
ldout(m_cct, 10) << __func__ << ": " << m_client_id << dendl;
- int r = client::client_register(m_ioctx, m_oid, m_client_id, description);
+ int r = client::client_register(m_ioctx, m_oid, m_client_id, data);
if (r < 0) {
lderr(m_cct) << "failed to register journal client '" << m_client_id
<< "': " << cpp_strerror(r) << dendl;
if (r == 0) {
Mutex::Locker locker(m_lock);
- Client client(m_client_id, "");
+ Client client(m_client_id, bufferlist());
RegisteredClients::iterator it = refresh->registered_clients.find(client);
if (it != refresh->registered_clients.end()) {
m_minimum_set = refresh->minimum_set;
void add_listener(Listener *listener);
void remove_listener(Listener *listener);
- int register_client(const std::string &description);
+ int register_client(const bufferlist &data);
int unregister_client();
inline const std::string &get_client_id() const {
return 0;
}
-int Journaler::register_client(const std::string &description) {
- return m_metadata->register_client(description);
+int Journaler::register_client(const bufferlist &data) {
+ return m_metadata->register_client(data);
}
int Journaler::unregister_client() {
void init(Context *on_init);
void shutdown();
- int register_client(const std::string &description);
+ int register_client(const bufferlist &data);
int unregister_client();
void start_replay(ReplayHandler *replay_handler);
using util::create_async_context_callback;
using util::create_context_callback;
-namespace {
-
-const std::string CLIENT_DESCRIPTION = "master image";
-
-} // anonymous namespace
-
template <typename I>
std::ostream &operator<<(std::ostream &os,
const typename Journal<I>::State &state) {
return r;
}
- r = journaler.register_client(CLIENT_DESCRIPTION);
+ // TODO register with librbd payload
+ r = journaler.register_client(bufferlist());
if (r < 0) {
lderr(cct) << "failed to register client: " << cpp_strerror(r) << dendl;
return r;
lderr(cct) << "failed to create journal: " << cpp_strerror(r) << dendl;
return r;
}
- r = journaler.register_client(CLIENT_DESCRIPTION);
+ r = journaler.register_client(bufferlist());
if (r < 0) {
lderr(cct) << "failed to register client: " << cpp_strerror(r) << dendl;
return r;
std::string oid = get_temp_image_name();
- ASSERT_EQ(0, client::client_register(ioctx, oid, "id1", "desc1"));
+ ASSERT_EQ(0, client::client_register(ioctx, oid, "id1", bufferlist()));
std::set<Client> clients;
ASSERT_EQ(0, client::client_list(ioctx, oid, &clients));
- std::set<Client> expected_clients = {Client("id1", "desc1")};
+ std::set<Client> expected_clients = {Client("id1", bufferlist())};
ASSERT_EQ(expected_clients, clients);
}
std::string oid = get_temp_image_name();
- ASSERT_EQ(0, client::client_register(ioctx, oid, "id1", "desc1"));
- ASSERT_EQ(-EEXIST, client::client_register(ioctx, oid, "id1", "desc2"));
+ ASSERT_EQ(0, client::client_register(ioctx, oid, "id1", bufferlist()));
+ ASSERT_EQ(-EEXIST, client::client_register(ioctx, oid, "id1", bufferlist()));
}
TEST_F(TestClsJournal, ClientUnregister) {
std::string oid = get_temp_image_name();
- ASSERT_EQ(0, client::client_register(ioctx, oid, "id1", "desc1"));
+ ASSERT_EQ(0, client::client_register(ioctx, oid, "id1", bufferlist()));
ASSERT_EQ(0, client::client_unregister(ioctx, oid, "id1"));
}
std::string oid = get_temp_image_name();
- ASSERT_EQ(0, client::client_register(ioctx, oid, "id1", "desc1"));
+ ASSERT_EQ(0, client::client_register(ioctx, oid, "id1", bufferlist()));
ASSERT_EQ(0, client::client_unregister(ioctx, oid, "id1"));
ASSERT_EQ(-ENOENT, client::client_unregister(ioctx, oid, "id1"));
}
std::string oid = get_temp_image_name();
ASSERT_EQ(0, client::create(ioctx, oid, 2, 2, ioctx.get_id()));
- ASSERT_EQ(0, client::client_register(ioctx, oid, "id1", "desc1"));
- ASSERT_EQ(0, client::client_register(ioctx, oid, "id2", "desc2"));
+ ASSERT_EQ(0, client::client_register(ioctx, oid, "id1", bufferlist()));
+ ASSERT_EQ(0, client::client_register(ioctx, oid, "id2", bufferlist()));
ASSERT_EQ(0, client::tag_create(ioctx, oid, 0, Tag::TAG_CLASS_NEW,
bufferlist()));
std::string oid = get_temp_image_name();
ASSERT_EQ(0, client::create(ioctx, oid, 2, 2, ioctx.get_id()));
- ASSERT_EQ(0, client::client_register(ioctx, oid, "id1", "desc1"));
+ ASSERT_EQ(0, client::client_register(ioctx, oid, "id1", bufferlist()));
cls::journal::EntryPositions entry_positions;
entry_positions = {
ASSERT_EQ(0, client::client_list(ioctx, oid, &clients));
std::set<Client> expected_clients = {
- Client("id1", "desc1", object_set_position)};
+ Client("id1", bufferlist(), object_set_position)};
ASSERT_EQ(expected_clients, clients);
}
std::string oid = get_temp_image_name();
ASSERT_EQ(0, client::create(ioctx, oid, 2, 2, ioctx.get_id()));
- ASSERT_EQ(0, client::client_register(ioctx, oid, "id1", "desc1"));
+ ASSERT_EQ(0, client::client_register(ioctx, oid, "id1", bufferlist()));
cls::journal::EntryPositions entry_positions;
entry_positions = {
librados::ObjectWriteOperation op1;
for (uint32_t i = 0; i < 512; ++i) {
std::string id = "id" + stringify(i + 1);
- expected_clients.insert(Client(id, ""));
- client::client_register(&op1, id, "");
+ expected_clients.insert(Client(id, bufferlist()));
+ client::client_register(&op1, id, bufferlist());
}
ASSERT_EQ(0, ioctx.operate(oid, &op1));
ASSERT_EQ(-ENOENT, client::get_next_tag_tid(ioctx, oid, &tag_tid));
ASSERT_EQ(0, client::create(ioctx, oid, 2, 2, ioctx.get_id()));
- ASSERT_EQ(0, client::client_register(ioctx, oid, "id1", "desc1"));
+ ASSERT_EQ(0, client::client_register(ioctx, oid, "id1", bufferlist()));
ASSERT_EQ(0, client::get_next_tag_tid(ioctx, oid, &tag_tid));
ASSERT_EQ(0U, tag_tid);
bufferlist()));
ASSERT_EQ(0, client::create(ioctx, oid, 2, 2, ioctx.get_id()));
- ASSERT_EQ(0, client::client_register(ioctx, oid, "id1", "desc1"));
+ ASSERT_EQ(0, client::client_register(ioctx, oid, "id1", bufferlist()));
ASSERT_EQ(-ESTALE, client::tag_create(ioctx, oid, 1, Tag::TAG_CLASS_NEW,
bufferlist()));
std::string oid = get_temp_image_name();
ASSERT_EQ(0, client::create(ioctx, oid, 2, 2, ioctx.get_id()));
- ASSERT_EQ(0, client::client_register(ioctx, oid, "id1", "desc1"));
+ ASSERT_EQ(0, client::client_register(ioctx, oid, "id1", bufferlist()));
ASSERT_EQ(0, client::tag_create(ioctx, oid, 0, Tag::TAG_CLASS_NEW,
bufferlist()));
std::string oid = get_temp_image_name();
ASSERT_EQ(0, client::create(ioctx, oid, 2, 2, ioctx.get_id()));
- ASSERT_EQ(0, client::client_register(ioctx, oid, "id1", "desc1"));
+ ASSERT_EQ(0, client::client_register(ioctx, oid, "id1", bufferlist()));
std::set<Tag> expected_all_tags;
std::set<Tag> expected_filtered_tags;
int RadosTestFixture::client_register(const std::string &oid,
const std::string &id,
const std::string &description) {
- return cls::journal::client::client_register(m_ioctx, oid, id, description);
+ bufferlist data;
+ data.append(description);
+ return cls::journal::client::client_register(m_ioctx, oid, id, data);
}
int RadosTestFixture::client_commit(const std::string &oid,
int register_client(const std::string &client_id, const std::string &desc) {
journal::Journaler journaler(m_ioctx, m_journal_id, client_id, 5);
- return journaler.register_client(desc);
+ bufferlist data;
+ data.append(desc);
+ return journaler.register_client(data);
}
static uint64_t _journal_id;
journal::Journaler *journaler = new journal::Journaler(
ictx->md_ctx, ictx->id, "dummy client", 1);
- int r = journaler->register_client("unit test client");
+ int r = journaler->register_client(bufferlist());
if (r < 0) {
ADD_FAILURE() << "failed to register journal client";
delete journaler;
int remove(bool force) {
return -EINVAL;
}
- int register_client(const std::string &description) {
+ int register_client(const bufferlist &data) {
return -EINVAL;
}
return r;
}
- // XXXMG
- const std::string CLIENT_DESCRIPTION = "master image";
-
- r = journaler.register_client(CLIENT_DESCRIPTION);
+ // TODO register with librbd payload
+ r = journaler.register_client(bufferlist());
if (r < 0) {
std::cerr << "failed to register client: " << cpp_strerror(r) << std::endl;
return r;
int init() {
int r;
- r = register_client("rbd journal");
+ // TODO register with librbd payload
+ r = register_client(bufferlist());
if (r < 0) {
std::cerr << "failed to register client: " << cpp_strerror(r)
<< std::endl;