]> git.apps.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)
committerSage Weil <sage@redhat.com>
Wed, 15 Aug 2018 22:18:43 +0000 (17:18 -0500)
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>
src/os/filestore/FileStore.cc

index 133ab5e7e1aadbfcd3a7f3c16446781013f52762..9485b1740adbfd69d0d6e4ff492bf6ba12a03eac 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;
 }