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

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

commit f2082aa9315d09409193558f05230b85cab0ec26
Author: Robert Newson <[email protected]>
AuthorDate: Mon Jan 27 17:12:14 2025 +0000

    couch_ra app
---
 rebar.config.script                                |  1 +
 rel/reltool.config                                 |  2 ++
 src/chttpd/src/chttpd.app.src                      |  1 +
 src/chttpd/src/chttpd_app.erl                      | 40 ----------------------
 .../src/couch_ra.app.src}                          | 14 +++-----
 .../fabric.app.src => couch_ra/src/couch_ra.erl}   | 25 +++++---------
 .../src/couch_ra_app.erl}                          | 39 ++++++++-------------
 .../src/couch_ra_sup.erl}                          | 28 +++++++--------
 src/fabric/src/fabric.app.src                      |  1 -
 src/fabric/src/fabric_doc_update.erl               | 12 +++++--
 src/mem3/src/mem3_sup.erl                          |  1 +
 11 files changed, 54 insertions(+), 110 deletions(-)

diff --git a/rebar.config.script b/rebar.config.script
index ad61a72cd..690ff52f7 100644
--- a/rebar.config.script
+++ b/rebar.config.script
@@ -131,6 +131,7 @@ SubDirs = [
     "src/couch_peruser",
     "src/couch_tests",
     "src/couch_dist",
+    "src/couch_ra",
     "src/custodian",
     "src/ddoc_cache",
     "src/dreyfus",
diff --git a/rel/reltool.config b/rel/reltool.config
index 4aa07e713..20bf5b3a0 100644
--- a/rel/reltool.config
+++ b/rel/reltool.config
@@ -42,6 +42,7 @@
         couch_event,
         couch_peruser,
         couch_dist,
+        couch_ra,
         custodian,
         ddoc_cache,
         dreyfus,
@@ -109,6 +110,7 @@
     {app, couch_event, [{incl_cond, include}]},
     {app, couch_peruser, [{incl_cond, include}]},
     {app, couch_dist ,[{incl_cond, include}]},
+    {app, couch_ra, [{incl_cond, include}]},
     {app, custodian, [{incl_cond, include}]},
     {app, ddoc_cache, [{incl_cond, include}]},
     {app, dreyfus, [{incl_cond, include}]},
diff --git a/src/chttpd/src/chttpd.app.src b/src/chttpd/src/chttpd.app.src
index d48f02b97..a0770c090 100644
--- a/src/chttpd/src/chttpd.app.src
+++ b/src/chttpd/src/chttpd.app.src
@@ -28,6 +28,7 @@
         couch,
         ets_lru,
         fabric,
+        couch_ra,
         ioq
     ]},
     {mod, {chttpd_app, []}}
diff --git a/src/chttpd/src/chttpd_app.erl b/src/chttpd/src/chttpd_app.erl
index 8f1c2c78e..d7a5aef86 100644
--- a/src/chttpd/src/chttpd_app.erl
+++ b/src/chttpd/src/chttpd_app.erl
@@ -14,48 +14,8 @@
 -behaviour(application).
 -export([start/2, stop/1]).
 
-% temp location
--export([couch_write_queue_name/1]).
-
 start(_Type, StartArgs) ->
-    start_ra(),
     chttpd_sup:start_link(StartArgs).
 
 stop(_State) ->
     ok.
