Option("mds_cache_trim_interval", Option::TYPE_SECS, Option::LEVEL_ADVANCED)
.set_default(1)
- .set_description("interval in seconds between cache trimming"),
+ .set_description("interval in seconds between cache trimming")
+ .set_flag(Option::FLAG_RUNTIME),
+
+ Option("mds_cache_release_free_interval", Option::TYPE_SECS, Option::LEVEL_DEV)
+ .set_default(10)
+ .set_description("interval in seconds between heap releases")
+ .set_flag(Option::FLAG_RUNTIME),
Option("mds_cache_size", Option::TYPE_INT, Option::LEVEL_ADVANCED)
.set_default(0)
while (!upkeep_trim_shutdown.load()) {
auto now = clock::now();
auto since = now-upkeep_last_trim;
- auto interval = clock::duration(g_conf().get_val<std::chrono::seconds>("mds_cache_trim_interval"));
- if (since >= interval*.90) {
+ auto trim_interval = clock::duration(g_conf().get_val<std::chrono::seconds>("mds_cache_trim_interval"));
+ if (since >= trim_interval*.90) {
lock.unlock(); /* mds_lock -> upkeep_mutex */
std::scoped_lock mds_lock(mds->mds_lock);
lock.lock();
check_memory_usage();
auto flags = Server::RecallFlags::ENFORCE_MAX|Server::RecallFlags::ENFORCE_LIVENESS;
mds->server->recall_client_state(nullptr, flags);
- upkeep_last_trim = clock::now();
+ upkeep_last_trim = now = clock::now();
} else {
dout(10) << "cache not ready for trimming" << dendl;
}
} else {
- interval -= since;
+ trim_interval -= since;
+ }
+ since = now-upkeep_last_release;
+ auto release_interval = clock::duration(g_conf().get_val<std::chrono::seconds>("mds_cache_release_free_interval"));
+ if (since >= release_interval) {
+ /* XXX not necessary once MDCache uses PriorityCache */
+ dout(10) << "releasing free memory" << dendl;
+ ceph_heap_release_free_memory();
+ upkeep_last_release = clock::now();
+ } else {
+ release_interval -= since;
}
+ auto interval = std::min(release_interval, trim_interval);
dout(20) << "upkeep thread waiting interval " << interval << dendl;
upkeep_cvar.wait_for(lock, interval);
}
ceph::mutex upkeep_mutex = ceph::make_mutex("MDCache::upkeep_mutex");
ceph::condition_variable upkeep_cvar;
time upkeep_last_trim = time::min();
+ time upkeep_last_release = time::min();
std::atomic<bool> upkeep_trim_shutdown{false};
};