diff options
| author | Emile Joubert <emile@rabbitmq.com> | 2012-12-18 17:20:02 +0000 |
|---|---|---|
| committer | Emile Joubert <emile@rabbitmq.com> | 2012-12-18 17:20:02 +0000 |
| commit | 0a91a8b0d65917ea6a462802ccbcb27c74c502cd (patch) | |
| tree | d35c204cfa8357ba96d84276603617f39064abaf /src/dtree.erl | |
| parent | a4261e5e16a10c7ea044325ecf4f2467398c92ed (diff) | |
| download | rabbitmq-server-git-0a91a8b0d65917ea6a462802ccbcb27c74c502cd.tar.gz | |
Confirms for HA
Diffstat (limited to 'src/dtree.erl')
| -rw-r--r-- | src/dtree.erl | 24 |
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), |
