okami.mom/albedo
git clone https://git.nkp.pet/okami.mom/albedo
9372a91
main
1%% Concurrent startup and detached ETS lifetime cannot be controlled through 2%% the model-turn E2E API. Trace creators to catch idle losing owner processes. 3- module ( albedo_registry_test ). 4- include_lib ( "eunit/include/eunit.hrl" ). 5 6concurrent_registration_test () -> 7Table = albedo_registry_concurrency_test , 8Parent = self (), 9Workers = [ spawn_monitor ( fun () -> 10receive start -> ok end , 11nil = albedo_registry : register ( Table , Id , Id ), 12Parent ! { registered , Id } 13end ) || Id <- lists : seq ( 1 , 64 )], 14try 15[ erlang : trace ( Pid , true , [ procs , set_on_spawn , { tracer , Parent }]) || { Pid , _ } <- Workers ], 16[ Pid ! start || { Pid , _ } <- Workers ], 17[ receive { registered , Id } -> ok after 5000 -> error ({ registration_stalled , Id }) end 18|| Id <- lists : seq ( 1 , 64 )], 19[ receive { 'DOWN' , Ref , process , Pid , normal } -> ok 20after 5000 -> error ({ worker_stalled , Pid }) end || { Pid , Ref } <- Workers ], 21Owner = ets : info ( Table , owner ), 22 ?assert ( is_process_alive ( Owner )), 23[ ?assertEqual ({ ok , Id }, albedo_registry : lookup ( Table , Id )) || Id <- lists : seq ( 1 , 64 )], 24Delivered = erlang : trace_delivered ( all ), 25Creators = creators ( Delivered , []), 26 ?assert ( lists : member ( Owner , Creators )), 27[ wait_for_exit ( Pid ) || Pid <- Creators , Pid =/= Owner ], 28%% Reuse is independent of the original registering processes. 29nil = albedo_registry : register ( Table , reused , value ), 30 ?assertEqual ( Owner , ets : info ( Table , owner )), 31 ?assertEqual ({ ok , value }, albedo_registry : lookup ( Table , reused )) 32after 33[ exit ( Pid , kill ) || { Pid , _ } <- Workers , is_process_alive ( Pid )], 34case ets : info ( Table , owner ) of 35undefined -> ok ; 36OwnerToStop -> 37RefToStop = monitor ( process , OwnerToStop ), 38OwnerToStop ! stop , 39receive { 'DOWN' , RefToStop , process , OwnerToStop , _ } -> ok 40after 5000 -> error ( owner_stop_stalled ) end 41end 42end . 43 44creators ( Delivered , Acc ) -> 45receive 46{ trace , _ , spawn , Child , _ } -> creators ( Delivered , [ Child | Acc ]); 47{ trace , _ , _ , _ } -> creators ( Delivered , Acc ); 48{ trace_delivered , all , Delivered } -> Acc 49after 5000 -> error ( trace_delivery_stalled ) 50end . 51 52wait_for_exit ( Pid ) -> 53Ref = monitor ( process , Pid ), 54receive { 'DOWN' , Ref , process , Pid , _ } -> ok 55after 5000 -> error ({ losing_creator_alive , Pid }) end .