diff options
author | Peng Hui Jiang <jiangphcn@apache.org> | 2018-10-17 06:52:19 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-17 06:52:19 +0800 |
commit | a0f6041c87dccc2969d1348ab477c5454d3a2b63 (patch) | |
tree | 0190c1b56686736369bde55845ec919ad2214a7f | |
parent | 638554bc5ce82ef8cd516382a6437cf2ca50d682 (diff) | |
parent | 78a388d7ee83f71655368941fdd3471b07b41103 (diff) | |
download | couchdb-a0f6041c87dccc2969d1348ab477c5454d3a2b63.tar.gz |
Merge pull request #1657 from apache/COUCHDB-3326-upgrade-users-db
Upgrade disk version to 7/latest for databases generated prior to clustered purge builds
-rw-r--r-- | src/couch/src/couch_bt_engine_header.erl | 4 | ||||
-rw-r--r-- | 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 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. |