]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
ObjctStore: More accurate disk space usage calculation when considering 'whiteout...
authorIgor Fedotov <ifedotov@mirantis.com>
Mon, 21 Mar 2016 12:51:24 +0000 (15:51 +0300)
committerBoris Ranto <branto@redhat.com>
Fri, 6 May 2016 11:44:18 +0000 (13:44 +0200)
This also adds cache protection against potential overflow with removed objects

Signed-off-by: Igor Fedotov <ifedotov@mirantis.com>
src/os/ObjectStore.h
src/os/bluestore/BlueStore.h
src/os/filestore/FileStore.cc
src/os/filestore/FileStore.h
src/os/kstore/KStore.h
src/os/memstore/MemStore.h
src/osd/ReplicatedPG.cc

index 93ae4bb4a348e8af54b4881ee13e508283b5b262..aacf642d546cad8eed9f826736cd2042586b670e 100644 (file)
@@ -2406,6 +2406,12 @@ public:
   virtual void set_fsid(uuid_d u) = 0;
   virtual uuid_d get_fsid() = 0;
 
+  /**
+  * Estimates additional disk space used by the specified amount of objects and caused by file allocation granularity and metadata store
+  * - num objects - total (including witeouts) object count to measure used space for.
+  */
+  virtual uint64_t estimate_objects_overhead(uint64_t num_objects) = 0;
+
   // DEBUG
   virtual void inject_data_error(const ghobject_t &oid) {}
   virtual void inject_mdata_error(const ghobject_t &oid) {}
index ba0fa06a4f7fa7e02df65d2ee9d19a72f211083b..1e4ad0189f26a207c0be2e14b19a99b706e756c1 100644 (file)
@@ -830,6 +830,10 @@ public:
     return fsid;
   }
 
+  uint64_t estimate_objects_overhead(uint64_t num_objects) override { 
+    return num_objects * 300; //assuming per-object overhead is 300 bytes
+  }
+
   objectstore_perf_stat_t get_cur_stats() override {
     return objectstore_perf_stat_t();
   }
index a3e6532dd1835181e5842c307075688f1b2688a4..deebd20245db48988402ff3a36a2b6da9b0a77b4 100644 (file)
@@ -5728,6 +5728,12 @@ void FileStore::set_xattr_limits_via_conf()
   }
 }
 
+uint64_t FileStore::estimate_objects_overhead(uint64_t num_objects)
+{
+  uint64_t res = num_objects * blk_size / 2; //assumes that each object uses ( in average ) additional 1/2 block due to FS allocation granularity.
+  return res;
+}
+
 // -- FSSuperblock --
 
 void FSSuperblock::encode(bufferlist &bl) const
index a5cd75d5e5304145701cd3030cd14eba24b19e1e..b81dd0db548f045bb3d4fbb87c8026314d9882b1 100644 (file)
@@ -587,6 +587,8 @@ public:
     fsid = u;
   }
   uuid_d get_fsid() { return fsid; }
+  
+  uint64_t estimate_objects_overhead(uint64_t num_objects);
 
   // DEBUG read error injection, an object is removed from both on delete()
   Mutex read_error_lock;
index 0df45d462aae4b88ab65eecc5b59b4f44dd94f54..87d8da2d9827d6e2cb3e4ac6b3700595da0b40fd 100644 (file)
@@ -522,6 +522,10 @@ public:
     return fsid;
   }
 
+  uint64_t estimate_objects_overhead(uint64_t num_objects) override {
+    return num_objects * 300; //assuming per-object overhead is 300 bytes
+  }
+
   objectstore_perf_stat_t get_cur_stats() {
     return objectstore_perf_stat_t();
   }
index 64f9afc16fae5a3c5d928b11f8ea34d9398bf955..545cae21a97d9009cc7be58b586250f3de3b2652 100644 (file)
@@ -485,6 +485,10 @@ public:
   void set_fsid(uuid_d u);
   uuid_d get_fsid();
 
+  uint64_t estimate_objects_overhead(uint64_t num_objects) override {
+    return 0; //do not care
+  }
+
   objectstore_perf_stat_t get_cur_stats();
 
   int queue_transactions(
index fae449a97dfda67cf582ebd8de5648be96131c82..275f4a415dce0bd6e5401aa865b83709a6b7316d 100644 (file)
@@ -12314,6 +12314,8 @@ bool ReplicatedPG::agent_choose_mode(bool restart, OpRequestRef op)
   uint64_t num_user_bytes = info.stats.stats.sum.num_bytes;
   uint64_t unflushable_bytes = info.stats.stats.sum.num_bytes_hit_set_archive;
   num_user_bytes -= unflushable_bytes;
+  uint64_t num_overhead_bytes = osd->store->estimate_objects_overhead(num_user_objects);
+  num_user_bytes += num_overhead_bytes;
 
   // also reduce the num_dirty by num_objects_omap
   int64_t num_dirty = info.stats.stats.sum.num_objects_dirty;
@@ -12336,6 +12338,7 @@ bool ReplicatedPG::agent_choose_mode(bool restart, OpRequestRef op)
           << " num_dirty: " << num_dirty
           << " num_user_objects: " << num_user_objects
           << " num_user_bytes: " << num_user_bytes
+          << " num_overhead_bytes: " << num_overhead_bytes
           << " pool.info.target_max_bytes: " << pool.info.target_max_bytes
           << " pool.info.target_max_objects: " << pool.info.target_max_objects
           << dendl;