From: Jason Dillaman Date: Thu, 19 Feb 2015 17:33:39 +0000 (-0500) Subject: librbd: add test instances for watch/notify messages X-Git-Tag: v0.93~16^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=942f875135ac34d6df06ff0c4d1c244e77eab2c4;p=ceph.git librbd: add test instances for watch/notify messages Ensure that the librbd watch/notify messages are tested for backwards compatibility. Signed-off-by: Jason Dillaman --- diff --git a/src/Makefile-env.am b/src/Makefile-env.am index 9992b41d1d3c..aca2d399d449 100644 --- a/src/Makefile-env.am +++ b/src/Makefile-env.am @@ -153,6 +153,7 @@ LIBRADOS = librados.la LIBRADOSSTRIPER = libradosstriper.la LIBRGW = librgw.la LIBRBD = librbd.la +LIBRBD_TYPES = librbd_types.la LIBKRBD = libkrbd.la LIBCEPHFS = libcephfs.la LIBERASURE_CODE = liberasure_code.la diff --git a/src/librbd/Makefile.am b/src/librbd/Makefile.am index f18d7b00b330..ffed797760f9 100644 --- a/src/librbd/Makefile.am +++ b/src/librbd/Makefile.am @@ -1,3 +1,7 @@ +librbd_types_la_SOURCES = \ + librbd/WatchNotifyTypes.cc +noinst_LTLIBRARIES += librbd_types.la + librbd_internal_la_SOURCES = \ librbd/AioCompletion.cc \ librbd/AioRequest.cc \ @@ -12,8 +16,7 @@ librbd_internal_la_SOURCES = \ librbd/ImageWatcher.cc \ librbd/internal.cc \ librbd/LibrbdWriteback.cc \ - librbd/ObjectMap.cc \ - librbd/WatchNotifyTypes.cc + librbd/ObjectMap.cc noinst_LTLIBRARIES += librbd_internal.la librbd_api_la_SOURCES = \ @@ -23,7 +26,7 @@ noinst_LTLIBRARIES += librbd_api.la librbd_la_SOURCES = \ librbd/librbd.cc librbd_la_LIBADD = \ - librbd_internal.la \ + librbd_internal.la $(LIBRBD_TYPES) \ $(LIBRADOS) $(LIBCOMMON) $(LIBOSDC) \ librados_internal.la \ libcls_rbd_client.la \ diff --git a/src/librbd/WatchNotifyTypes.cc b/src/librbd/WatchNotifyTypes.cc index 4622ff67cebb..701846bd344b 100644 --- a/src/librbd/WatchNotifyTypes.cc +++ b/src/librbd/WatchNotifyTypes.cc @@ -3,6 +3,7 @@ #include "librbd/WatchNotifyTypes.h" #include "include/assert.h" +#include "common/Formatter.h" namespace librbd { namespace WatchNotify { @@ -37,6 +38,19 @@ private: bufferlist::iterator &m_iter; }; +class DumpPayloadVisitor : public boost::static_visitor { +public: + DumpPayloadVisitor(Formatter *formatter) : m_formatter(formatter) {} + + template + inline void operator()(const Payload &payload) const { + payload.dump(m_formatter); + } + +private: + ceph::Formatter *m_formatter; +}; + } void ClientId::encode(bufferlist &bl) const { @@ -49,6 +63,11 @@ void ClientId::decode(bufferlist::iterator &iter) { ::decode(handle, iter); } +void ClientId::dump(Formatter *f) const { + f->dump_unsigned("gid", gid); + f->dump_unsigned("handle", handle); +} + void AsyncRequestId::encode(bufferlist &bl) const { ::encode(client_id, bl); ::encode(request_id, bl); @@ -59,6 +78,13 @@ void AsyncRequestId::decode(bufferlist::iterator &iter) { ::decode(request_id, iter); } +void AsyncRequestId::dump(Formatter *f) const { + f->open_object_section("client_id"); + client_id.dump(f); + f->close_section(); + f->dump_unsigned("request_id", request_id); +} + void AcquiredLockPayload::encode(bufferlist &bl) const { ::encode(static_cast(NOTIFY_OP_ACQUIRED_LOCK), bl); } @@ -66,6 +92,10 @@ void AcquiredLockPayload::encode(bufferlist &bl) const { void AcquiredLockPayload::decode(__u8 version, bufferlist::iterator &iter) { } +void AcquiredLockPayload::dump(Formatter *f) const { + f->dump_string("notify_op", "AcquiredLock"); +} + void ReleasedLockPayload::encode(bufferlist &bl) const { ::encode(static_cast(NOTIFY_OP_RELEASED_LOCK), bl); } @@ -73,6 +103,10 @@ void ReleasedLockPayload::encode(bufferlist &bl) const { void ReleasedLockPayload::decode(__u8 version, bufferlist::iterator &iter) { } +void ReleasedLockPayload::dump(Formatter *f) const { + f->dump_string("notify_op", "ReleasedLock"); +} + void RequestLockPayload::encode(bufferlist &bl) const { ::encode(static_cast(NOTIFY_OP_REQUEST_LOCK), bl); } @@ -80,6 +114,10 @@ void RequestLockPayload::encode(bufferlist &bl) const { void RequestLockPayload::decode(__u8 version, bufferlist::iterator &iter) { } +void RequestLockPayload::dump(Formatter *f) const { + f->dump_string("notify_op", "RequestLock"); +} + void HeaderUpdatePayload::encode(bufferlist &bl) const { ::encode(static_cast(NOTIFY_OP_HEADER_UPDATE), bl); } @@ -87,6 +125,10 @@ void HeaderUpdatePayload::encode(bufferlist &bl) const { void HeaderUpdatePayload::decode(__u8 version, bufferlist::iterator &iter) { } +void HeaderUpdatePayload::dump(Formatter *f) const { + f->dump_string("notify_op", "HeaderUpdate"); +} + void AsyncProgressPayload::encode(bufferlist &bl) const { ::encode(static_cast(NOTIFY_OP_ASYNC_PROGRESS), bl); ::encode(async_request_id, bl); @@ -100,6 +142,15 @@ void AsyncProgressPayload::decode(__u8 version, bufferlist::iterator &iter) { ::decode(total, iter); } +void AsyncProgressPayload::dump(Formatter *f) const { + f->dump_string("notify_op", "AsyncProgress"); + f->open_object_section("async_request_id"); + async_request_id.dump(f); + f->close_section(); + f->dump_unsigned("offset", offset); + f->dump_unsigned("total", total); +} + void AsyncCompletePayload::encode(bufferlist &bl) const { ::encode(static_cast(NOTIFY_OP_ASYNC_COMPLETE), bl); ::encode(async_request_id, bl); @@ -111,6 +162,14 @@ void AsyncCompletePayload::decode(__u8 version, bufferlist::iterator &iter) { ::decode(result, iter); } +void AsyncCompletePayload::dump(Formatter *f) const { + f->dump_string("notify_op", "AsyncComplete"); + f->open_object_section("async_request_id"); + async_request_id.dump(f); + f->close_section(); + f->dump_int("result", result); +} + void FlattenPayload::encode(bufferlist &bl) const { ::encode(static_cast(NOTIFY_OP_FLATTEN), bl); ::encode(async_request_id, bl); @@ -120,6 +179,13 @@ void FlattenPayload::decode(__u8 version, bufferlist::iterator &iter) { ::decode(async_request_id, iter); } +void FlattenPayload::dump(Formatter *f) const { + f->dump_string("notify_op", "Flatten"); + f->open_object_section("async_request_id"); + async_request_id.dump(f); + f->close_section(); +} + void ResizePayload::encode(bufferlist &bl) const { ::encode(static_cast(NOTIFY_OP_RESIZE), bl); ::encode(size, bl); @@ -131,6 +197,14 @@ void ResizePayload::decode(__u8 version, bufferlist::iterator &iter) { ::decode(async_request_id, iter); } +void ResizePayload::dump(Formatter *f) const { + f->dump_string("notify_op", "Resize"); + f->dump_unsigned("size", size); + f->open_object_section("async_request_id"); + async_request_id.dump(f); + f->close_section(); +} + void SnapCreatePayload::encode(bufferlist &bl) const { ::encode(static_cast(NOTIFY_OP_SNAP_CREATE), bl); ::encode(snap_name, bl); @@ -140,6 +214,11 @@ void SnapCreatePayload::decode(__u8 version, bufferlist::iterator &iter) { ::decode(snap_name, iter); } +void SnapCreatePayload::dump(Formatter *f) const { + f->dump_string("notify_op", "SnapCreate"); + f->dump_string("snap_name", snap_name); +} + void UnknownPayload::encode(bufferlist &bl) const { assert(false); } @@ -147,6 +226,9 @@ void UnknownPayload::encode(bufferlist &bl) const { void UnknownPayload::decode(__u8 version, bufferlist::iterator &iter) { } +void UnknownPayload::dump(Formatter *f) const { +} + void NotifyMessage::encode(bufferlist& bl) const { ENCODE_START(1, 1, bl); boost::apply_visitor(EncodePayloadVisitor(bl), payload); @@ -197,6 +279,22 @@ void NotifyMessage::decode(bufferlist::iterator& iter) { DECODE_FINISH(iter); } +void NotifyMessage::dump(Formatter *f) const { + apply_visitor(DumpPayloadVisitor(f), payload); +} + +void NotifyMessage::generate_test_instances(std::list &o) { + o.push_back(new NotifyMessage(AcquiredLockPayload())); + o.push_back(new NotifyMessage(ReleasedLockPayload())); + o.push_back(new NotifyMessage(RequestLockPayload())); + o.push_back(new NotifyMessage(HeaderUpdatePayload())); + o.push_back(new NotifyMessage(AsyncProgressPayload(AsyncRequestId(ClientId(0, 1), 2), 3, 4))); + o.push_back(new NotifyMessage(AsyncCompletePayload(AsyncRequestId(ClientId(0, 1), 2), 3))); + o.push_back(new NotifyMessage(FlattenPayload(AsyncRequestId(ClientId(0, 1), 2)))); + o.push_back(new NotifyMessage(ResizePayload(123, AsyncRequestId(ClientId(0, 1), 2)))); + o.push_back(new NotifyMessage(SnapCreatePayload("foo"))); +} + void ResponseMessage::encode(bufferlist& bl) const { ENCODE_START(1, 1, bl); ::encode(result, bl); @@ -209,6 +307,14 @@ void ResponseMessage::decode(bufferlist::iterator& iter) { DECODE_FINISH(iter); } +void ResponseMessage::dump(Formatter *f) const { + f->dump_int("result", result); +} + +void ResponseMessage::generate_test_instances(std::list &o) { + o.push_back(new ResponseMessage(1)); +} + } // namespace WatchNotify } // namespace librbd diff --git a/src/librbd/WatchNotifyTypes.h b/src/librbd/WatchNotifyTypes.h index abb36d60188f..d3b27efa78e7 100644 --- a/src/librbd/WatchNotifyTypes.h +++ b/src/librbd/WatchNotifyTypes.h @@ -7,9 +7,14 @@ #include "include/buffer.h" #include "include/encoding.h" #include +#include #include #include +namespace ceph { +class Formatter; +} + namespace librbd { namespace WatchNotify { @@ -22,6 +27,7 @@ struct ClientId { void encode(bufferlist& bl) const; void decode(bufferlist::iterator& it); + void dump(Formatter *f) const; inline bool operator==(const ClientId &rhs) const { return (gid == rhs.gid && handle == rhs.handle); @@ -48,6 +54,7 @@ struct AsyncRequestId { void encode(bufferlist& bl) const; void decode(bufferlist::iterator& it); + void dump(Formatter *f) const; inline bool operator<(const AsyncRequestId &rhs) const { if (client_id != rhs.client_id) { @@ -73,21 +80,25 @@ enum NotifyOp { struct AcquiredLockPayload { void encode(bufferlist &bl) const; void decode(__u8 version, bufferlist::iterator &iter); + void dump(Formatter *f) const; }; struct ReleasedLockPayload { void encode(bufferlist &bl) const; void decode(__u8 version, bufferlist::iterator &iter); + void dump(Formatter *f) const; }; struct RequestLockPayload { void encode(bufferlist &bl) const; void decode(__u8 version, bufferlist::iterator &iter); + void dump(Formatter *f) const; }; struct HeaderUpdatePayload { void encode(bufferlist &bl) const; void decode(__u8 version, bufferlist::iterator &iter); + void dump(Formatter *f) const; }; struct AsyncProgressPayload { @@ -101,6 +112,7 @@ struct AsyncProgressPayload { void encode(bufferlist &bl) const; void decode(__u8 version, bufferlist::iterator &iter); + void dump(Formatter *f) const; }; struct AsyncCompletePayload { @@ -113,6 +125,7 @@ struct AsyncCompletePayload { void encode(bufferlist &bl) const; void decode(__u8 version, bufferlist::iterator &iter); + void dump(Formatter *f) const; }; struct FlattenPayload { @@ -123,6 +136,7 @@ struct FlattenPayload { void encode(bufferlist &bl) const; void decode(__u8 version, bufferlist::iterator &iter); + void dump(Formatter *f) const; }; struct ResizePayload { @@ -135,6 +149,7 @@ struct ResizePayload { void encode(bufferlist &bl) const; void decode(__u8 version, bufferlist::iterator &iter); + void dump(Formatter *f) const; }; struct SnapCreatePayload { @@ -145,11 +160,13 @@ struct SnapCreatePayload { void encode(bufferlist &bl) const; void decode(__u8 version, bufferlist::iterator &iter); + void dump(Formatter *f) const; }; struct UnknownPayload { void encode(bufferlist &bl) const; void decode(__u8 version, bufferlist::iterator &iter); + void dump(Formatter *f) const; }; typedef boost::variant &o); }; struct ResponseMessage { @@ -181,6 +201,9 @@ struct ResponseMessage { void encode(bufferlist& bl) const; void decode(bufferlist::iterator& it); + void dump(Formatter *f) const; + + static void generate_test_instances(std::list &o); }; } // namespace WatchNotify diff --git a/src/test/Makefile.am b/src/test/Makefile.am index ebedb4cabf05..023e797bd29b 100644 --- a/src/test/Makefile.am +++ b/src/test/Makefile.am @@ -60,6 +60,7 @@ ceph_dencoder_SOURCES = \ test/encoding/ceph_dencoder.cc \ $(DENCODER_SOURCES) ceph_dencoder_LDADD = \ + $(LIBRBD_TYPES) \ $(LIBOSD_TYPES) \ $(LIBOS_TYPES) \ $(LIBMDS) \ @@ -781,7 +782,7 @@ noinst_LTLIBRARIES += librbd_test.la unittest_librbd_SOURCES = nodist_EXTRA_unittest_librbd_SOURCES = dummy.cc unittest_librbd_LDADD = \ - librbd_test.la librbd_api.la librbd_internal.la \ + librbd_test.la librbd_api.la librbd_internal.la $(LIBRBD_TYPES) \ libcls_rbd_client.la libcls_lock_client.la \ librados_test_stub.la librados_internal.la \ $(LIBOSDC) $(UNITTEST_LDADD) \ @@ -791,7 +792,7 @@ check_PROGRAMS += unittest_librbd ceph_test_librbd_SOURCES = nodist_EXTRA_ceph_test_librbd_SOURCES = dummy.cc ceph_test_librbd_LDADD = \ - librbd_test.la librbd_api.la librbd_internal.la \ + librbd_test.la librbd_api.la librbd_internal.la $(LIBRBD_TYPES) \ libcls_rbd_client.la libcls_lock_client.la \ librados_api.la $(LIBRADOS_DEPS) $(UNITTEST_LDADD) \ $(CEPH_GLOBAL) $(RADOS_TEST_LDADD) diff --git a/src/test/encoding/types.h b/src/test/encoding/types.h index 7c28e0db3f44..bcc03472c2d9 100644 --- a/src/test/encoding/types.h +++ b/src/test/encoding/types.h @@ -222,6 +222,10 @@ TYPE(ETableServer) #include "mds/events/EUpdate.h" TYPE(EUpdate) +#include "librbd/WatchNotifyTypes.h" +TYPE(librbd::WatchNotify::NotifyMessage) +TYPE(librbd::WatchNotify::ResponseMessage) + #ifdef WITH_RADOSGW #include "rgw/rgw_rados.h"