This is an automated email from the ASF dual-hosted git repository.

jiahuili430 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/couchdb.git


The following commit(s) were added to refs/heads/main by this push:
     new 69bdb7e6c Replace `gen_server:format_status/2` with `format_status/1`
69bdb7e6c is described below

commit 69bdb7e6c528c48bbee1af986c5a6dddf1c94d13
Author: Jiahui Li <lijiahui...@gmail.com>
AuthorDate: Wed Sep 17 11:04:31 2025 -0500

    Replace `gen_server:format_status/2` with `format_status/1`
    
    `gen_server:format_status/2` is deprecated and will be replaced by
    `format_status(#{})`. Therefore, replaced some of them with maps.
    Also removed the `format_status/2` from couch_file.erl.
    
    Fix the following warnings:
    
    ```log
    Warning: the callback gen_server:format_status(_,_) is deprecated; use 
format_status/1 instead
    ```
    
    Related PR: https://github.com/erlang/otp/pull/4952
---
 src/couch/src/couch_file.erl                       |   6 +-
 src/couch/src/couch_util.erl                       |   6 +-
 .../src/couch_replicator_auth_session.erl          |  24 ++--
 .../src/couch_replicator_httpc_pool.erl            |  47 ++++----
 .../src/couch_replicator_scheduler.erl             |  22 ++--
 .../src/couch_replicator_scheduler_job.erl         | 122 +++++++++++----------
 .../src/couch_replicator_worker.erl                |  82 ++++++++------
 7 files changed, 175 insertions(+), 134 deletions(-)

diff --git a/src/couch/src/couch_file.erl b/src/couch/src/couch_file.erl
index 9efc7978e..3b52aa467 100644
--- a/src/couch/src/couch_file.erl
+++ b/src/couch/src/couch_file.erl
@@ -51,7 +51,7 @@
 -export([delete/2, delete/3, nuke_dir/2, init_delete_dir/1]).
 
 % gen_server callbacks
--export([init/1, terminate/2, format_status/2]).
+-export([init/1, terminate/2]).
 -export([handle_call/3, handle_cast/2, handle_info/2]).
 
 %% helper functions
