}
};
+class GetNotifyOpVisitor : public boost::static_visitor<NotifyOp> {
+public:
+ template <typename Payload>
+ NotifyOp operator()(const Payload &payload) const {
+ return Payload::NOTIFY_OP;
+ }
+};
+
class DumpPayloadVisitor : public boost::static_visitor<void> {
public:
explicit DumpPayloadVisitor(Formatter *formatter) : m_formatter(formatter) {}
apply_visitor(DumpPayloadVisitor(f), payload);
}
+NotifyOp NotifyMessage::get_notify_op() const {
+ apply_visitor(GetNotifyOpVisitor(), payload);
+}
+
void NotifyMessage::generate_test_instances(std::list<NotifyMessage *> &o) {
o.push_back(new NotifyMessage(AcquiredLockPayload(ClientId(1, 2))));
o.push_back(new NotifyMessage(ReleasedLockPayload(ClientId(1, 2))));
void encode(bufferlist& bl) const;
void decode(bufferlist::iterator& it);
void dump(Formatter *f) const;
+ NotifyOp get_notify_op() const;
static void generate_test_instances(std::list<NotifyMessage *> &o);
};
#include "tools/rbd/Shell.h"
#include "tools/rbd/Utils.h"
#include "include/rbd_types.h"
+#include "librbd/WatchNotifyTypes.h"
#include "common/errno.h"
#include <iostream>
#include <boost/program_options.hpp>
uint64_t cookie,
uint64_t notifier_id,
bufferlist& bl) override {
+ using namespace librbd::watch_notify;
+ NotifyMessage notify_message;
+ if (bl.length() == 0) {
+ notify_message = NotifyMessage(HeaderUpdatePayload());
+ } else {
+ try {
+ bufferlist::iterator iter = bl.begin();
+ notify_message.decode(iter);
+ } catch (const buffer::error &err) {
+ std::cerr << "rbd: failed to decode image notification" << std::endl;
+ }
+ }
+
std::cout << m_image_name << " received notification: notify_id="
<< notify_id << ", cookie=" << cookie << ", notifier_id="
- << notifier_id << ", bl.length=" << bl.length() << std::endl;
+ << notifier_id << ", bl.length=" << bl.length() << ", notify_op="
+ << notify_message.get_notify_op() << std::endl;
bufferlist reply;
m_io_ctx.notify_ack(m_header_oid, notify_id, cookie, reply);
}