summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjiangph <jiangph@cn.ibm.com>2020-03-11 19:02:40 +0800
committerjiangph <jiangph@cn.ibm.com>2020-03-11 19:10:31 +0800
commitd701795eb27d37c9defab800a5d30a53f3d23ee0 (patch)
tree3f90072b95449053e2d7f100c578aa7aac82ce60
parent3c2b92c032f234666454925c911b01e1b781af2e (diff)
downloadcouchdb-softdeletion.tar.gz
soft-deletion for databasearchive/softdeletionsoftdeletion
-rw-r--r--src/fabric/include/fabric2.hrl1
-rw-r--r--src/fabric/src/fabric2_fdb.erl19
2 files changed, 17 insertions, 3 deletions
diff --git a/src/fabric/include/fabric2.hrl b/src/fabric/include/fabric2.hrl
index 189995de2..62d847b9b 100644
--- a/src/fabric/include/fabric2.hrl
+++ b/src/fabric/include/fabric2.hrl
@@ -21,6 +21,7 @@
-define(CLUSTER_CONFIG, 0).
-define(ALL_DBS, 1).
+-define(DELETED_DBS, 2).
-define(DBS, 15).
-define(TX_IDS, 255).
diff --git a/src/fabric/src/fabric2_fdb.erl b/src/fabric/src/fabric2_fdb.erl
index fb2891be7..672c98830 100644
--- a/src/fabric/src/fabric2_fdb.erl
+++ b/src/fabric/src/fabric2_fdb.erl
@@ -148,7 +148,8 @@ create(#{} = Db0, Options) ->
% Eventually DbPrefix will be HCA allocated. For now
% we're just using the DbName so that debugging is easier.
DbKey = erlfdb_tuple:pack({?ALL_DBS, DbName}, LayerPrefix),
- DbPrefix = erlfdb_tuple:pack({?DBS, DbName}, LayerPrefix),
+ #{allocator := Allocator} = erlfdb_directory:root(),
+ DbPrefix = erlfdb_hca:allocate(Allocator, Tx),
erlfdb:set(Tx, DbKey, DbPrefix),
% This key is responsible for telling us when something in
@@ -285,8 +286,20 @@ delete(#{} = Db) ->
} = ensure_current(Db),
DbKey = erlfdb_tuple:pack({?ALL_DBS, DbName}, LayerPrefix),
- erlfdb:clear(Tx, DbKey),
- erlfdb:clear_range_startswith(Tx, DbPrefix),
+ DoRecovery = config:get_boolean("couchdb",
+ "enable_database_recovery", false),
+ case DoRecovery of
+ true ->
+ {Mega, Secs, _} = os:timestamp(),
+ NowSecs = Mega * 1000000 + Secs,
+ NewDbKey = erlfdb_tuple:pack({?DELETED_DBS, DbName, NowSecs},
+ LayerPrefix),
+ erlfdb:set(Tx, NewDbKey, DbPrefix),
+ erlfdb:clear(Tx, DbKey);
+ false ->
+ erlfdb:clear(Tx, DbKey),
+ erlfdb:clear_range_startswith(Tx, DbPrefix)
+ end,
bump_metadata_version(Tx),
ok.