summaryrefslogtreecommitdiff
path: root/src/dtree.erl
diff options
context:
space:
mode:
authorEmile Joubert <emile@rabbitmq.com>2012-12-18 17:20:02 +0000
committerEmile Joubert <emile@rabbitmq.com>2012-12-18 17:20:02 +0000
commit0a91a8b0d65917ea6a462802ccbcb27c74c502cd (patch)
treed35c204cfa8357ba96d84276603617f39064abaf /src/dtree.erl
parenta4261e5e16a10c7ea044325ecf4f2467398c92ed (diff)
downloadrabbitmq-server-git-0a91a8b0d65917ea6a462802ccbcb27c74c502cd.tar.gz
Confirms for HA
Diffstat (limited to 'src/dtree.erl')
-rw-r--r--src/dtree.erl24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/dtree.erl b/src/dtree.erl
index ca2d30cf68..c59243bb73 100644
--- a/src/dtree.erl
+++ b/src/dtree.erl
@@ -32,7 +32,7 @@
-module(dtree).
--export([empty/0, insert/4, take/3, take/2, take_all/2,
+-export([empty/0, insert/4, take/3, take/2, take_all/2, take_prim/2,
is_defined/2, is_empty/1, smallest/1, size/1]).
%%----------------------------------------------------------------------------
@@ -53,6 +53,7 @@
-spec(take/3 :: ([pk()], sk(), ?MODULE()) -> {[kv()], ?MODULE()}).
-spec(take/2 :: (sk(), ?MODULE()) -> {[kv()], ?MODULE()}).
-spec(take_all/2 :: (sk(), ?MODULE()) -> {[kv()], ?MODULE()}).
+-spec(take_prim/2 :: (pk(), ?MODULE()) -> {[kv()], ?MODULE()}).
-spec(is_defined/2 :: (sk(), ?MODULE()) -> boolean()).
-spec(is_empty/1 :: (?MODULE()) -> boolean()).
-spec(smallest/1 :: (?MODULE()) -> kv()).
@@ -120,6 +121,13 @@ take_all(SK, {P, S}) ->
{KVs, {P1, prune(SKS, PKS, S)}}
end.
+%% Drop the entry with the given primary key
+take_prim(PK, {P, S} = DTree) ->
+ case gb_trees:lookup(PK, P) of
+ none -> {[], DTree};
+ {value, {SKS, V}} -> {[{PK, V}], take_prim2(PK, SKS, DTree)}
+ end.
+
is_defined(SK, {_P, S}) -> gb_trees:is_defined(SK, S).
is_empty({P, _S}) -> gb_trees:is_empty(P).
@@ -149,6 +157,20 @@ take_all2(PKS, P) ->
gb_trees:delete(PK, P0)}
end, {[], gb_sets:empty(), P}, PKS).
+take_prim2(PK, SKS, {P, S}) ->
+ {gb_trees:delete(PK, P),
+ rabbit_misc:gb_trees_fold(
+ fun (SK0, PKS, S1) ->
+ case gb_sets:is_member(SK0, SKS) of
+ false -> S1;
+ true -> PKS1 = gb_sets:delete(PK, PKS),
+ case gb_sets:is_empty(PKS1) of
+ true -> gb_trees:delete(SK0, S1);
+ false -> gb_trees:update(SK0, PKS1, S1)
+ end
+ end
+ end, S, S)}.
+
prune(SKS, PKS, S) ->
gb_sets:fold(fun (SK0, S0) ->
PKS1 = gb_trees:get(SK0, S0),