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 <[email protected]>
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",

Reply via email to