You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ga...@apache.org on 2020/02/06 17:10:05 UTC
[couchdb] 01/01: more work on background indexer
This is an automated email from the ASF dual-hosted git repository.
garren pushed a commit to branch fdb-mango-indexes
in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit f48742b8c93f9b05e2d72ea510a480041a1fe1c0
Author: Garren Smith <ga...@gmail.com>
AuthorDate: Thu Feb 6 15:58:19 2020 +0200
more work on background indexer
---
src/couch/src/couch_proc_manager.erl | 2 +-
src/couch_js/src/couch_js_proc_manager.erl | 2 +-
src/mango/src/mango_fdb.erl | 2 +-
src/mango/src/mango_httpd.erl | 3 ++-
src/mango/src/mango_idx.erl | 31 ++++++++++++++++--------
src/mango/src/mango_idx_view.hrl | 3 +--
src/mango/src/mango_indexer_server.erl | 2 +-
src/mango/src/mango_jobs.erl | 5 ++--
src/mango/src/mango_jobs_indexer.erl | 1 -
src/mango/src/mango_native_proc.erl | 3 ++-
src/mango/test/13-users-db-find-test.py | 4 ++-
src/mango/test/eunit/mango_jobs_indexer_test.erl | 9 ++++---
src/mango/test/mango.py | 9 ++-----
13 files changed, 44 insertions(+), 32 deletions(-)
diff --git a/src/couch/src/couch_proc_manager.erl b/src/couch/src/couch_proc_manager.erl
index 3366b2b..0f686ef 100644
--- a/src/couch/src/couch_proc_manager.erl
+++ b/src/couch/src/couch_proc_manager.erl
@@ -108,7 +108,7 @@ init([]) ->
ets:new(?SERVERS, [public, named_table, set]),
ets:insert(?SERVERS, get_servers_from_env("COUCHDB_QUERY_SERVER_")),
ets:insert(?SERVERS, get_servers_from_env("COUCHDB_NATIVE_QUERY_SERVER_")),
- ets:insert(?SERVERS, [{"QUERY", {mango_native_proc, start_link, []}}]),
+%% ets:insert(?SERVERS, [{"QUERY", {mango_native_proc, start_link, []}}]),
maybe_configure_erlang_native_servers(),
{ok, #state{
diff --git a/src/couch_js/src/couch_js_proc_manager.erl b/src/couch_js/src/couch_js_proc_manager.erl
index 0964696..0f2916b 100644
--- a/src/couch_js/src/couch_js_proc_manager.erl
+++ b/src/couch_js/src/couch_js_proc_manager.erl
@@ -108,7 +108,7 @@ init([]) ->
ets:new(?SERVERS, [public, named_table, set]),
ets:insert(?SERVERS, get_servers_from_env("COUCHDB_QUERY_SERVER_")),
ets:insert(?SERVERS, get_servers_from_env("COUCHDB_NATIVE_QUERY_SERVER_")),
- ets:insert(?SERVERS, [{"QUERY", {mango_native_proc, start_link, []}}]),
+%% ets:insert(?SERVERS, [{"QUERY", {mango_native_proc, start_link, []}}]),
maybe_configure_erlang_native_servers(),
{ok, #state{
diff --git a/src/mango/src/mango_fdb.erl b/src/mango/src/mango_fdb.erl
index a54d658..3e0c48e 100644
--- a/src/mango/src/mango_fdb.erl
+++ b/src/mango/src/mango_fdb.erl
@@ -224,7 +224,7 @@ fold_cb({Key, _}, Acc) ->
{{_, DocId}} = erlfdb_tuple:unpack(Key, MangoIdxPrefix),
{ok, Doc} = fabric2_db:open_doc(Db, DocId),
JSONDoc = couch_doc:to_json_obj(Doc, []),
-%% io:format("PRINT ~p ~p ~n", [DocId, JSONDoc]),
+ io:format("PRINT ~p ~p ~n", [DocId, JSONDoc]),
case Callback({doc, JSONDoc}, Cursor) of
{ok, Cursor1} ->
Acc#{
diff --git a/src/mango/src/mango_httpd.erl b/src/mango/src/mango_httpd.erl
index d5e9cfa..b8525dc 100644
--- a/src/mango/src/mango_httpd.erl
+++ b/src/mango/src/mango_httpd.erl
@@ -62,7 +62,8 @@ handle_req_int(_, _) ->
handle_index_req(#httpd{method='GET', path_parts=[_, _]}=Req, Db) ->
Params = lists:flatmap(fun({K, V}) -> parse_index_param(K, V) end,
chttpd:qs(Req)),
- Idxs = lists:sort(mango_idx:list(Db)),
+ Idxs0 = mango_idx:add_build_status(Db, mango_idx:list(Db)),
+ Idxs = lists:sort(Idxs0),
JsonIdxs0 = lists:map(fun mango_idx:to_json/1, Idxs),
TotalRows = length(JsonIdxs0),
Limit = case couch_util:get_value(limit, Params, TotalRows) of
diff --git a/src/mango/src/mango_idx.erl b/src/mango/src/mango_idx.erl
index 3aadd49..c1deaa9 100644
--- a/src/mango/src/mango_idx.erl
+++ b/src/mango/src/mango_idx.erl
@@ -26,6 +26,7 @@
add/2,
remove/2,
from_ddoc/2,
+ add_build_status/2,
special/1,
dbname/1,
@@ -58,11 +59,9 @@ list(Db) ->
rows => []
},
{ok, Indexes} = fabric2_db:fold_design_docs(Db, fun ddoc_fold_cb/2, Acc0, []),
-%% io:format("INDEXES ~p ~n", [Indexes]),
Indexes ++ special(Db).
-% Todo this should all be in fabric2_db
ddoc_fold_cb({meta, _}, Acc) ->
{ok, Acc};
@@ -237,14 +236,25 @@ from_ddoc(Db, {Props}) ->
%% [mango_idx_view]
%% end,
Idxs = lists:flatmap(fun(Mod) -> Mod:from_ddoc({Props}) end, IdxMods),
+ lists:map(fun(Idx) ->
+ Idx#idx{
+ dbname = DbName,
+ ddoc = DDoc,
+ partitioned = get_idx_partitioned(Db, Props)
+ }
+ end, Idxs).
+
+
+add_build_status(Db, Idxs) ->
fabric2_fdb:transactional(Db, fun(TxDb) ->
- lists:map(fun(Idx) ->
- Idx#idx{
- dbname = DbName,
- ddoc = DDoc,
- partitioned = get_idx_partitioned(Db, Props),
- build_status = mango_fdb:get_build_status(TxDb, DDoc)
- }
+ lists:map(fun
+ (#idx{type = <<"special">>} = Idx) ->
+ Idx;
+ (Idx) ->
+ DDoc = mango_idx:ddoc(Idx),
+ Idx#idx{
+ build_status = mango_fdb:get_build_status(TxDb, DDoc)
+ }
end, Idxs)
end).
@@ -255,7 +265,8 @@ special(Db) ->
name = <<"_all_docs">>,
type = <<"special">>,
def = all_docs,
- opts = []
+ opts = [],
+ build_status = ?MANGO_INDEX_READY
},
% Add one for _update_seq
[AllDocs].
diff --git a/src/mango/src/mango_idx_view.hrl b/src/mango/src/mango_idx_view.hrl
index 6ebe68e..14ce87c 100644
--- a/src/mango/src/mango_idx_view.hrl
+++ b/src/mango/src/mango_idx_view.hrl
@@ -11,5 +11,4 @@
% the License.
%%-define(MAX_JSON_OBJ, {<<255, 255, 255, 255>>}).
--define(MAX_JSON_OBJ, <<255>>).
-%%-define(MAX_JSON_OBJ, {[{<<"ZZZ">>, <<"ZZZ">>}]}).
+-define(MAX_JSON_OBJ, {[{<<"\ufff0">>, <<"\ufff0">>}]}).
diff --git a/src/mango/src/mango_indexer_server.erl b/src/mango/src/mango_indexer_server.erl
index 29530bb..6942c9f 100644
--- a/src/mango/src/mango_indexer_server.erl
+++ b/src/mango/src/mango_indexer_server.erl
@@ -31,7 +31,7 @@
]).
--define(MAX_WORKERS, 1).
+-define(MAX_WORKERS, 100).
start_link() ->
diff --git a/src/mango/src/mango_jobs.erl b/src/mango/src/mango_jobs.erl
index 6739d62..c5a70ff 100644
--- a/src/mango/src/mango_jobs.erl
+++ b/src/mango/src/mango_jobs.erl
@@ -39,8 +39,9 @@ build_index(TxDb, #idx{} = Idx) ->
{ok, JobId}.
-job_id(#{name := DbName}, #idx{ddoc = DDoc}) ->
- <<DbName/binary, "-",DDoc/binary>>.
+job_id(#{name := DbName}, #idx{ddoc = DDoc} = Idx) ->
+ Cols = iolist_to_binary(mango_idx:columns(Idx)),
+ <<DbName/binary, "_",DDoc/binary, Cols/binary>>.
job_data(Db, Idx) ->
diff --git a/src/mango/src/mango_jobs_indexer.erl b/src/mango/src/mango_jobs_indexer.erl
index ce6b850..d68c80b 100644
--- a/src/mango/src/mango_jobs_indexer.erl
+++ b/src/mango/src/mango_jobs_indexer.erl
@@ -94,7 +94,6 @@ init() ->
exit:normal ->
ok;
Error:Reason ->
- io:format("ERROR in index worker ~p ~p ~p ~n", [Error, Reason, erlang:display(erlang:get_stacktrace())]),
NewRetry = Retries + 1,
RetryLimit = retry_limit(),
diff --git a/src/mango/src/mango_native_proc.erl b/src/mango/src/mango_native_proc.erl
index cbf3622..5a05083 100644
--- a/src/mango/src/mango_native_proc.erl
+++ b/src/mango/src/mango_native_proc.erl
@@ -47,7 +47,8 @@
start_link() ->
- gen_server:start_link(?MODULE, [], []).
+ throw({error, mango_native_proc_is_no_longer_needed}).
+%% gen_server:start_link(?MODULE, [], []).
set_timeout(Pid, TimeOut) when is_integer(TimeOut), TimeOut > 0 ->
diff --git a/src/mango/test/13-users-db-find-test.py b/src/mango/test/13-users-db-find-test.py
index 73d15ea..32d919a 100644
--- a/src/mango/test/13-users-db-find-test.py
+++ b/src/mango/test/13-users-db-find-test.py
@@ -12,9 +12,10 @@
# the License.
-import mango, requests
+import mango, requests, unittest
+@unittest.skip("this FDB doesn't support this")
class UsersDbFindTests(mango.UsersDbTests):
def test_simple_find(self):
docs = self.db.find({"name": {"$eq": "demo02"}})
@@ -57,6 +58,7 @@ class UsersDbFindTests(mango.UsersDbTests):
assert len(docs) == 3
+@unittest.skip("this FDB doesn't support this")
class UsersDbIndexFindTests(UsersDbFindTests):
def setUp(self):
self.db.create_index(["name"])
diff --git a/src/mango/test/eunit/mango_jobs_indexer_test.erl b/src/mango/test/eunit/mango_jobs_indexer_test.erl
index 7a8cb24..9641163 100644
--- a/src/mango/test/eunit/mango_jobs_indexer_test.erl
+++ b/src/mango/test/eunit/mango_jobs_indexer_test.erl
@@ -89,7 +89,6 @@ index_lots_of_docs(Db) ->
index_can_recover_from_crash(Db) ->
meck:new(mango_indexer, [passthrough]),
meck:expect(mango_indexer, write_doc, fun (Db, Doc, Idxs) ->
- ?debugFmt("doc ~p ~p ~n", [Doc, Idxs]),
Id = Doc#doc.id,
case Id == <<"2">> of
true ->
@@ -112,8 +111,12 @@ index_can_recover_from_crash(Db) ->
wait_while_ddoc_builds(Db) ->
fabric2_fdb:transactional(Db, fun(TxDb) ->
Idxs = mango_idx:list(TxDb),
- [Idx] = lists:filter(fun (Idx) -> Idx#idx.type == <<"json">> end, Idxs),
- if Idx#idx.build_status == ?MANGO_INDEX_READY -> ok; true ->
+
+ Ready = lists:filter(fun (Idx) ->
+ Idx#idx.build_status == ?MANGO_INDEX_READY
+ end, mango_idx:add_build_status(TxDb, Idxs)),
+
+ if length(Ready) > 1 -> ok; true ->
timer:sleep(100),
wait_while_ddoc_builds(Db)
end
diff --git a/src/mango/test/mango.py b/src/mango/test/mango.py
index 92cf211..5b1c7a7 100644
--- a/src/mango/test/mango.py
+++ b/src/mango/test/mango.py
@@ -110,11 +110,7 @@ class Database(object):
def save_docs(self, docs, **kwargs):
body = json.dumps({"docs": docs})
r = self.sess.post(self.path("_bulk_docs"), data=body, params=kwargs)
- print("DOC")
- print(docs)
r.raise_for_status()
- print("RES")
- print(r.json())
for doc, result in zip(docs, r.json()):
doc["_id"] = result["id"]
doc["_rev"] = result["rev"]
@@ -142,7 +138,7 @@ class Database(object):
name=None,
ddoc=None,
partial_filter_selector=None,
- selector=None,
+ selector=None
):
body = {"index": {"fields": fields}, "type": idx_type, "w": 3}
if name is not None:
@@ -167,7 +163,7 @@ class Database(object):
for i in self.get_index(r.json()["id"], r.json()["name"])
if i["build_status"] == "ready"
]) < 1:
- delay(t=0.1)
+ delay(t=0.2)
return created
@@ -285,7 +281,6 @@ class Database(object):
else:
path = self.path("_find")
r = self.sess.post(path, data=body)
- print(r.json())
r.raise_for_status()
if explain or return_raw:
return r.json()