diff options
author | Akilesh Kailash <akailash@google.com> | 2021-04-02 05:13:11 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2021-04-02 05:13:11 +0000 |
commit | ef8d3c39b51fbbca96704a12847a5c1b4172b66f (patch) | |
tree | 797ba7169360aa373f6d4b2271937b747b9bd9fa | |
parent | 6463f60a56c8109c8cdad8362b5745391e2cf64a (diff) | |
parent | e722a1b169302cec30fd7e7c70990ce7232309ee (diff) |
Merge "libsnapshot:snapuserd: Fix memory leak"
-rw-r--r-- | fs_mgr/libsnapshot/snapuserd.h | 1 | ||||
-rw-r--r-- | fs_mgr/libsnapshot/snapuserd_server.cpp | 8 | ||||
-rw-r--r-- | fs_mgr/libsnapshot/snapuserd_server.h | 10 |
3 files changed, 17 insertions, 2 deletions
diff --git a/fs_mgr/libsnapshot/snapuserd.h b/fs_mgr/libsnapshot/snapuserd.h index 933536442..87c552824 100644 --- a/fs_mgr/libsnapshot/snapuserd.h +++ b/fs_mgr/libsnapshot/snapuserd.h @@ -158,6 +158,7 @@ class Snapuserd : public std::enable_shared_from_this<Snapuserd> { bool CommitMerge(int num_merge_ops); void CloseFds() { cow_fd_ = {}; } + void FreeResources() { worker_threads_.clear(); } size_t GetMetadataAreaSize() { return vec_.size(); } void* GetExceptionBuffer(size_t i) { return vec_[i].get(); } diff --git a/fs_mgr/libsnapshot/snapuserd_server.cpp b/fs_mgr/libsnapshot/snapuserd_server.cpp index 167895e8e..64332d191 100644 --- a/fs_mgr/libsnapshot/snapuserd_server.cpp +++ b/fs_mgr/libsnapshot/snapuserd_server.cpp @@ -219,7 +219,13 @@ void SnapuserdServer::RunThread(std::shared_ptr<DmUserHandler> handler) { auto iter = FindHandler(&lock, handler->misc_name()); if (iter == dm_users_.end()) { // RemoveAndJoinHandler() already removed us from the list, and is - // now waiting on a join(), so just return. + // now waiting on a join(), so just return. Additionally, release + // all the resources held by snapuserd object which are shared + // by worker threads. This should be done when the last reference + // of "handler" is released; but we will explicitly release here + // to make sure snapuserd object is freed as it is the biggest + // consumer of memory in the daemon. + handler->FreeResources(); LOG(INFO) << "Exiting handler thread to allow for join: " << misc_name; return; } diff --git a/fs_mgr/libsnapshot/snapuserd_server.h b/fs_mgr/libsnapshot/snapuserd_server.h index e9d575d01..6699189ea 100644 --- a/fs_mgr/libsnapshot/snapuserd_server.h +++ b/fs_mgr/libsnapshot/snapuserd_server.h @@ -49,7 +49,15 @@ class DmUserHandler { public: explicit DmUserHandler(std::shared_ptr<Snapuserd> snapuserd); - void FreeResources() { snapuserd_ = nullptr; } + void FreeResources() { + // Each worker thread holds a reference to snapuserd. + // Clear them so that all the resources + // held by snapuserd is released + if (snapuserd_) { + snapuserd_->FreeResources(); + snapuserd_ = nullptr; + } + } const std::shared_ptr<Snapuserd>& snapuserd() const { return snapuserd_; } std::thread& thread() { return thread_; } |