summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjiangph <jiangph@cn.ibm.com>2020-04-01 23:04:45 +0800
committerjiangph <jiangph@cn.ibm.com>2020-04-02 00:01:12 +0800
commitb1d2b08afb80ca9f8d8f4b9ca37ad65cd54b3352 (patch)
treeb634c5372ae8a6c047308034e3b7f5baaa42be05
parent1add81716b1afa4a76028a2eb59c7b813c28f04d (diff)
downloadcouchdb-b1d2b08afb80ca9f8d8f4b9ca37ad65cd54b3352.tar.gz
bump_db_version and old db handle test
-rw-r--r--src/fabric/src/fabric2_fdb.erl10
-rw-r--r--src/fabric/test/fabric2_db_crud_tests.erl55
2 files changed, 64 insertions, 1 deletions
diff --git a/src/fabric/src/fabric2_fdb.erl b/src/fabric/src/fabric2_fdb.erl
index f19b51c48..6f3b9a227 100644
--- a/src/fabric/src/fabric2_fdb.erl
+++ b/src/fabric/src/fabric2_fdb.erl
@@ -387,6 +387,10 @@ undelete(#{} = Db0, TgtDbName, TimeStamp) ->
DbPrefix ->
erlfdb:set(Tx, DbKey, DbPrefix),
erlfdb:clear(Tx, DeleteDbKey),
+ bump_db_version(#{
+ tx => Tx,
+ db_prefix => DbPrefix
+ }),
ok
end
end.
@@ -410,7 +414,11 @@ remove_deleted_db(#{} = Db0, TimeStamp) ->
erlang:error({not_found});
DbPrefix ->
erlfdb:clear(Tx, DeletedDbKey),
- erlfdb:clear_range_startswith(Tx, DbPrefix)
+ erlfdb:clear_range_startswith(Tx, DbPrefix),
+ bump_db_version(#{
+ tx => Tx,
+ db_prefix => DbPrefix
+ })
end,
ok.
diff --git a/src/fabric/test/fabric2_db_crud_tests.erl b/src/fabric/test/fabric2_db_crud_tests.erl
index ef594640d..bd19d9b11 100644
--- a/src/fabric/test/fabric2_db_crud_tests.erl
+++ b/src/fabric/test/fabric2_db_crud_tests.erl
@@ -39,6 +39,7 @@ crud_test_() ->
?TDEF_FE(recreate_db),
?TDEF_FE(undelete_db),
?TDEF_FE(remove_deleted_db),
+ ?TDEF_FE(old_db_handle),
?TDEF_FE(list_dbs),
?TDEF_FE(list_dbs_user_fun),
?TDEF_FE(list_dbs_user_fun_partial),
@@ -193,6 +194,60 @@ remove_deleted_db(_) ->
?assert(not lists:member(DbName, DeletedDbs)).
+old_db_handle(_) ->
+ % db hard deleted
+ DbName1 = ?tempdb(),
+ ?assertError(database_does_not_exist, fabric2_db:delete(DbName1, [])),
+ ?assertMatch({ok, _}, fabric2_db:create(DbName1, [])),
+ {ok, Db1} = fabric2_db:open(DbName1, []),
+ ?assertMatch({ok, _}, fabric2_db:get_db_info(Db1)),
+ ?assertEqual(ok, fabric2_db:delete(DbName1, [])),
+ ?assertError(database_does_not_exist, fabric2_db:get_db_info(Db1)),
+
+ % db soft deleted
+ DbName2 = ?tempdb(),
+ ?assertError(database_does_not_exist, fabric2_db:delete(DbName2, [])),
+ ?assertMatch({ok, _}, fabric2_db:create(DbName2, [])),
+ {ok, Db2} = fabric2_db:open(DbName2, []),
+ ?assertMatch({ok, _}, fabric2_db:get_db_info(Db2)),
+ ok = config:set("couchdb", "enable_database_recovery", "true", false),
+ ?assertEqual(ok, fabric2_db:delete(DbName2, [])),
+ ?assertError(database_does_not_exist, fabric2_db:get_db_info(Db2)),
+
+ % db soft deleted and re-created
+ DbName3 = ?tempdb(),
+ ?assertError(database_does_not_exist, fabric2_db:delete(DbName3, [])),
+ ?assertMatch({ok, _}, fabric2_db:create(DbName3, [])),
+ {ok, Db3} = fabric2_db:open(DbName3, []),
+ ?assertMatch({ok, _}, fabric2_db:get_db_info(Db3)),
+ ok = config:set("couchdb", "enable_database_recovery", "true", false),
+ ?assertEqual(ok, fabric2_db:delete(DbName3, [])),
+ ?assertMatch({ok, _}, fabric2_db:create(DbName3, [])),
+ ?assertError(database_does_not_exist, fabric2_db:get_db_info(Db3)),
+
+ % db soft deleted and undeleted
+ DbName4 = ?tempdb(),
+ ?assertError(database_does_not_exist, fabric2_db:delete(DbName4, [])),
+ ?assertMatch({ok, _}, fabric2_db:create(DbName4, [])),
+ {ok, Db4} = fabric2_db:open(DbName4, []),
+ ?assertMatch({ok, _}, fabric2_db:get_db_info(Db4)),
+ ok = config:set("couchdb", "enable_database_recovery", "true", false),
+ ?assertEqual(ok, fabric2_db:delete(DbName4, [])),
+ {ok, [{Timestamp, _Info}]} = fabric2_db:deleted_dbs_info(DbName4, []),
+ ok = fabric2_db:undelete(DbName4, DbName4, Timestamp, []),
+ ?assertMatch({ok, _}, fabric2_db:get_db_info(Db4)),
+
+ % db hard deleted and re-created
+ DbName5 = ?tempdb(),
+ ?assertError(database_does_not_exist, fabric2_db:delete(DbName5, [])),
+ ?assertMatch({ok, _}, fabric2_db:create(DbName5, [])),
+ {ok, Db5} = fabric2_db:open(DbName5, []),
+ ?assertMatch({ok, _}, fabric2_db:get_db_info(Db5)),
+ ?assertEqual(ok, fabric2_db:delete(DbName5, [])),
+ ?assertMatch({ok, _}, fabric2_db:create(DbName5, [])),
+ ?assertError(database_does_not_exist, fabric2_db:get_db_info(Db5)).
+
+
list_dbs(_) ->
DbName = ?tempdb(),
AllDbs1 = fabric2_db:list_dbs(),