You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by va...@apache.org on 2026/05/27 18:52:35 UTC
(couchdb) 01/01: Fix leaked opened db handle in smoosh
This is an automated email from the ASF dual-hosted git repository.
nickva pushed a commit to branch fix-smoosh-db-handle-leaking
in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit 854b62b09227038190e6b927fb004aa729c47175
Author: Nick Vatamaniuc <va...@gmail.com>
AuthorDate: Wed May 27 14:48:47 2026 -0400
Fix leaked opened db handle in smoosh
`smoosh_channel:maybe_remonitor_cpid/3` opened db and never closed it. That
left a dangling reference (monitor to it) which prevented that db handle from
becoming idle.
We noticed this after inspecting dangling deleted fd handles which were still
left open by something. That something turned to be smoosh_channel gen_server.
---
src/smoosh/src/smoosh_channel.erl | 38 +++++++++++++++++++++-----------------
1 file changed, 21 insertions(+), 17 deletions(-)
diff --git a/src/smoosh/src/smoosh_channel.erl b/src/smoosh/src/smoosh_channel.erl
index eabb751ad..3621ec7f7 100644
--- a/src/smoosh/src/smoosh_channel.erl
+++ b/src/smoosh/src/smoosh_channel.erl
@@ -390,27 +390,31 @@ maybe_remonitor_cpid(#state{} = State, DbName, Reason) when is_binary(DbName) ->
#state{name = Name, active = Active} = State,
case couch_db:open_int(DbName, []) of
{ok, Db} ->
- try couch_db:get_compactor_pid_sync(Db) of
- nil ->
- LogMsg = "~s : exit for compaction of ~p: ~p",
- LogArgs = [Name, smoosh_utils:stringify(DbName), Reason],
- couch_log:warning(LogMsg, LogArgs),
- re_enqueue(DbName),
- State;
- CPid when is_pid(CPid) ->
- monitor(process, CPid),
- Level = smoosh_utils:log_level("compaction_log_level", "notice"),
- LogMsg = "~s: ~s compaction already running. Re-monitor Pid ~p",
- LogArgs = [Name, smoosh_utils:stringify(DbName), CPid],
- couch_log:Level(LogMsg, LogArgs),
- State#state{active = Active#{DbName => CPid}}
+ try
+ case couch_db:get_compactor_pid_sync(Db) of
+ nil ->
+ LogMsg = "~s : exit for compaction of ~p: ~p",
+ LogArgs = [Name, smoosh_utils:stringify(DbName), Reason],
+ couch_log:warning(LogMsg, LogArgs),
+ re_enqueue(DbName),
+ State;
+ CPid when is_pid(CPid) ->
+ monitor(process, CPid),
+ Level = smoosh_utils:log_level("compaction_log_level", "notice"),
+ LogMsg = "~s: ~s compaction already running. Re-monitor Pid ~p",
+ LogArgs = [Name, smoosh_utils:stringify(DbName), CPid],
+ couch_log:Level(LogMsg, LogArgs),
+ State#state{active = Active#{DbName => CPid}}
+ end
catch
_:Error ->
- LogMsg = "~s: error remonitoring db compaction ~p error:~p",
- LogArgs = [Name, smoosh_utils:stringify(DbName), Error],
- couch_log:warning(LogMsg, LogArgs),
+ ErrLogMsg = "~s: error remonitoring db compaction ~p error:~p",
+ ErrLogArgs = [Name, smoosh_utils:stringify(DbName), Error],
+ couch_log:warning(ErrLogMsg, ErrLogArgs),
re_enqueue(DbName),
State
+ after
+ couch_db:close(Db)
end;
Error = {not_found, no_db_file} ->
LogMsg = "~s : exit for compaction of ~p: ~p",