summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoriilyak <iilyak@ca.ibm.com>2018-08-30 04:05:24 -0700
committerGitHub <noreply@github.com>2018-08-30 04:05:24 -0700
commit50be214f0c8d7d0d7e632eac59caed9604c0b703 (patch)
treec7c99acfcb3da95ab8f64b7b80075b08e479790b
parent7d984ad3c6bdf79cf0722bf0a34261e35a521817 (diff)
parent0c6aa8b68ad386a248926dba3ee356f6279013a6 (diff)
downloadcouchdb-50be214f0c8d7d0d7e632eac59caed9604c0b703.tar.gz
Merge pull request #1586 from cloudant/improve-cleanup_index_files
Improve cleanup_index_files
-rw-r--r--src/couch/test/couchdb_mrview_tests.erl53
-rw-r--r--src/fabric/src/fabric.erl6
2 files changed, 57 insertions, 2 deletions
diff --git a/src/couch/test/couchdb_mrview_tests.erl b/src/couch/test/couchdb_mrview_tests.erl
index 402df02a6..2549528be 100644
--- a/src/couch/test/couchdb_mrview_tests.erl
+++ b/src/couch/test/couchdb_mrview_tests.erl
@@ -92,6 +92,19 @@ mrview_query_test_() ->
}
}.
+mrview_cleanup_index_files_test_() ->
+ {
+ "Check index files cleanup",
+ {
+ setup,
+ fun start/0, fun teardown/1,
+ [
+ make_test_case(clustered, [fun should_cleanup_index_files/2])
+ ]
+ }
+ }.
+
+
make_test_case(Mod, Funs) ->
{
lists:flatten(io_lib:format("~s", [Mod])),
@@ -129,6 +142,46 @@ should_return_400_for_wrong_order_of_keys(_PortType, {Host, DbName}) ->
ok
end).
+should_cleanup_index_files(_PortType, {Host, DbName}) ->
+ ?_test(begin
+ IndexWildCard = [
+ config:get("couchdb", "view_index_dir"),
+ "/.shards/*/",
+ DbName,
+ ".[0-9]*_design/mrview/*"
+ ],
+ ReqUrl = Host ++ "/" ++ DbName ++ "/_design/foo/_view/view1",
+ {ok, Status0, _Headers0, Body0} = test_request:get(ReqUrl, [?AUTH]),
+ FileList0 = filelib:wildcard(IndexWildCard),
+ ?assertNotEqual([], FileList0),
+
+ % It is hard to simulate inactive view.
+ % Since couch_mrview:cleanup is called on view definition change.
+ % That's why we just create extra files in place
+ ToDelete = lists:map(fun(FilePath) ->
+ ViewFile = filename:join([
+ filename:dirname(FilePath),
+ "11111111111111111111111111111111.view"]),
+ file:write_file(ViewFile, <<>>),
+ ViewFile
+ end, FileList0),
+ FileList1 = filelib:wildcard(IndexWildCard),
+ ?assertEqual([], lists:usort(FileList1 -- (FileList0 ++ ToDelete))),
+
+ CleanupUrl = Host ++ "/" ++ DbName ++ "/_view_cleanup",
+ {ok, Status1, _Headers1, Body1} = test_request:post(
+ CleanupUrl, [], <<>>, [?AUTH]),
+ test_util:wait(fun() ->
+ IndexFiles = filelib:wildcard(IndexWildCard),
+ case lists:usort(FileList0) == lists:usort(IndexFiles) of
+ false -> wait;
+ true -> ok
+ end
+ end),
+ ok
+ end).
+
+
create_doc(backdoor, DbName, Id, Body) ->
JsonDoc = couch_util:json_apply_field({<<"_id">>, Id}, Body),
Doc = couch_doc:from_json_obj(JsonDoc),
diff --git a/src/fabric/src/fabric.erl b/src/fabric/src/fabric.erl
index cf9ad9428..36ed67154 100644
--- a/src/fabric/src/fabric.erl
+++ b/src/fabric/src/fabric.erl
@@ -485,8 +485,10 @@ cleanup_index_files(DbName) ->
binary_to_list(couch_util:get_value(signature, Info))
end, [couch_doc:from_json_obj(DD) || DD <- DesignDocs]),
- FileList = filelib:wildcard([config:get("couchdb", "view_index_dir"),
- "/.shards/*/", couch_util:to_list(dbname(DbName)), ".[0-9]*_design/mrview/*"]),
+ FileList = lists:flatmap(fun(#shard{name = ShardName}) ->
+ IndexDir = couch_index_util:index_dir(mrview, ShardName),
+ filelib:wildcard([IndexDir, "/*"])
+ end, mem3:local_shards(dbname(DbName))),
DeleteFiles = if ActiveSigs =:= [] -> FileList; true ->
{ok, RegExp} = re:compile([$(, string:join(ActiveSigs, "|"), $)]),