You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ji...@apache.org on 2020/09/01 08:27:48 UTC

[couchdb] branch backport-dreyfus-cleanup-with-invalid-ddoc created (now b69a11a)

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

jiangphcn pushed a change to branch backport-dreyfus-cleanup-with-invalid-ddoc
in repository https://gitbox.apache.org/repos/asf/couchdb.git.


      at b69a11a  Allow to continue to cleanup search index even if there is invalid ddoc

This branch includes the following new commits:

     new b69a11a  Allow to continue to cleanup search index even if there is invalid ddoc

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[couchdb] 01/01: Allow to continue to cleanup search index even if there is invalid ddoc

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jiangphcn pushed a commit to branch backport-dreyfus-cleanup-with-invalid-ddoc
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit b69a11a14acae8ece68244b079d3329e60be4e70
Author: jiangph <ji...@cn.ibm.com>
AuthorDate: Tue Sep 1 16:26:20 2020 +0800

    Allow to continue to cleanup search index even if there is invalid ddoc
    
    In some situation where design document for search index created by
    customer is not valid, the _search_cleanup endpoint will stop to clean
    up. This will leave some search index orphan. The change is to allow
    to continue to clean up search index even if there is invalid design
    document for search.
---
 src/dreyfus/src/dreyfus_fabric_cleanup.erl   | 16 ++++++++++------
 src/dreyfus/test/elixir/test/search_test.exs | 25 +++++++++++++++++++++++++
 2 files changed, 35 insertions(+), 6 deletions(-)

diff --git a/src/dreyfus/src/dreyfus_fabric_cleanup.erl b/src/dreyfus/src/dreyfus_fabric_cleanup.erl
index 2840a2f..6817127 100644
--- a/src/dreyfus/src/dreyfus_fabric_cleanup.erl
+++ b/src/dreyfus/src/dreyfus_fabric_cleanup.erl
@@ -30,12 +30,16 @@ go(DbName) ->
     ok.
 
 active_sigs(#doc{body={Fields}}=Doc) ->
-    {RawIndexes} = couch_util:get_value(<<"indexes">>, Fields, {[]}),
-    {IndexNames, _} = lists:unzip(RawIndexes),
-    [begin
-         {ok, Index} = dreyfus_index:design_doc_to_index(Doc, IndexName),
-         Index#index.sig
-     end || IndexName <- IndexNames].
+    try
+        {RawIndexes} = couch_util:get_value(<<"indexes">>, Fields, {[]}),
+        {IndexNames, _} = lists:unzip(RawIndexes),
+        [begin
+             {ok, Index} = dreyfus_index:design_doc_to_index(Doc, IndexName),
+             Index#index.sig
+         end || IndexName <- IndexNames]
+    catch error:{badmatch, _Error} ->
+        []
+    end.
 
 cleanup_local_purge_doc(DbName, ActiveSigs) ->
     {ok, BaseDir} = clouseau_rpc:get_root_dir(),
diff --git a/src/dreyfus/test/elixir/test/search_test.exs b/src/dreyfus/test/elixir/test/search_test.exs
index e524a5c..829b339 100644
--- a/src/dreyfus/test/elixir/test/search_test.exs
+++ b/src/dreyfus/test/elixir/test/search_test.exs
@@ -37,6 +37,20 @@ defmodule SearchTest do
     assert Map.has_key?(resp.body, "ok") == true
   end
 
+  def create_invalid_ddoc(db_name, opts \\ %{}) do
+    invalid_ddoc = %{
+      :indexes => [
+        %{"name" => "foo",  "ddoc" => "bar", "type" => "text"},
+      ]
+    }
+
+    ddoc = Enum.into(opts, invalid_ddoc)
+
+    resp = Couch.put("/#{db_name}/_design/search", body: ddoc)
+    assert resp.status_code in [201, 202]
+    assert Map.has_key?(resp.body, "ok") == true
+  end
+
   def get_items (resp) do
     %{:body => %{"rows" => rows}} = resp
     Enum.map(rows, fn row -> row["doc"]["item"] end)
@@ -198,4 +212,15 @@ defmodule SearchTest do
     ids = get_items(resp)
     assert Enum.sort(ids) == ["apple"]
   end
+
+  @tag :with_db
+  test "clean up search index with invalid design document", context do
+    db_name = context[:db_name]
+    create_search_docs(db_name)
+    create_ddoc(db_name)
+    create_invalid_ddoc(db_name)
+
+    resp = Couch.post("/#{db_name}/_search_cleanup")
+    assert resp.status_code in [201, 202]
+  end
 end