@@ -621,10 +621,6 @@ handle_info({'DOWN', Ref, process, _Pid, _Info}, 
#file{db_monitor = Ref} = File)
         false -> {noreply, File}
     end.
 
-format_status(_Opt, [PDict, #file{} = File]) ->
-    {_Fd, FilePath} = couch_util:get_value(couch_file_fd, PDict),
-    [{data, [{"State", File}, {"InitialFilePath", FilePath}]}].
-
 eof(#file{fd = Fd}) ->
     file:position(Fd, eof).
 
diff --git a/src/couch/src/couch_util.erl b/src/couch/src/couch_util.erl
index 6b69c16e9..7205edd80 100644
--- a/src/couch/src/couch_util.erl
+++ b/src/couch/src/couch_util.erl
@@ -511,13 +511,15 @@ reorder_results(Keys, SortedResults, Default) ->
     Map = maps:from_list(SortedResults),
     [maps:get(Key, Map, Default) || Key <- Keys].
 
-url_strip_password(Url) ->
+url_strip_password(Url) when is_list(Url) ->
     re:replace(
         Url,
         "(http|https|socks5)://([^:]+):[^@]+@(.*)$",
         "\\1://\\2:*****@\\3",
         [{return, list}]
-    ).
+    );
+url_strip_password(Other) ->
+    Other.
 
 encode_doc_id(#doc{id = Id}) ->
     encode_doc_id(Id);
diff --git a/src/couch_replicator/src/couch_replicator_auth_session.erl 
b/src/couch_replicator/src/couch_replicator_auth_session.erl
index 8f0be0a1d..04807a58a 100644
--- a/src/couch_replicator/src/couch_replicator_auth_session.erl
+++ b/src/couch_replicator/src/couch_replicator_auth_session.erl
@@ -62,7 +62,7 @@
     handle_call/3,
     handle_cast/2,
     handle_info/2,
-    format_status/2
+    format_status/1
 ]).
 
 -include_lib("ibrowse/include/ibrowse.hrl").
@@ -154,13 +154,21 @@ handle_info(Msg, State) ->
     couch_log:error("~p : Received un-expected message ~p", [?MODULE, Msg]),
     {noreply, State}.
 
-format_status(_Opt, [_PDict, State]) ->
-    [
-        {epoch, State#state.epoch},
-        {user, State#state.user},
-        {session_url, State#state.session_url},
-        {refresh_tstamp, State#state.refresh_tstamp}
-    ].
+format_status(Status) ->
+    maps:map(
+        fun
+            (state, State) ->
+                #{
+                    epoch => State#state.epoch,
+                    user => State#state.user,
+                    session_url => State#state.session_url,
+                    refresh_tstamp => State#state.refresh_tstamp
+                };
+            (_, Value) ->
+                Value
+        end,
+        Status
+    ).
 
 %% Private helper functions
 
diff --git a/src/couch_replicator/src/couch_replicator_httpc_pool.erl 
b/src/couch_replicator/src/couch_replicator_httpc_pool.erl
index fb15dcea1..254ffd1f9 100644
--- a/src/couch_replicator/src/couch_replicator_httpc_pool.erl
+++ b/src/couch_replicator/src/couch_replicator_httpc_pool.erl
@@ -19,7 +19,7 @@
 
 % gen_server API
 -export([init/1, handle_call/3, handle_info/2, handle_cast/2]).
--export([format_status/2]).
+-export([format_status/1]).
 
 -include_lib("couch/include/couch_db.hrl").
 
@@ -135,19 +135,23 @@ handle_info({'DOWN', Ref, process, _, _}, #state{callers 
= Callers} = State) ->
             {noreply, State}
     end.
 
-format_status(_Opt, [_PDict, State]) ->
-    #state{
-        url = Url,
-        proxy_url = ProxyUrl
-    } = State,
-    [
-        {data, [
-            {"State", State#state{
-                url = couch_util:url_strip_password(Url),
-                proxy_url = couch_util:url_strip_password(ProxyUrl)
-            }}
-        ]}
-    ].
+format_status(Status) ->
+    maps:map(
+        fun
+            (state, State) ->
+                #state{
+                    url = Url,
+                    proxy_url = ProxyUrl
+                } = State,
+                State#state{
+                    url = couch_util:url_strip_password(Url),
+                    proxy_url = couch_util:url_strip_password(ProxyUrl)
+                };
+            (_, Value) ->
+                Value
+        end,
+        Status
+    ).
 
 monitor_client(Callers, Worker, {ClientPid, _}) ->
     [{Worker, erlang:monitor(process, ClientPid)} | Callers].
@@ -196,13 +200,16 @@ release_worker_internal(Worker, State) ->
 
 format_status_test_() ->
     ?_test(begin
-        State = #state{
-            url = "https://username1:password1@$ACCOUNT2.cloudant.com/db";,
-            proxy_url = "https://username2:passwo...@proxy.thing.com:8080/";
+        Status = #{
+            state =>
+                #state{
+                    url = 
"https://username1:password1@$ACCOUNT2.cloudant.com/db";,
+                    proxy_url = 
"https://username2:passwo...@proxy.thing.com:8080/";
+                }
         },
