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/16 11:50:54 UTC

[couchdb] 03/05: add persistent 'partitioned' flag

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 a66493de89e04cfe73e03330327486ccca89d175
Author: Robert Newson <rn...@apache.org>
AuthorDate: Fri Jul 13 20:41:15 2018 +0100

    add persistent 'partitioned' flag
---
 src/couch/src/couch_bt_engine.erl        | 14 +++++++++++++-
 src/couch/src/couch_bt_engine_header.erl | 24 ++++++++++++++++++++----
 src/couch/src/couch_db.erl               | 11 +++++++++++
 src/couch/src/couch_db_engine.erl        | 11 +++++++++++
 4 files changed, 55 insertions(+), 5 deletions(-)

diff --git a/src/couch/src/couch_bt_engine.erl b/src/couch/src/couch_bt_engine.erl
index a42d116..9b68735 100644
--- a/src/couch/src/couch_bt_engine.erl
+++ b/src/couch/src/couch_bt_engine.erl
@@ -31,6 +31,7 @@
     last_activity/1,
 
     get_compacted_seq/1,
+    get_partitioned/1,
     get_del_doc_count/1,
     get_disk_version/1,
     get_doc_count/1,
@@ -199,6 +200,10 @@ get_compacted_seq(#st{header = Header}) ->
     couch_bt_engine_header:get(Header, compacted_seq).
 
 
+get_partitioned(#st{header = Header}) ->
+    couch_bt_engine_header:get(Header, partitioned).
+
+
 get_del_doc_count(#st{} = St) ->
     {ok, Reds} = couch_btree:full_reduce(St#st.id_tree),
     element(2, Reds).
@@ -682,7 +687,8 @@ init_state(FilePath, Fd, Header0, Options) ->
     Compression = couch_compress:get_compression_method(),
 
     Header1 = couch_bt_engine_header:upgrade(Header0),
-    Header = set_default_security_object(Fd, Header1, Compression, Options),
+    Header2 = set_default_security_object(Fd, Header1, Compression, Options),
+    Header = set_partitioned(Header2, Options),
 
     IdTreeState = couch_bt_engine_header:id_tree_state(Header),
     {ok, IdTree} = couch_btree:open(IdTreeState, Fd, [
@@ -763,6 +769,11 @@ set_default_security_object(Fd, Header, Compression, Options) ->
     end.
 
 
+set_partitioned(Header, Options) ->
+    Partitioned = lists:member(partitioned, Options),
+    couch_bt_engine_header:set(Header, partitioned, true).
+
+
 delete_compaction_files(FilePath) ->
     RootDir = config:get("couchdb", "database_dir", "."),
     DelOpts = [{context, compaction}],
@@ -933,6 +944,7 @@ finish_compaction_int(#st{} = OldSt, #st{} = NewSt1) ->
     {ok, NewSt2} = commit_data(NewSt1#st{
         header = couch_bt_engine_header:set(Header, [
             {compacted_seq, get_update_seq(OldSt)},
+            {partitioned, get_partitioned(OldSt)},
             {revs_limit, get_revs_limit(OldSt)}
         ]),
         local_tree = NewLocal2
diff --git a/src/couch/src/couch_bt_engine_header.erl b/src/couch/src/couch_bt_engine_header.erl
index 3d24f31..07dce50 100644
--- a/src/couch/src/couch_bt_engine_header.erl
+++ b/src/couch/src/couch_bt_engine_header.erl
@@ -37,7 +37,8 @@
     revs_limit/1,
     uuid/1,
     epochs/1,
-    compacted_seq/1
+    compacted_seq/1,
+    partitioned/1
 ]).
 
 
@@ -66,7 +67,8 @@
     revs_limit = 1000,
     uuid,
     epochs,
-    compacted_seq
+    compacted_seq,
+    partitioned
 }).
 
 
@@ -82,7 +84,8 @@ from(Header0) ->
     #db_header{
         uuid = Header#db_header.uuid,
         epochs = Header#db_header.epochs,
-        compacted_seq = Header#db_header.compacted_seq
+        compacted_seq = Header#db_header.compacted_seq,
+        partitioned = Header#db_header.partitioned
     }.
 
 
@@ -101,7 +104,8 @@ upgrade(Header) ->
         fun upgrade_disk_version/1,
         fun upgrade_uuid/1,
         fun upgrade_epochs/1,
-        fun upgrade_compacted_seq/1
+        fun upgrade_compacted_seq/1,
+        fun upgrade_partitioned/1
     ],
     lists:foldl(fun(F, HdrAcc) ->
         F(HdrAcc)
@@ -178,6 +182,10 @@ compacted_seq(Header) ->
     get_field(Header, compacted_seq).
 
 
+partitioned(Header) ->
+    get_field(Header, partitioned).
+
+
 get_field(Header, Field) ->
     get_field(Header, Field, undefined).
 
@@ -303,6 +311,14 @@ upgrade_compacted_seq(#db_header{}=Header) ->
             Header
     end.
 
+upgrade_partitioned(#db_header{}=Header) ->
+    case Header#db_header.partitioned of
+        undefined ->
+            Header#db_header{partitioned=false};
+        Partitioned when is_boolean(Partitioned) ->
+            Header
+    end.
+
 latest(?LATEST_DISK_VERSION) ->
     true;
 latest(N) when is_integer(N), N < ?LATEST_DISK_VERSION ->
diff --git a/src/couch/src/couch_db.erl b/src/couch/src/couch_db.erl
index b47cc7e..2b735fd 100644
--- a/src/couch/src/couch_db.erl
+++ b/src/couch/src/couch_db.erl
@@ -36,6 +36,7 @@
     get_before_doc_update_fun/1,
     get_committed_update_seq/1,
     get_compacted_seq/1,
+    get_partitioned/1,
     get_compactor_pid/1,
     get_db_info/1,
     get_del_doc_count/1,
@@ -418,6 +419,11 @@ get_instance_start_time(#db{instance_start_time = IST}) ->
 get_compacted_seq(#db{}=Db) ->
     couch_db_engine:get_compacted_seq(Db).
 
+
+get_partitioned(#db{}=Db) ->
+    couch_db_engine:get_partitioned(Db).
+
+
 get_compactor_pid(#db{compactor_pid = Pid}) ->
     Pid.
 
@@ -443,6 +449,10 @@ get_db_info(Db) ->
         undefined -> null;
         Else1 -> Else1
     end,
+    Partitioned = case get_partitioned(Db) of
+        undefined -> null;
+        Else2 -> Else2
+    end,
     InfoList = [
         {db_name, Name},
         {engine, couch_db_engine:get_engine(Db)},
@@ -464,6 +474,7 @@ get_db_info(Db) ->
         {disk_format_version, DiskVersion},
         {committed_update_seq, CommittedUpdateSeq},
         {compacted_seq, CompactedSeq},
+        {partitioned, Partitioned},
         {uuid, Uuid}
     ],
     {ok, InfoList}.
diff --git a/src/couch/src/couch_db_engine.erl b/src/couch/src/couch_db_engine.erl
index 502faa7..efd221f 100644
--- a/src/couch/src/couch_db_engine.erl
+++ b/src/couch/src/couch_db_engine.erl
@@ -180,6 +180,11 @@
 -callback get_compacted_seq(DbHandle::db_handle()) ->
             CompactedSeq::non_neg_integer().
 
+% Whether the database is partitioned by the user's choice of
+% document id
+-callback get_partitioned(DbHAndle::db_handle()) ->
+            Partitioned::boolean().
+
 
 % The number of documents in the database which have all leaf
 % revisions marked as deleted.
@@ -593,6 +598,7 @@
 
     get_engine/1,
     get_compacted_seq/1,
+    get_partitioned/1,
     get_del_doc_count/1,
     get_disk_version/1,
     get_doc_count/1,
@@ -717,6 +723,11 @@ get_compacted_seq(#db{} = Db) ->
     Engine:get_compacted_seq(EngineState).
 
 
+get_partitioned(#db{} = Db) ->
+    #db{engine = {Engine, EngineState}} = Db,
+    Engine:get_partitioned(EngineState).
+
+
 get_del_doc_count(#db{} = Db) ->
     #db{engine = {Engine, EngineState}} = Db,
     Engine:get_del_doc_count(EngineState).