This is an automated email from the ASF dual-hosted git repository. rnewson pushed a commit to branch record_last_compaction in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit ab74e00b57dafa6b9cfc46c062276d9c2e444927 Author: Robert Newson <rnew...@apache.org> AuthorDate: Mon Apr 9 17:37:31 2018 +0100 Record and expose last compaction time For a clustered database, report the earliest compaction time from any shard. If any shard does not have a recorded compaction time, show this as null to avoid confusion. --- src/couch/src/couch_bt_engine.erl | 11 +++++++++++ src/couch/src/couch_bt_engine_header.erl | 13 ++++++++++--- src/couch/src/couch_db.erl | 9 +++++++++ src/couch/src/couch_db_engine.erl | 13 +++++++++++++ src/couch/src/test_engine_get_set_props.erl | 3 ++- src/fabric/src/fabric.erl | 1 + src/fabric/src/fabric_db_info.erl | 7 +++++++ 7 files changed, 53 insertions(+), 4 deletions(-) diff --git a/src/couch/src/couch_bt_engine.erl b/src/couch/src/couch_bt_engine.erl index 43a77b0..264269a 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_last_compaction/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_last_compaction(#st{header = Header}) -> + couch_bt_engine_header:get(Header, last_compaction). + + get_del_doc_count(#st{} = St) -> {ok, Reds} = couch_btree:full_reduce(St#st.id_tree), element(2, Reds). @@ -933,6 +938,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)}, + {last_compaction, now_secs()}, {revs_limit, get_revs_limit(OldSt)} ]), local_tree = NewLocal2 @@ -961,3 +967,8 @@ finish_compaction_int(#st{} = OldSt, #st{} = NewSt1) -> {ok, NewSt2#st{ filepath = FilePath }, undefined}. + + +now_secs() -> + {Mega, Sec, _Micro} = os:timestamp(), + Mega * 1000000 + Sec. diff --git a/src/couch/src/couch_bt_engine_header.erl b/src/couch/src/couch_bt_engine_header.erl index 3d24f31..464942b 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, + last_compaction/1 ]). @@ -66,7 +67,8 @@ revs_limit = 1000, uuid, epochs, - compacted_seq + compacted_seq, + last_compaction }). @@ -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, + last_compaction = Header#db_header.last_compaction }. @@ -178,6 +181,10 @@ compacted_seq(Header) -> get_field(Header, compacted_seq). +last_compaction(Header) -> + get_field(Header, last_compaction). + + get_field(Header, Field) -> get_field(Header, Field, undefined). diff --git a/src/couch/src/couch_db.erl b/src/couch/src/couch_db.erl index 93ea07e..fc22c3a 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_last_compaction/1, get_compactor_pid/1, get_db_info/1, get_del_doc_count/1, @@ -418,6 +419,9 @@ get_instance_start_time(#db{instance_start_time = IST}) -> get_compacted_seq(#db{}=Db) -> couch_db_engine:get_compacted_seq(Db). +get_last_compaction(#db{}=Db) -> + couch_db_engine:get_last_compaction(Db). + get_compactor_pid(#db{compactor_pid = Pid}) -> Pid. @@ -443,6 +447,10 @@ get_db_info(Db) -> undefined -> null; Else1 -> Else1 end, + LastCompaction = case get_last_compaction(Db) of + undefined -> null; + Else2 -> Else2 + end, InfoList = [ {db_name, Name}, {engine, couch_db_engine:get_engine(Db)}, @@ -464,6 +472,7 @@ get_db_info(Db) -> {disk_format_version, DiskVersion}, {committed_update_seq, CommittedUpdateSeq}, {compacted_seq, CompactedSeq}, + {last_compaction, LastCompaction}, {uuid, Uuid} ], {ok, InfoList}. diff --git a/src/couch/src/couch_db_engine.erl b/src/couch/src/couch_db_engine.erl index 502faa7..2ea075a 100644 --- a/src/couch/src/couch_db_engine.erl +++ b/src/couch/src/couch_db_engine.erl @@ -181,6 +181,13 @@ CompactedSeq::non_neg_integer(). +% The database should make a note of the time when it +% was last compacted. If the database doesn't need compacting it +% can just hard code a return value of 0. +-callback get_last_compaction(DbHandle::db_handle()) -> + LastCompaction::non_neg_integer(). + + % The number of documents in the database which have all leaf % revisions marked as deleted. -callback get_del_doc_count(DbHandle::db_handle()) -> @@ -593,6 +600,7 @@ get_engine/1, get_compacted_seq/1, + get_last_compaction/1, get_del_doc_count/1, get_disk_version/1, get_doc_count/1, @@ -717,6 +725,11 @@ get_compacted_seq(#db{} = Db) -> Engine:get_compacted_seq(EngineState). +get_last_compaction(#db{} = Db) -> + #db{engine = {Engine, EngineState}} = Db, + Engine:get_last_compaction(EngineState). + + get_del_doc_count(#db{} = Db) -> #db{engine = {Engine, EngineState}} = Db, Engine:get_del_doc_count(EngineState). diff --git a/src/couch/src/test_engine_get_set_props.erl b/src/couch/src/test_engine_get_set_props.erl index 6d2a447..37e1fd6 100644 --- a/src/couch/src/test_engine_get_set_props.erl +++ b/src/couch/src/test_engine_get_set_props.erl @@ -39,7 +39,8 @@ cet_default_props() -> ?assertEqual(1000, Engine:get_revs_limit(St)), ?assertMatch(<<_:32/binary>>, Engine:get_uuid(St)), ?assertEqual([{Node, 0}], Engine:get_epochs(St)), - ?assertEqual(0, Engine:get_compacted_seq(St)). + ?assertEqual(0, Engine:get_compacted_seq(St)), + ?assertEqual(undefined, Engine:get_last_compaction(St)). cet_set_security() -> diff --git a/src/fabric/src/fabric.erl b/src/fabric/src/fabric.erl index 4a07271..863b5fe 100644 --- a/src/fabric/src/fabric.erl +++ b/src/fabric/src/fabric.erl @@ -78,6 +78,7 @@ all_dbs(Prefix) when is_list(Prefix) -> {doc_del_count, non_neg_integer()} | {purge_seq, non_neg_integer()} | {compact_running, boolean()} | + {last_compaction, non_neg_integer()} | {disk_size, non_neg_integer()} | {disk_format_version, pos_integer()} ]}. diff --git a/src/fabric/src/fabric_db_info.erl b/src/fabric/src/fabric_db_info.erl index 98e8e52..4af97ee 100644 --- a/src/fabric/src/fabric_db_info.erl +++ b/src/fabric/src/fabric_db_info.erl @@ -95,6 +95,13 @@ merge_results(Info) -> [{purge_seq, lists:sum(X)} | Acc]; (compact_running, X, Acc) -> [{compact_running, lists:member(true, X)} | Acc]; + (last_compaction, Times, Acc) -> + case lists:member(null, Times) of + true -> + [{last_compaction, null} | Acc]; + false -> + [{last_compaction, lists:min(Times)} | Acc] + end; (disk_size, X, Acc) -> % legacy [{disk_size, lists:sum(X)} | Acc]; (data_size, X, Acc) -> % legacy -- To stop receiving notification emails like this one, please contact rnew...@apache.org.