-        [{data, [{"State", ScrubbedN}]}] = format_status(normal, [[], State]),
-        ?assertEqual("https://username1:*****@$ACCOUNT2.cloudant.com/db";, 
ScrubbedN#state.url),
-        ?assertEqual("https://username2:*****@proxy.thing.com:8080/";, 
ScrubbedN#state.proxy_url),
+        #{state := State} = format_status(Status),
+        ?assertEqual("https://username1:*****@$ACCOUNT2.cloudant.com/db";, 
State#state.url),
+        ?assertEqual("https://username2:*****@proxy.thing.com:8080/";, 
State#state.proxy_url),
         ok
     end).
 
diff --git a/src/couch_replicator/src/couch_replicator_scheduler.erl 
b/src/couch_replicator/src/couch_replicator_scheduler.erl
index 379a42b38..3f9306595 100644
--- a/src/couch_replicator/src/couch_replicator_scheduler.erl
+++ b/src/couch_replicator/src/couch_replicator_scheduler.erl
@@ -25,7 +25,7 @@
     handle_call/3,
     handle_info/2,
     handle_cast/2,
-    format_status/2
+    format_status/1
 ]).
 
 -export([
@@ -357,12 +357,20 @@ terminate(_Reason, _State) ->
     couch_replicator_share:clear(),
     ok.
 
-format_status(_Opt, [_PDict, State]) ->
-    [
-        {max_jobs, State#state.max_jobs},
-        {running_jobs, running_job_count()},
-        {pending_jobs, pending_job_count()}
-    ].
+format_status(Status) ->
+    maps:map(
+        fun
+            (state, State) ->
+                #{
+                    max_jobs => State#state.max_jobs,
+                    running_jobs => running_job_count(),
+                    pending_jobs => pending_job_count()
+                };
+            (_, Value) ->
+                Value
+        end,
+        Status
+    ).
 
 %% config listener functions
 
diff --git a/src/couch_replicator/src/couch_replicator_scheduler_job.erl 
b/src/couch_replicator/src/couch_replicator_scheduler_job.erl
index 7f123441f..49f5bc01b 100644
--- a/src/couch_replicator/src/couch_replicator_scheduler_job.erl
+++ b/src/couch_replicator/src/couch_replicator_scheduler_job.erl
@@ -25,7 +25,7 @@
     handle_call/3,
     handle_info/2,
     handle_cast/2,
-    format_status/2,
+    format_status/1,
     sum_stats/2,
     report_seq_done/3
 ]).
@@ -477,38 +477,46 @@ terminate_cleanup(#rep_state{rep_details = #rep{id = 
RepId}} = State) ->
     couch_replicator_api_wrap:db_close(State#rep_state.source),
     couch_replicator_api_wrap:db_close(State#rep_state.target).
 
-format_status(_Opt, [_PDict, State]) ->
-    #rep_state{
-        source = Source,
-        target = Target,
-        rep_details = RepDetails,
-        start_seq = StartSeq,
-        source_seq = SourceSeq,
-        committed_seq = CommitedSeq,
-        current_through_seq = ThroughSeq,
-        highest_seq_done = HighestSeqDone,
-        session_id = SessionId
-    } = state_strip_creds(State),
-    #rep{
-        id = RepId,
-        options = Options,
-        doc_id = DocId,
-        db_name = DbName
-    } = RepDetails,
-    [
-        {rep_id, RepId},
-        {source, couch_replicator_api_wrap:db_uri(Source)},
-        {target, couch_replicator_api_wrap:db_uri(Target)},
-        {db_name, DbName},
-        {doc_id, DocId},
-        {options, Options},
-        {session_id, SessionId},
-        {start_seq, StartSeq},
-        {source_seq, SourceSeq},
-        {committed_seq, CommitedSeq},
-        {current_through_seq, ThroughSeq},
-        {highest_seq_done, HighestSeqDone}
-    ].
+format_status(Status) ->
+    maps:map(
+        fun
+            (state, State) ->
+                #rep_state{
+                    source = Source,
+                    target = Target,
+                    rep_details = RepDetails,
+                    start_seq = StartSeq,
+                    source_seq = SourceSeq,
+                    committed_seq = CommitedSeq,
+                    current_through_seq = ThroughSeq,
+                    highest_seq_done = HighestSeqDone,
+                    session_id = SessionId
+                } = state_strip_creds(State),
+                #rep{
+                    id = RepId,
+                    options = Options,
+                    doc_id = DocId,
+                    db_name = DbName
+                } = RepDetails,
+                #{
+                    rep_id => RepId,
+                    source => couch_replicator_api_wrap:db_uri(Source),
+                    target => couch_replicator_api_wrap:db_uri(Target),
+                    db_name => DbName,
+                    doc_id => DocId,
+                    options => Options,
+                    session_id => SessionId,
+                    start_seq => StartSeq,
+                    source_seq => SourceSeq,
+                    committed_seq => CommitedSeq,
+                    current_through_seq => ThroughSeq,
+                    highest_seq_done => HighestSeqDone
+                };
+            (_, Value) ->
+                Value
+        end,
+        Status
+    ).
 
 sum_stats(Pid, Stats) when is_pid(Pid) ->
     gen_server:cast(Pid, {sum_stats, Stats}).
