summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Newson <rnewson@apache.org>2018-07-13 20:41:15 +0100
committerRobert Newson <rnewson@apache.org>2018-07-13 20:41:15 +0100
commita66493de89e04cfe73e03330327486ccca89d175 (patch)
tree5e32f8bf3470f146b72c35fdbe355c92c292a6ee
parent70b7c9bd675564d7c10f0b380f0ebdd6ebe36227 (diff)
downloadcouchdb-a66493de89e04cfe73e03330327486ccca89d175.tar.gz
add persistent 'partitioned' flag
-rw-r--r--src/couch/src/couch_bt_engine.erl14
-rw-r--r--src/couch/src/couch_bt_engine_header.erl24
-rw-r--r--src/couch/src/couch_db.erl11
-rw-r--r--src/couch/src/couch_db_engine.erl11
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 a42d116f8..9b68735ed 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 3d24f3189..07dce509e 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 b47cc7ece..2b735fd4c 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 502faa7ee..efd221f0d 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).