-
-start_ra() ->
-    %% ensure Ra logs reach couch.log
-    logger:add_handler(couch_log, couch_logger_handler, #{}),
-
-    %% start Ra
-    RaEnv = [
-        {data_dir, config:get("couchdb", "ra_data_dir")}
-    ],
-    ra:start(RaEnv),
-
-    %% create Ra clusters for ordering doc writes
-    [start_cluster(Nodes) || Nodes <- combinations(3, mem3:nodes())].
-
-start_cluster(Nodes) ->
-    Name = couch_write_queue_name(Nodes),
-    ra:start_cluster(
-        default,
-        Name,
-        {module, couch_write_queue, #{}},
-        [{Name, N} || N <- Nodes]
-    ).
-
-couch_write_queue_name(Nodes) ->
-    list_to_atom(
-        "couch_write_queue_" ++
-            lists:flatten(lists:join("_", [atom_to_list(N) || N <- 
lists:sort(Nodes)]))
-    ).
-
-%% https://rosettacode.org/wiki/Combinations#Erlang
-combinations(0, _Nodes) ->
-    [[]];
-combinations(_, []) ->
-    [];
-combinations(N, [Node | Rest]) ->
-    [[Node | List] || List <- combinations(N - 1, Rest)] ++ combinations(N, 
Rest).
diff --git a/src/fabric/src/fabric.app.src b/src/couch_ra/src/couch_ra.app.src
similarity index 77%
copy from src/fabric/src/fabric.app.src
copy to src/couch_ra/src/couch_ra.app.src
index e9fd0333c..c11b3db81 100644
--- a/src/fabric/src/fabric.app.src
+++ b/src/couch_ra/src/couch_ra.app.src
@@ -10,19 +10,15 @@
 % License for the specific language governing permissions and limitations under
 % the License.
 
-{application, fabric, [
-    {description, "Routing and proxying layer for CouchDB cluster"},
+{application, couch_ra, [
+    {description, "CouchDB Ra"},
     {vsn, git},
-    {registered, []},
+    {mod, {couch_ra_app, []}},
     {applications, [
         kernel,
         stdlib,
-        config,
-        couch,
-        ra,
-        rexi,
-        mem3,
         couch_log,
-        couch_stats
+        mem3,
+        config
     ]}
 ]}.
diff --git a/src/fabric/src/fabric.app.src b/src/couch_ra/src/couch_ra.erl
similarity index 64%
copy from src/fabric/src/fabric.app.src
copy to src/couch_ra/src/couch_ra.erl
index e9fd0333c..2157c5324 100644
--- a/src/fabric/src/fabric.app.src
+++ b/src/couch_ra/src/couch_ra.erl
@@ -10,19 +10,12 @@
 % License for the specific language governing permissions and limitations under
 % the License.
 
-{application, fabric, [
-    {description, "Routing and proxying layer for CouchDB cluster"},
-    {vsn, git},
-    {registered, []},
-    {applications, [
-        kernel,
-        stdlib,
-        config,
-        couch,
-        ra,
-        rexi,
-        mem3,
-        couch_log,
-        couch_stats
-    ]}
-]}.
+-module(couch_ra).
+
+-export([couch_write_queue_name/1]).
+
+couch_write_queue_name(Nodes) ->
+    list_to_atom(
+        "couch_write_queue_" ++
+            lists:flatten(lists:join("_", [atom_to_list(N) || N <- 
lists:sort(Nodes)]))
+    ).
diff --git a/src/chttpd/src/chttpd_app.erl b/src/couch_ra/src/couch_ra_app.erl
similarity index 66%
copy from src/chttpd/src/chttpd_app.erl
copy to src/couch_ra/src/couch_ra_app.erl
index 8f1c2c78e..36efeefa5 100644
--- a/src/chttpd/src/chttpd_app.erl
+++ b/src/couch_ra/src/couch_ra_app.erl
@@ -1,57 +1,43 @@
 % Licensed under the Apache License, Version 2.0 (the "License"); you may not
-% use this file except in compliance with the License.  You may obtain a copy 
of
+% use this file except in compliance with the License. You may obtain a copy of
 % the License at
 %
 %   http://www.apache.org/licenses/LICENSE-2.0
 %
 % Unless required by applicable law or agreed to in writing, software
 % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 % License for the specific language governing permissions and limitations under
 % the License.
 
--module(chttpd_app).
+-module(couch_ra_app).
 -behaviour(application).
 -export([start/2, stop/1]).
 
-% temp location
--export([couch_write_queue_name/1]).
-
-start(_Type, StartArgs) ->
-    start_ra(),
-    chttpd_sup:start_link(StartArgs).
-
-stop(_State) ->
-    ok.
-
-start_ra() ->
+start(_Type, []) ->
     %% ensure Ra logs reach couch.log
     logger:add_handler(couch_log, couch_logger_handler, #{}),
 
     %% start Ra
     RaEnv = [
-        {data_dir, config:get("couchdb", "ra_data_dir")}
-    ],
+             {data_dir, config:get("couchdb", "ra_data_dir")}
+            ],
     ra:start(RaEnv),
 
     %% create Ra clusters for ordering doc writes
-    [start_cluster(Nodes) || Nodes <- combinations(3, mem3:nodes())].
+    [start_cluster(Nodes) || Nodes <- combinations(3, mem3:nodes())],
+
+    couch_ra_sup:start_link().
 
 start_cluster(Nodes) ->
-    Name = couch_write_queue_name(Nodes),
+    Name = couch_ra:couch_write_queue_name(Nodes),
     ra:start_cluster(
-        default,
+        couchdb,
         Name,
         {module, couch_write_queue, #{}},
         [{Name, N} || N <- Nodes]
     ).
 
-couch_write_queue_name(Nodes) ->
-    list_to_atom(
-        "couch_write_queue_" ++
-            lists:flatten(lists:join("_", [atom_to_list(N) || N <- 
lists:sort(Nodes)]))
-    ).
-
 %% https://rosettacode.org/wiki/Combinations#Erlang
 combinations(0, _Nodes) ->
     [[]];
@@ -59,3 +45,6 @@ combinations(_, []) ->
     [];
 combinations(N, [Node | Rest]) ->
     [[Node | List] || List <- combinations(N - 1, Rest)] ++ combinations(N, 
Rest).
+
+stop([]) ->
+    ok.
diff --git a/src/fabric/src/fabric.app.src b/src/couch_ra/src/couch_ra_sup.erl
similarity index 64%
copy from src/fabric/src/fabric.app.src
copy to src/couch_ra/src/couch_ra_sup.erl
index e9fd0333c..69215a7eb 100644
--- a/src/fabric/src/fabric.app.src
+++ b/src/couch_ra/src/couch_ra_sup.erl
@@ -10,19 +10,15 @@
 % License for the specific language governing permissions and limitations under
 % the License.
 
-{application, fabric, [
-    {description, "Routing and proxying layer for CouchDB cluster"},
-    {vsn, git},
-    {registered, []},
-    {applications, [
-        kernel,
-        stdlib,
-        config,
-        couch,
-        ra,
-        rexi,
-        mem3,
-        couch_log,
-        couch_stats
-    ]}
-]}.
+-module(couch_ra_sup).
+
+-behaviour(supervisor).
+
+-export([init/1]).
+-export([start_link/0]).
+
+start_link() ->
+    supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+init([]) ->
+    {ok, {{one_for_one, 10, 10}, []}}.
diff --git a/src/fabric/src/fabric.app.src b/src/fabric/src/fabric.app.src
index e9fd0333c..d7686ca1a 100644
--- a/src/fabric/src/fabric.app.src
+++ b/src/fabric/src/fabric.app.src
@@ -19,7 +19,6 @@
         stdlib,
         config,
         couch,
-        ra,
         rexi,
         mem3,
         couch_log,
diff --git a/src/fabric/src/fabric_doc_update.erl 
b/src/fabric/src/fabric_doc_update.erl
index 76aad2048..2e2db24c9 100644
--- a/src/fabric/src/fabric_doc_update.erl
+++ b/src/fabric/src/fabric_doc_update.erl
@@ -26,9 +26,15 @@ go(DbName, AllDocs0, Options0) ->
     UpdateFun = fun(Doc) ->
         [Shard | _] = Shards = mem3_shards:for_docid(DbName, Doc#doc.id),
         Nodes = [S#shard.node || S <- Shards],
-        ServerId = chttpd_app:couch_write_queue_name(Nodes),
-        {ok, Reply, _Leader} = ra:process_command(ServerId, {update_doc, 
Shard#shard.name, Doc, Options1}),
-        Reply
+        ServerId = couch_ra:couch_write_queue_name(Nodes),
+        case ra:process_command(ServerId, {update_doc, Shard#shard.name, Doc, 
Options1}) of
+            {ok, Reply, _Leader} ->
+                Reply;
+            {error, Reason} ->
+                {error, Reason};
+            {timeout, _ServerId} ->
+                {error, timeout}
+        end
     end,
     {ok, lists:map(UpdateFun, AllDocs1)}.
 
diff --git a/src/mem3/src/mem3_sup.erl b/src/mem3/src/mem3_sup.erl
index 862ef6b50..7423f6208 100644
--- a/src/mem3/src/mem3_sup.erl
+++ b/src/mem3/src/mem3_sup.erl
@@ -40,3 +40,4 @@ child(mem3_reshard_sup = Child) ->
     {Child, MFA, permanent, infinity, supervisor, [Child]};
 child(Child) ->
     {Child, {Child, start_link, []}, permanent, 1000, worker, [Child]}.
+

Reply via email to