summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeng Hui Jiang <jiangph@cn.ibm.com>2020-09-01 16:03:10 +0800
committerGitHub <noreply@github.com>2020-09-01 16:03:10 +0800
commit27eefab014b2c8d65a167f715721090019add33a (patch)
tree1bdf3aa1db1e8567e0f55014cbf7772ccfe194a6
parent0c3c4b611326561867ef8752c417aacce644a901 (diff)
parent253d64adff235826e176f82d7cd081ad45bc0cab (diff)
downloadcouchdb-27eefab014b2c8d65a167f715721090019add33a.tar.gz
Merge pull request #3118 from apache/dreyfus-cleanup-with-invalid-ddoc
Allow to continue to cleanup search index even if there is invalid design document
-rw-r--r--src/dreyfus/src/dreyfus_fabric_cleanup.erl16
-rw-r--r--src/dreyfus/test/elixir/test/search_test.exs25
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 2840a2f2d..681712748 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 e524a5cf4..829b3395f 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