]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
objclass: add method to list watchers
authorMykola Golub <mgolub@mirantis.com>
Fri, 1 Apr 2016 05:27:03 +0000 (08:27 +0300)
committerAbhishek Varshney <abhishek.varshney@flipkart.com>
Mon, 2 May 2016 06:35:57 +0000 (12:05 +0530)
Signed-off-by: Mykola Golub <mgolub@mirantis.com>
(cherry picked from commit 44a31d2b770ef016271f9285447c601921b9c838)

src/objclass/class_api.cc
src/objclass/objclass.h
src/test/librados_test_stub/LibradosTestStub.cc

index d0d0827690aaad76758b6bc3b30fe69e3d2f6c26..6752e5175bf70b8db06913852123a675f4f4b76d 100644 (file)
@@ -6,6 +6,7 @@
 
 #include "objclass/objclass.h"
 #include "osd/ReplicatedPG.h"
+#include "osd/osd_types.h"
 
 #include "osd/ClassHandler.h"
 
@@ -606,6 +607,28 @@ int cls_cxx_map_remove_key(cls_method_context_t hctx, const string &key)
   return (*pctx)->pg->do_osd_ops(*pctx, ops);
 }
 
+int cls_cxx_list_watchers(cls_method_context_t hctx,
+                         obj_list_watch_response_t *watchers)
+{
+  ReplicatedPG::OpContext **pctx = (ReplicatedPG::OpContext **)hctx;
+  vector<OSDOp> nops(1);
+  OSDOp& op = nops[0];
+  int r;
+
+  op.op.op = CEPH_OSD_OP_LIST_WATCHERS;
+  r = (*pctx)->pg->do_osd_ops(*pctx, nops);
+  if (r < 0)
+    return r;
+
+  bufferlist::iterator iter = op.outdata.begin();
+  try {
+    ::decode(*watchers, iter);
+  } catch (buffer::error& err) {
+    return -EIO;
+  }
+  return 0;
+}
+
 int cls_gen_random_bytes(char *buf, int size)
 {
   return get_random_bytes(buf, size);
index 8bc3a0a6eae95424ab7e52976481e3f415e6c995..49a97ddd8ef493b05423942d7c06948c2ab882ce 100644 (file)
@@ -11,6 +11,8 @@
 #include "common/hobject.h"
 #include "common/ceph_time.h"
 
+struct obj_list_watch_response_t;
+
 extern "C" {
 #endif
 
@@ -181,6 +183,9 @@ extern int cls_cxx_map_write_header(cls_method_context_t hctx, bufferlist *inbl)
 extern int cls_cxx_map_remove_key(cls_method_context_t hctx, const string &key);
 extern int cls_cxx_map_update(cls_method_context_t hctx, bufferlist *inbl);
 
+extern int cls_cxx_list_watchers(cls_method_context_t hctx,
+                                obj_list_watch_response_t *watchers);
+
 /* utility functions */
 extern int cls_gen_random_bytes(char *buf, int size);
 extern int cls_gen_rand_base64(char *dest, int size); /* size should be the required string size + 1 */
index 7176ba470250dde495dec1c57e808a5f7b04dca3..dac71e948e9274d4a456d5afeb4a241085959111 100644 (file)
@@ -15,6 +15,7 @@
 #include "test/librados_test_stub/TestRadosClient.h"
 #include "test/librados_test_stub/TestMemRadosClient.h"
 #include "objclass/objclass.h"
+#include "osd/osd_types.h"
 #include <boost/bind.hpp>
 #include <boost/shared_ptr.hpp>
 #include <deque>
@@ -1159,6 +1160,29 @@ int cls_cxx_write_full(cls_method_context_t hctx, bufferlist *inbl) {
   return ctx->io_ctx_impl->write_full(ctx->oid, *inbl, ctx->snapc);
 }
 
+int cls_cxx_list_watchers(cls_method_context_t hctx,
+                         obj_list_watch_response_t *watchers) {
+  librados::TestClassHandler::MethodContext *ctx =
+    reinterpret_cast<librados::TestClassHandler::MethodContext*>(hctx);
+
+  std::list<obj_watch_t> obj_watchers;
+  int r = ctx->io_ctx_impl->list_watchers(ctx->oid, &obj_watchers);
+  if (r < 0) {
+    return r;
+  }
+
+  for (auto &w : obj_watchers) {
+    watch_item_t watcher;
+    watcher.name = entity_name_t::CLIENT(w.watcher_id);
+    watcher.cookie = w.cookie;
+    watcher.timeout_seconds = w.timeout_seconds;
+    watcher.addr.parse(w.addr, 0);
+    watchers->entries.push_back(watcher);
+  }
+
+  return 0;
+}
+
 int cls_log(int level, const char *format, ...) {
   int size = 256;
   va_list ap;