summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjiangph <jiangph@cn.ibm.com>2018-10-15 19:38:24 +0800
committerjiangph <jiangph@cn.ibm.com>2018-10-16 21:40:37 +0800
commit78a388d7ee83f71655368941fdd3471b07b41103 (patch)
tree0190c1b56686736369bde55845ec919ad2214a7f
parent638554bc5ce82ef8cd516382a6437cf2ca50d682 (diff)
downloadcouchdb-COUCHDB-3326-upgrade-users-db.tar.gz
Upgrade disk version to 7 for databasesCOUCHDB-3326-upgrade-users-db
- 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
-rw-r--r--src/couch/src/couch_bt_engine_header.erl4
-rw-r--r--src/couch/test/couch_bt_engine_upgrade_tests.erl19
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 467bb2ff8..c6034179a 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 1d2a86d71..8025528fb 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.