"Dump internal statistics for bluefs."
"");
ceph_assert(r == 0);
+ r = admin_socket->register_command("bluefs stats reset",
+ hook,
+ "Reset maximum historical value for bluefs statistics."
+ "");
+ ceph_assert(r == 0);
r = admin_socket->register_command("bluefs files list", hook,
"print files in bluefs");
ceph_assert(r == 0);
bluefs->dump_block_extents(ss);
bluefs->dump_volume_selector(ss);
out.append(ss);
+ } else if (command == "bluefs stats reset") {
+ std::stringstream ss;
+ bluefs->reset_volume_selector(ss);
+ out.append(ss);
} else if (command == "bluefs files list") {
const char* devnames[3] = {"wal","db","slow"};
std::lock_guard l(bluefs->nodes.lock);
return reinterpret_cast<void*>(res);
}
+void RocksDBBlueFSVolumeSelector::reset_history(ostream& sout) {
+ per_level_per_dev_max.clear();
+ sout << "Reset done." << std::endl;
+}
+
void RocksDBBlueFSVolumeSelector::dump(ostream& sout) {
auto max_x = per_level_per_dev_usage.get_max_x();
auto max_y = per_level_per_dev_usage.get_max_y();
*/
virtual void dump(std::ostream& sout) = 0;
+ /**
+ * Reset VSelector's historic state
+ *
+ */
+ virtual void reset_history(std::ostream& sout) = 0;
+
/* used for sanity checking of vselector */
virtual BlueFSVolumeSelector* clone_empty() const { return nullptr; }
virtual bool compare(BlueFSVolumeSelector* other) { return true; };
ceph_assert(vselector);
vselector->dump(sout);
}
+ void reset_volume_selector(std::ostream& sout) {
+ ceph_assert(vselector);
+ vselector->reset_history(sout);
+ }
void update_volume_selector_from_config() {
ceph_assert(vselector);
vselector->update_from_config(cct);
uint8_t select_prefer_bdev(void* hint) override;
void get_paths(const std::string& base, paths& res) const override;
void dump(std::ostream& sout) override;
+
+ void reset_history(std::ostream& sout) override {
+ // do nothing
+ return;
+ }
};
class FitToFastVolumeSelector : public OriginalVolumeSelector {
return values[x][y];
}
+ const T& at(size_t x, size_t y) const {
+ ceph_assert(x < MaxX);
+ ceph_assert(y < MaxY);
+
+ return values[x][y];
+ }
size_t get_max_x() const {
return MaxX;
}
}
void* get_hint_by_dir(std::string_view dirname) const override;
+ // intended primarily for UT
+ uint64_t get_max_db_total() const {
+ return per_level_per_dev_max.at(BlueFS::BDEV_DB, per_level_per_dev_usage.get_max_y() - 1);
+ }
+
void add_usage(void* hint, const bluefs_extent_t& extent) override {
if (hint == nullptr)
return;
const std::string& base,
BlueFSVolumeSelector::paths& res) const override;
+ void reset_history(std::ostream& sout) override;
void dump(std::ostream& sout) override;
BlueFSVolumeSelector* clone_empty() const override;
bool compare(BlueFSVolumeSelector* other) override;
}
ASSERT_EQ(2, selector.select_prefer_bdev((void*)slow_bdev));
-
- std::stringstream ss;
- selector.dump(ss);
- std::cout << ss.str() << std::endl;
+ {
+ std::stringstream ss;
+ selector.dump(ss);
+ std::cout << ss.str() << std::endl;
+ }
+ {
+ std::stringstream ss;
+ ASSERT_NE(0, selector.get_max_db_total());
+ selector.reset_history(ss);
+ ASSERT_EQ(0, selector.get_max_db_total());
+ selector.dump(ss);
+ std::cout << ss.str() << std::endl;
+ }
}
int main(int argc, char **argv) {