virtual void get_db_statistics(Formatter *f) { }
virtual void generate_db_histogram(Formatter *f) { }
- virtual void flush_cache() { }
+ virtual int flush_cache() { return 0; }
virtual void dump_perf_counters(Formatter *f) {}
virtual int get_cache_obj_count() {
return -1;
// We use a best-effort policy instead, e.g.,
// we don't care if there are still some pinned onodes/data in the cache
// after this command is completed.
-void BlueStore::flush_cache()
+int BlueStore::flush_cache()
{
dout(10) << __func__ << dendl;
for (auto i : cache_shards) {
i->trim_all();
}
+
+ return 0;
}
void BlueStore::_apply_padding(uint64_t head_pad,
void get_db_statistics(Formatter *f) override;
void generate_db_histogram(Formatter *f) override;
void _flush_cache();
- void flush_cache() override;
+ int flush_cache() override;
void dump_perf_counters(Formatter *f) override {
f->open_object_section("perf_counters");
logger->dump_formatted(f, false);
return 0;
}
+int FileStore::flush_cache()
+{
+ string drop_caches_file = "/proc/sys/vm/drop_caches";
+ int drop_caches_fd = ::open(drop_caches_file.c_str(), O_WRONLY), ret = 0;
+ char buf[2] = "3";
+ int len = strlen(buf);
+
+ if (drop_caches_fd < 0) {
+ ret = -errno;
+ derr << __FUNC__ << ": failed to open " << drop_caches_file << ": " << cpp_strerror(ret) << dendl;
+ return ret;
+ }
+
+ if (::write(drop_caches_fd, buf, len) < 0) {
+ ret = -errno;
+ derr << __FUNC__ << ": failed to write to " << drop_caches_file << ": " << cpp_strerror(ret) << dendl;
+ goto out;
+ }
+
+out:
+ ::close(drop_caches_fd);
+ return ret;
+}
+
int FileStore::write_version_stamp()
{
dout(1) << __FUNC__ << ": " << target_version << dendl;
f->close_section();
}
+ int flush_cache() override;
int write_version_stamp();
int version_stamp_is_valid(uint32_t *version);
int update_version_stamp();
else if (prefix == "clear_cache") {
dout(20) << "clearing all caches" << dendl;
- // Clear the objectstore's cache
- store->flush_cache();
+ // Clear the objectstore's cache - onode and buffer for Bluestore,
+ // system's pagecache for Filestore
+ r = store->flush_cache();
+ if (r < 0) {
+ ds << "Error flushing objectstore cache: " << cpp_strerror(r);
+ goto out;
+ }
// Clear osd map cache
{
Mutex::Locker l(service.map_cache_lock);