File 2456-mnesia-simplify-select_reverse-1.patch of Package erlang
From 47ee9cdba33c023599fc2efe07eab665bd666c82 Mon Sep 17 00:00:00 2001
From: Bentheburrito <github.arson718@passmail.net>
Date: Mon, 5 May 2025 19:17:48 -0700
Subject: [PATCH 6/8] mnesia: simplify select_reverse/1
---
lib/mnesia/src/mnesia.erl | 44 ++++++++++++-----------------------
lib/mnesia/src/mnesia_lib.erl | 11 ---------
2 files changed, 15 insertions(+), 40 deletions(-)
diff --git a/lib/mnesia/src/mnesia.erl b/lib/mnesia/src/mnesia.erl
index dbea874b69..a87c7a7ccb 100644
--- a/lib/mnesia/src/mnesia.erl
+++ b/lib/mnesia/src/mnesia.erl
@@ -2604,44 +2604,32 @@ Notice that any modifying operations, that is, `mnesia:write` or
Match::term(),
Cont::select_continuation().
select_reverse(Cont) ->
- case get(mnesia_activity_state) of
- {?DEFAULT_ACCESS, Tid, Ts} ->
- select_cont(Tid,Ts,Cont,reverse);
- {Mod, Tid, Ts} ->
- Mod:select_cont(Tid,Ts,Cont,reverse);
- _ ->
- abort(no_transaction)
- end.
+ select(Cont).
-doc false.
-select_cont(Tid,Ts,State) ->
- select_cont(Tid,Ts,State,forward).
-select_cont(_Tid,_Ts,'$end_of_table',_Dir) ->
+select_cont(_Tid,_Ts,'$end_of_table') ->
'$end_of_table';
-select_cont(Tid,_Ts,State=#mnesia_select{tid=Tid,cont=Cont, orig=Ms},Dir)
+select_cont(Tid,_Ts,State=#mnesia_select{tid=Tid,cont=Cont, orig=Ms})
when element(1,Tid) == ets ->
case Cont of
'$end_of_table' -> '$end_of_table';
_ ->
- Result = case Dir of
- forward -> mnesia_lib:db_select_cont(ram_copies,Cont,Ms);
- reverse -> mnesia_lib:db_select_rev_cont(ram_copies,Cont,Ms)
- end,
+ Result = mnesia_lib:db_select_cont(ram_copies,Cont,Ms),
select_state(Result,State)
end;
-select_cont(Tid,_,State=#mnesia_select{tid=Tid,written=[]},Dir) ->
- select_state(dirty_sel_cont(State,Dir),State);
-select_cont(Tid,_Ts,State=#mnesia_select{tid=Tid},Dir) ->
- trans_select(dirty_sel_cont(State,Dir), State);
-select_cont(Tid2,_,#mnesia_select{tid=_Tid1},_Dir)
+select_cont(Tid,_,State=#mnesia_select{tid=Tid,written=[]}) ->
+ select_state(dirty_sel_cont(State),State);
+select_cont(Tid,_Ts,State=#mnesia_select{tid=Tid}) ->
+ trans_select(dirty_sel_cont(State), State);
+select_cont(Tid2,_,#mnesia_select{tid=_Tid1})
when element(1,Tid2) == tid -> % Mismatching tids
abort(wrong_transaction);
-select_cont(Tid,Ts,State=#mnesia_select{},Dir) ->
+select_cont(Tid,Ts,State=#mnesia_select{}) ->
% Repair mismatching tids in non-transactional contexts
RepairedState = State#mnesia_select{tid = Tid, written = [],
spec = undefined, type = undefined},
- select_cont(Tid,Ts,RepairedState,Dir);
-select_cont(_,_,Cont,_Dir) ->
+ select_cont(Tid,Ts,RepairedState);
+select_cont(_,_,Cont) ->
abort({badarg, Cont}).
trans_select('$end_of_table', #mnesia_select{written=Written0,spec=CMS,type=Type}) ->
@@ -3117,11 +3105,9 @@ dirty_sel_init(Node,Tab,Spec,NObjects,Type,forward) ->
dirty_sel_init(Node,Tab,Spec,NObjects,Type,reverse) ->
do_dirty_rpc(Tab,Node,mnesia_lib,db_select_rev_init,[Type,Tab,Spec,NObjects]).
-dirty_sel_cont(#mnesia_select{cont='$end_of_table'},_Dir) -> '$end_of_table';
-dirty_sel_cont(#mnesia_select{node=Node,tab=Tab,storage=Type,cont=Cont,orig=Ms},forward) ->
- do_dirty_rpc(Tab,Node,mnesia_lib,db_select_cont,[Type,Cont,Ms]);
-dirty_sel_cont(#mnesia_select{node=Node,tab=Tab,storage=Type,cont=Cont,orig=Ms},reverse) ->
- do_dirty_rpc(Tab,Node,mnesia_lib,db_select_rev_cont,[Type,Cont,Ms]).
+dirty_sel_cont(#mnesia_select{cont='$end_of_table'}) -> '$end_of_table';
+dirty_sel_cont(#mnesia_select{node=Node,tab=Tab,storage=Type,cont=Cont,orig=Ms}) ->
+ do_dirty_rpc(Tab,Node,mnesia_lib,db_select_cont,[Type,Cont,Ms]).
-doc """
Dirty equivalent to `mnesia:all_keys/1`.
diff --git a/lib/mnesia/src/mnesia_lib.erl b/lib/mnesia/src/mnesia_lib.erl
index 9354eb1b1f..53ccf26575 100644
--- a/lib/mnesia/src/mnesia_lib.erl
+++ b/lib/mnesia/src/mnesia_lib.erl
@@ -80,7 +80,6 @@
db_select_init/4,
db_select_rev_init/4,
db_select_cont/3,
- db_select_rev_cont/3,
db_slot/2,
db_slot/3,
db_update_counter/3,
@@ -1250,16 +1249,6 @@ db_select_rev_init(disc_only_copies, Tab, Pat, Limit) ->
db_select_rev_init(_, Tab, Pat, Limit) ->
ets:select_reverse(Tab, Pat, Limit).
-db_select_rev_cont({ext, _Alias, Mod}, Cont0, Ms) ->
- Cont = Mod:repair_continuation(Cont0, Ms),
- Mod:select_reverse(Cont);
-db_select_rev_cont(disc_only_copies, Cont0, Ms) ->
- Cont = dets:repair_continuation(Cont0, Ms),
- dets:select(Cont);
-db_select_rev_cont(_, Cont0, Ms) ->
- Cont = ets:repair_continuation(Cont0, Ms),
- ets:select_reverse(Cont).
-
db_erase(Tab, Key) ->
db_erase(val({Tab, storage_type}), Tab, Key).
db_erase(ram_copies, Tab, Key) -> ?ets_delete(Tab, Key), ok;
--
2.43.0