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

[couchdb] 01/01: Upgrade disk version to 7 for databases

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

jiangphcn pushed a commit to branch COUCHDB-3326-upgrade-users-db
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit 78a388d7ee83f71655368941fdd3471b07b41103
Author: jiangph <ji...@cn.ibm.com>
AuthorDate: Mon Oct 15 19:38:24 2018 +0800

    Upgrade disk version to 7 for databases
    
      - for databases generated before this code base, the disk
      version needs to be upgraded to 7 or higher so that it
      can match the db_header with purge_tree and purge_seq_tree
    
    COUCHDB-3326
---
 src/couch/src/couch_bt_engine_header.erl         |  4 ++--
 src/couch/test/couch_bt_engine_upgrade_tests.erl | 19 ++++++++++++++++++-
 2 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/src/couch/src/couch_bt_engine_header.erl b/src/couch/src/couch_bt_engine_header.erl
index 467bb2f..c603417 100644
--- a/src/couch/src/couch_bt_engine_header.erl
+++ b/src/couch/src/couch_bt_engine_header.erl
@@ -234,8 +234,8 @@ upgrade_disk_version(#db_header{}=Header) ->
         2 -> throw({database_disk_version_error, ?OLD_DISK_VERSION_ERROR});
         3 -> throw({database_disk_version_error, ?OLD_DISK_VERSION_ERROR});
         4 -> Header#db_header{security_ptr = nil}; % [0.10 - 0.11)
-        5 -> Header; % pre 1.2
-        6 -> Header; % pre clustered purge
+        5 -> Header#db_header{disk_version = ?LATEST_DISK_VERSION}; % pre 1.2
+        6 -> Header#db_header{disk_version = ?LATEST_DISK_VERSION}; % pre clustered purge
         ?LATEST_DISK_VERSION -> Header;
         _ ->
             Reason = "Incorrect disk header version",
diff --git a/src/couch/test/couch_bt_engine_upgrade_tests.erl b/src/couch/test/couch_bt_engine_upgrade_tests.erl
index 1d2a86d..8025528 100644
--- a/src/couch/test/couch_bt_engine_upgrade_tests.erl
+++ b/src/couch/test/couch_bt_engine_upgrade_tests.erl
@@ -66,12 +66,13 @@ t_upgrade_without_purge_req() ->
         % db with zero purge entries
         DbName = <<"db_without_purge_req">>,
 
+        ?assertEqual(6, get_disk_version_from_header(DbName)),
         {ok, UpgradedPurged} = couch_util:with_db(DbName, fun(Db) ->
             ?assertEqual(0, couch_db:get_purge_seq(Db)),
             couch_db:fold_purge_infos(Db, 0, fun fold_fun/2, [])
         end),
         ?assertEqual([], UpgradedPurged),
-
+        ?assertEqual(7, get_disk_version_from_header(DbName)),
         {ok, Rev} = save_doc(
             DbName, {[{<<"_id">>, <<"doc4">>}, {<<"v">>, 1}]}
         ),
@@ -104,10 +105,12 @@ t_upgrade_with_1_purge_req() ->
         % with a single purge entry
         DbName = <<"db_with_1_purge_req">>,
 
+        ?assertEqual(6, get_disk_version_from_header(DbName)),
         {ok, UpgradedPurged} = couch_util:with_db(DbName, fun(Db) ->
             ?assertEqual(1, couch_db:get_purge_seq(Db)),
             couch_db:fold_purge_infos(Db, 0, fun fold_fun/2, [])
         end),
+        ?assertEqual(7, get_disk_version_from_header(DbName)),
         ?assertEqual([{1, <<"doc1">>}], UpgradedPurged),
 
         {ok, Rev} = save_doc(
@@ -142,10 +145,12 @@ t_upgrade_with_N_purge_req() ->
         % with two docs that have been purged
         DbName = <<"db_with_2_purge_req">>,
 
+        ?assertEqual(6, get_disk_version_from_header(DbName)),
         {ok, UpgradedPurged} = couch_util:with_db(DbName, fun(Db) ->
             ?assertEqual(2, couch_db:get_purge_seq(Db)),
             couch_db:fold_purge_infos(Db, 1, fun fold_fun/2, [])
         end),
+        ?assertEqual(7, get_disk_version_from_header(DbName)),
         ?assertEqual([{2, <<"doc2">>}], UpgradedPurged),
 
         {ok, Rev} = save_doc(DbName, {[{<<"_id">>, <<"doc4">>}, {<<"v">>, 1}]}),
@@ -179,10 +184,12 @@ t_upgrade_with_1_purge_req_for_2_docs() ->
         % with one purge req for Doc1 and another purge req for Doc 2 and Doc3
         DbName = <<"db_with_1_purge_req_for_2_docs">>,
 
+        ?assertEqual(6, get_disk_version_from_header(DbName)),
         {ok, UpgradedPurged} = couch_util:with_db(DbName, fun(Db) ->
             ?assertEqual(3, couch_db:get_purge_seq(Db)),
             couch_db:fold_purge_infos(Db, 1, fun fold_fun/2, [])
         end),
+        ?assertEqual(7, get_disk_version_from_header(DbName)),
         ?assertEqual([{3,<<"doc2">>},{2,<<"doc3">>}], UpgradedPurged),
 
         {ok, Rev} = save_doc(DbName, {[{<<"_id">>, <<"doc6">>}, {<<"v">>, 1}]}),
@@ -218,3 +225,13 @@ save_doc(DbName, Json) ->
 
 fold_fun({PSeq, _UUID, Id, _Revs}, Acc) ->
     {ok, [{PSeq, Id} | Acc]}.
+
+
+get_disk_version_from_header(DbFileName) ->
+    DbDir = config:get("couchdb", "database_dir"),
+    DbFilePath = filename:join([DbDir, ?l2b(?b2l(DbFileName) ++ ".couch")]),
+    {ok, Fd} = couch_file:open(DbFilePath, []),
+    {ok, Header} = couch_file:read_header(Fd),
+    DiskVerison = couch_bt_engine_header:disk_version(Header),
+    couch_file:close(Fd),
+    DiskVerison.