]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
cls_rbd: add object_map_save method
authorJason Dillaman <dillaman@redhat.com>
Fri, 10 Apr 2015 17:56:39 +0000 (13:56 -0400)
committerJason Dillaman <dillaman@redhat.com>
Fri, 10 Apr 2015 19:46:22 +0000 (15:46 -0400)
Allow the object map rebuild process to build the full object map
in memory and save it to disk with one operation.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/cls/rbd/cls_rbd.cc

index ef18c6ea08bb81774ccfb082a9e0a5aeb7b7620d..c8748651d5b9bf89109ee3eb5a88d4c4c46a2443 100644 (file)
@@ -95,6 +95,7 @@ cls_method_handle_t h_dir_add_image;
 cls_method_handle_t h_dir_remove_image;
 cls_method_handle_t h_dir_rename_image;
 cls_method_handle_t h_object_map_load;
+cls_method_handle_t h_object_map_save;
 cls_method_handle_t h_object_map_resize;
 cls_method_handle_t h_object_map_update;
 cls_method_handle_t h_metadata_set;
@@ -2028,6 +2029,32 @@ int object_map_load(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
   return 0;
 }
 
+/**
+ * Save an rbd image's object map
+ *
+ * Input:
+ * @param object map bit vector
+ *
+ * Output:
+ * @returns 0 on success, negative error code on failure
+ */
+int object_map_save(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
+{
+  BitVector<2> object_map;
+  try {
+    bufferlist::iterator iter = in->begin();
+    ::decode(object_map, iter);
+  } catch (const buffer::error &err) {
+    return -EINVAL;
+  }
+
+  bufferlist bl;
+  ::encode(object_map, bl);
+  CLS_LOG(20, "object_map_save: object size=%" PRIu64 ", byte size=%u",
+         object_map.size(), bl.length());
+  return cls_cxx_write_full(hctx, &bl);
+}
+
 /**
  * Resize an rbd image's object map
  *
@@ -2672,6 +2699,9 @@ void __cls_init()
   cls_register_cxx_method(h_class, "object_map_load",
                           CLS_METHOD_RD,
                          object_map_load, &h_object_map_load);
+  cls_register_cxx_method(h_class, "object_map_save",
+                          CLS_METHOD_RD | CLS_METHOD_WR,
+                         object_map_save, &h_object_map_save);
   cls_register_cxx_method(h_class, "object_map_resize",
                           CLS_METHOD_RD | CLS_METHOD_WR,
                          object_map_resize, &h_object_map_resize);