]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
pybind: add Rados.get_inconsistent_pgs method
authorKefu Chai <kchai@redhat.com>
Wed, 24 Feb 2016 13:42:34 +0000 (21:42 +0800)
committerKefu Chai <kchai@redhat.com>
Thu, 25 Feb 2016 04:40:17 +0000 (12:40 +0800)
Signed-off-by: Kefu Chai <kchai@redhat.com>
src/pybind/rados/rados.pyx

index ad21368aa04ccc9ac77b7616aebf44e4cd12d019..ffda2a18d295c521184a774a04339af965783ab1 100644 (file)
@@ -143,6 +143,7 @@ cdef extern from "rados/librados.h" nogil:
     int rados_pool_get_base_tier(rados_t cluster, int64_t pool, int64_t *base_tier)
     int rados_pool_list(rados_t cluster, char *buf, size_t len)
     int rados_pool_delete(rados_t cluster, const char *pool_name)
+    int rados_inconsistent_pg_list(rados_t cluster, int64_t pool, char *buf, size_t len)
 
     int rados_cluster_stat(rados_t cluster, rados_cluster_stat_t *result)
     int rados_cluster_fsid(rados_t cluster, char *buf, size_t len)
@@ -993,6 +994,37 @@ Rados object in state %s." % self.state)
         if ret < 0:
             raise make_ex(ret, "error deleting pool '%s'" % pool_name)
 
+    @require(('pool_id', int))
+    def get_inconsistent_pgs(self, pool_id):
+        """
+        List inconsistent placement groups in the given pool
+
+        :param pool_id: ID of the pool in which PGs are listed
+        :type pool_id: int
+        :returns: list - inconsistent placement groups
+        """
+        self.require_state("connected")
+        cdef:
+            int64_t _pool_id = pool_id
+            size_t size = 512
+            char *pgs = NULL
+
+        try:
+            while True:
+                pgs = <char *>realloc_chk(pgs, size);
+                with nogil:
+                    ret = rados_inconsistent_pg_list(self.cluster,
+                                                     c_names, size)
+                if ret > size:
+                    size *= 2
+                elif ret >= 0:
+                    break
+                else:
+                    raise make_ex(ret, "error calling inconsistent_pg_list")
+            return [pg for pg in decode_cstr(pgs[:ret]).split('\0') if name]
+        finally:
+            free(pgs)
+
     def list_pools(self):
         """
         Gets a list of pool names.