virtual void get_db_statistics(Formatter *f) { }
virtual void generate_db_histogram(Formatter *f) { }
- virtual int flush_cache() { return 0; }
+ virtual int flush_cache(ostream *os = NULL) { 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.
-int BlueStore::flush_cache()
+int BlueStore::flush_cache(ostream *os)
{
dout(10) << __func__ << dendl;
for (auto i : cache_shards) {
void get_db_statistics(Formatter *f) override;
void generate_db_histogram(Formatter *f) override;
void _flush_cache();
- int flush_cache() override;
+ int flush_cache(ostream *os = NULL) 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()
+int FileStore::flush_cache(ostream *os)
{
string drop_caches_file = "/proc/sys/vm/drop_caches";
- int drop_caches_fd = ::open(drop_caches_file.c_str(), O_WRONLY), ret = 0;
+ int drop_caches_fd = ::open(drop_caches_file.c_str(), O_WRONLY|O_CLOEXEC), ret = 0;
char buf[2] = "3";
- int len = strlen(buf);
+ size_t len = strlen(buf);
if (drop_caches_fd < 0) {
ret = -errno;
derr << __FUNC__ << ": failed to open " << drop_caches_file << ": " << cpp_strerror(ret) << dendl;
+ if (os) {
+ *os << "FileStore flush_cache: failed to open " << drop_caches_file << ": " << cpp_strerror(ret);
+ }
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;
+ if (os) {
+ *os << "FileStore flush_cache: failed to write to " << drop_caches_file << ": " << cpp_strerror(ret);
+ }
goto out;
}
f->close_section();
}
- int flush_cache() override;
+ int flush_cache(ostream *os = NULL) override;
int write_version_stamp();
int version_stamp_is_valid(uint32_t *version);
int update_version_stamp();
} else if (admin_command == "calc_objectstore_db_histogram") {
store->generate_db_histogram(f);
} else if (admin_command == "flush_store_cache") {
- store->flush_cache();
+ store->flush_cache(&ss);
} else if (admin_command == "dump_pgstate_history") {
f->open_object_section("pgstate_history");
vector<PGRef> pgs;
COMMAND("smart name=devid,type=CephString,req=False",
"runs smartctl on this osd devices. ",
"osd", "rw", "cli,rest")
-COMMAND("clear_cache",
- "Clear OSD caches",
+COMMAND("drop cache",
+ "Drop all OSD caches",
"osd", "rw", "cli,rest")
COMMAND("get_cache_object_count",
"Get OSD caches object count",
probe_smart(devid, ds);
}
- else if (prefix == "clear_cache") {
+ else if (prefix == "drop cache") {
dout(20) << "clearing all caches" << dendl;
// Clear the objectstore's cache - onode and buffer for Bluestore,
// system's pagecache for Filestore
- r = store->flush_cache();
+ r = store->flush_cache(&ss);
if (r < 0) {
ds << "Error flushing objectstore cache: " << cpp_strerror(r);
goto out;