]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: Support new, filtered MStatfs
authorDouglas Fuller <dfuller@redhat.com>
Mon, 17 Jul 2017 21:24:24 +0000 (17:24 -0400)
committerDouglas Fuller <dfuller@redhat.com>
Thu, 3 Aug 2017 18:11:46 +0000 (14:11 -0400)
When statfs() is called for a filesystem with a single data pool,
add that as an argument to receive statistics for that pool only.

Signed-off-by: Douglas Fuller <dfuller@redhat.com>
src/client/Client.cc
src/librados/RadosClient.cc

index 6b34e4a330e43df4983fc48be64fd78045675a49..7d8903aadc4b541f9b272ec75c6b381148cb5a91 100644 (file)
@@ -9430,7 +9430,13 @@ int Client::statfs(const char *path, struct statvfs *stbuf,
 
   ceph_statfs stats;
   C_SaferCond cond;
-  objecter->get_fs_stats(stats, &cond);
+
+  const vector<int64_t> &data_pools = mdsmap->get_data_pools();
+  if (data_pools.size() == 1) {
+    objecter->get_fs_stats(stats, data_pools[0], &cond);
+  } else {
+    objecter->get_fs_stats(stats, boost::optional<int64_t>(), &cond);
+  }
 
   client_lock.Unlock();
   int rval = cond.wait();
@@ -9501,7 +9507,7 @@ int Client::statfs(const char *path, struct statvfs *stbuf,
     stbuf->f_bfree = free;
     stbuf->f_bavail = free;
   } else {
-    // General case: report the overall RADOS cluster's statistics.  Because
+    // General case: report the cluster statistics returned from RADOS. Because
     // multiple pools may be used without one filesystem namespace via
     // layouts, this is the most correct thing we can do.
     stbuf->f_blocks = stats.kb >> (CEPH_BLOCK_SHIFT - 10);
index 7131aa838acd413a646b298b5e63f61ad29801b6..904fe57c4b1df43ebe4d74855a606b63475297e0 100644 (file)
@@ -641,7 +641,8 @@ int librados::RadosClient::get_fs_stats(ceph_statfs& stats)
   int ret = 0;
 
   lock.Lock();
-  objecter->get_fs_stats(stats, new C_SafeCond(&mylock, &cond, &done, &ret));
+  objecter->get_fs_stats(stats, boost::optional<int64_t> (),
+                         new C_SafeCond(&mylock, &cond, &done, &ret));
   lock.Unlock();
 
   mylock.Lock();