You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by rn...@apache.org on 2018/07/10 15:06:41 UTC

[couchdb] 10/10: map documents to shards by their partition

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

rnewson pushed a commit to branch user-partitioned-dbs-wip
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit e89c39a89ae345cecbbbcc100e9209b030d3d833
Author: Robert Newson <rn...@apache.org>
AuthorDate: Tue Jul 10 16:06:20 2018 +0100

    map documents to shards by their partition
---
 src/mem3/src/mem3_shards.erl | 23 ++++++++++++++---------
 1 file changed, 14 insertions(+), 9 deletions(-)

diff --git a/src/mem3/src/mem3_shards.erl b/src/mem3/src/mem3_shards.erl
index 0559149..18ed82e 100644
--- a/src/mem3/src/mem3_shards.erl
+++ b/src/mem3/src/mem3_shards.erl
@@ -67,26 +67,27 @@ for_docid(DbName, DocId) ->
     for_docid(DbName, DocId, []).
 
 for_docid(DbName, DocId, Options) ->
-    HashKey = mem3_util:docid_hash(DocId),
     ShardHead = #shard{
         dbname = DbName,
-        range = ['$1', '$2'],
         _ = '_'
     },
     OrderedShardHead = #ordered_shard{
         dbname = DbName,
-        range = ['$1', '$2'],
         _ = '_'
     },
-    Conditions = [{'=<', '$1', HashKey}, {'=<', HashKey, '$2'}],
-    ShardSpec = {ShardHead, Conditions, ['$_']},
-    OrderedShardSpec = {OrderedShardHead, Conditions, ['$_']},
+    ShardSpec = {ShardHead, [], ['$_']},
+    OrderedShardSpec = {OrderedShardHead, [], ['$_']},
     Shards = try ets:select(?SHARDS, [ShardSpec, OrderedShardSpec]) of
         [] ->
             load_shards_from_disk(DbName, DocId);
-        Else ->
+        Shards0 ->
             gen_server:cast(?MODULE, {cache_hit, DbName}),
-            Else
+            Options1 = case mem3:is_partitioned(hd(Shards0)) of
+                true  -> [partitioned];
+                false -> []
+            end,
+            HashKey = mem3_util:docid_hash(DocId, Options1),
+            [S || S <- Shards0, in_range(S, HashKey)]
     catch error:badarg ->
         load_shards_from_disk(DbName, DocId)
     end,
@@ -397,7 +398,11 @@ load_shards_from_db(ShardDb, DbName) ->
 
 load_shards_from_disk(DbName, DocId)->
     Shards = load_shards_from_disk(DbName),
-    HashKey = mem3_util:docid_hash(DocId),
+    Options = case mem3:is_partitioned(hd(Shards)) of
+        true  -> [partitioned];
+        false -> []
+    end,
+    HashKey = mem3_util:docid_hash(DocId, Options),
     [S || S <- Shards, in_range(S, HashKey)].
 
 in_range(Shard, HashKey) ->