@@ -1230,29 +1238,31 @@ t_scheduler_job_format_status(_) ->
         doc_id = <<"mydoc">>,
         db_name = <<"mydb">>
     },
-    State = #rep_state{
-        rep_details = Rep,
-        source = Rep#rep.source,
-        target = Rep#rep.target,
-        session_id = <<"a">>,
-        start_seq = <<"1">>,
-        source_seq = <<"2">>,
-        committed_seq = <<"3">>,
-        current_through_seq = <<"4">>,
-        highest_seq_done = <<"5">>
+    Status = #{
+        state => #rep_state{
+            rep_details = Rep,
+            source = Rep#rep.source,
+            target = Rep#rep.target,
+            session_id = <<"a">>,
+            start_seq = <<"1">>,
+            source_seq = <<"2">>,
+            committed_seq = <<"3">>,
+            current_through_seq = <<"4">>,
+            highest_seq_done = <<"5">>
+        }
     },
-    Format = format_status(opts_ignored, [pdict, State]),
-    ?assertEqual("http://h1/d1/";, proplists:get_value(source, Format)),
-    ?assertEqual("http://h2/d2/";, proplists:get_value(target, Format)),
-    ?assertEqual({"base", "+ext"}, proplists:get_value(rep_id, Format)),
-    ?assertEqual([{create_target, true}], proplists:get_value(options, 
Format)),
-    ?assertEqual(<<"mydoc">>, proplists:get_value(doc_id, Format)),
-    ?assertEqual(<<"mydb">>, proplists:get_value(db_name, Format)),
-    ?assertEqual(<<"a">>, proplists:get_value(session_id, Format)),
-    ?assertEqual(<<"1">>, proplists:get_value(start_seq, Format)),
-    ?assertEqual(<<"2">>, proplists:get_value(source_seq, Format)),
-    ?assertEqual(<<"3">>, proplists:get_value(committed_seq, Format)),
-    ?assertEqual(<<"4">>, proplists:get_value(current_through_seq, Format)),
-    ?assertEqual(<<"5">>, proplists:get_value(highest_seq_done, Format)).
+    #{state := State} = format_status(Status),
+    ?assertEqual("http://h1/d1/";, maps:get(source, State)),
+    ?assertEqual("http://h2/d2/";, maps:get(target, State)),
+    ?assertEqual({"base", "+ext"}, maps:get(rep_id, State)),
+    ?assertEqual([{create_target, true}], maps:get(options, State)),
+    ?assertEqual(<<"mydoc">>, maps:get(doc_id, State)),
+    ?assertEqual(<<"mydb">>, maps:get(db_name, State)),
+    ?assertEqual(<<"a">>, maps:get(session_id, State)),
+    ?assertEqual(<<"1">>, maps:get(start_seq, State)),
+    ?assertEqual(<<"2">>, maps:get(source_seq, State)),
+    ?assertEqual(<<"3">>, maps:get(committed_seq, State)),
+    ?assertEqual(<<"4">>, maps:get(current_through_seq, State)),
+    ?assertEqual(<<"5">>, maps:get(highest_seq_done, State)).
 
 -endif.
diff --git a/src/couch_replicator/src/couch_replicator_worker.erl 
b/src/couch_replicator/src/couch_replicator_worker.erl
index 078e6e7e0..3a6edc0b8 100644
--- a/src/couch_replicator/src/couch_replicator_worker.erl
+++ b/src/couch_replicator/src/couch_replicator_worker.erl
@@ -19,7 +19,7 @@
 % gen_server callbacks
 -export([init/1]).
 -export([handle_call/3, handle_cast/2, handle_info/2]).
--export([format_status/2]).
+-export([format_status/1]).
 
 -include_lib("couch/include/couch_db.hrl").
 -include_lib("couch_replicator/include/couch_replicator_api_wrap.hrl").
