]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os/filestore: estimate omap_allocated
authorSage Weil <sage@redhat.com>
Mon, 9 Apr 2018 19:58:03 +0000 (14:58 -0500)
committerJosh Durgin <jdurgin@redhat.com>
Wed, 3 Jul 2019 00:12:00 +0000 (20:12 -0400)
Assume all of leveldb/rocksdb is omap.  This is an overestimate, but
better than nothing.

We don't populate the metadata overhead (no easy way to calculate this
that comes to mind).  And we don't populate the compression-related
fields.  It's possible we could make something up here in the VDO
case...

Signed-off-by: Sage Weil <sage@redhat.com>
(cherry picked from commit 186edca81ef09058b9c121967ab1850fbb5812b6)

src/os/filestore/FileStore.cc

index d3a4259c84dd113f5938f49d55a252e919731b08..e49724e319ba54e735bc25a2896fd2704cbdb559 100644 (file)
@@ -745,15 +745,29 @@ int FileStore::statfs(struct store_statfs_t *buf0)
   }
 
   uint64_t bfree = buf.f_bavail * buf.f_bsize;
+
+  // assume all of leveldb/rocksdb is omap.
+  {
+    map<string,uint64_t> kv_usage;
+    buf0->omap_allocated += object_map->get_db()->get_estimated_size(kv_usage);
+  }
+
   uint64_t thin_total, thin_avail;
   if (get_vdo_utilization(vdo_fd, &thin_total, &thin_avail)) {
     buf0->total = thin_total;
     bfree = std::min(bfree, thin_avail);
+    buf0->allocated = thin_total - thin_avail;
+    buf0->data_stored = bfree;
   } else {
     buf0->total = buf.f_blocks * buf.f_bsize;
+    buf0->allocated = bfree;
+    buf0->data_stored = bfree;
   }
   buf0->available = bfree;
 
+  // FIXME: we don't know how to populate buf->internal_metadata; XFS doesn't
+  // tell us what its internal overhead is.
+
   // Adjust for writes pending in the journal
   if (journal) {
     uint64_t estimate = journal->get_journal_size_estimate();
@@ -762,6 +776,7 @@ int FileStore::statfs(struct store_statfs_t *buf0)
     else
       buf0->available = 0;
   }
+
   return 0;
 }