@@ -242,25 +242,33 @@ handle_info({'EXIT', _Pid, {doc_write_failed, _} = Err}, 
State) ->
 handle_info({'EXIT', Pid, Reason}, State) ->
     {stop, {process_died, Pid, Reason}, State}.
 
-format_status(_Opt, [_PDict, State]) ->
-    #state{
-        cp = MainJobPid,
-        loop = LoopPid,
-        source = Source,
-        target = Target,
-        readers = Readers,
-        pending_fetch = PendingFetch,
-        batch = #batch{size = BatchSize}
-    } = State,
-    [
-        {main_pid, MainJobPid},
-        {loop, LoopPid},
-        {source, couch_replicator_api_wrap:db_uri(Source)},
-        {target, couch_replicator_api_wrap:db_uri(Target)},
-        {num_readers, length(Readers)},
-        {pending_fetch, PendingFetch},
-        {batch_size, BatchSize}
-    ].
+format_status(Status) ->
+    maps:map(
+        fun
+            (state, State) ->
+                #state{
+                    cp = MainJobPid,
+                    loop = LoopPid,
+                    source = Source,
+                    target = Target,
+                    readers = Readers,
+                    pending_fetch = PendingFetch,
+                    batch = #batch{size = BatchSize}
+                } = State,
+                #{
+                    main_pid => MainJobPid,
+                    loop => LoopPid,
+                    source => couch_replicator_api_wrap:db_uri(Source),
+                    target => couch_replicator_api_wrap:db_uri(Target),
+                    num_readers => length(Readers),
+                    pending_fetch => PendingFetch,
+                    batch_size => BatchSize
+                };
+            (_, Value) ->
+                Value
+        end,
+        Status
+    ).
 
 sum_stats(Pid, Stats) when is_pid(Pid) ->
     ok = gen_server:cast(Pid, {sum_stats, Stats}).
@@ -733,23 +741,25 @@ maybe_report_stats(#state{} = State) ->
 -include_lib("eunit/include/eunit.hrl").
 
 replication_worker_format_status_test() ->
-    State = #state{
-        cp = self(),
-        loop = self(),
-        source = #httpdb{url = "http://u:p@h/d1"},
-        target = #httpdb{url = "http://u:p@h/d2"},
-        readers = [r1, r2, r3],
-        pending_fetch = nil,
-        batch = #batch{size = 5}
+    Status = #{
+        state => #state{
+            cp = self(),
+            loop = self(),
+            source = #httpdb{url = "http://u:p@h/d1"},
+            target = #httpdb{url = "http://u:p@h/d2"},
+            readers = [r1, r2, r3],
+            pending_fetch = nil,
+            batch = #batch{size = 5}
+        }
     },
-    Format = format_status(opts_ignored, [pdict, State]),
-    ?assertEqual(self(), proplists:get_value(main_pid, Format)),
-    ?assertEqual(self(), proplists:get_value(loop, Format)),
-    ?assertEqual("http://u:*****@h/d1";, proplists:get_value(source, Format)),
-    ?assertEqual("http://u:*****@h/d2";, proplists:get_value(target, Format)),
-    ?assertEqual(3, proplists:get_value(num_readers, Format)),
-    ?assertEqual(nil, proplists:get_value(pending_fetch, Format)),
-    ?assertEqual(5, proplists:get_value(batch_size, Format)).
+    #{state := State} = format_status(Status),
+    ?assertEqual(self(), maps:get(main_pid, State)),
+    ?assertEqual(self(), maps:get(loop, State)),
+    ?assertEqual("http://u:*****@h/d1";, maps:get(source, State)),
+    ?assertEqual("http://u:*****@h/d2";, maps:get(target, State)),
+    ?assertEqual(3, maps:get(num_readers, State)),
+    ?assertEqual(nil, maps:get(pending_fetch, State)),
+    ?assertEqual(5, maps:get(batch_size, State)).
 
 bulk_get_attempt_test() ->
     Now = erlang:monotonic_time(second),

Reply via email to