]> granicus.if.org Git - ejabberd/commitdiff
Make jlib ETS table more resilient
authorMickael Remond <mremond@process-one.net>
Tue, 26 Jul 2016 09:58:14 +0000 (11:58 +0200)
committerMickael Remond <mremond@process-one.net>
Tue, 26 Jul 2016 09:58:14 +0000 (11:58 +0200)
src/jid.erl

index 0c3ac77c0d08d62d929a512bc7e8a1af66efe198..46830d0314f0de39703c2afc392575866d33df64 100644 (file)
 -spec start() -> ok.
 
 start() ->
+    Owner = spawn(fun() -> ets_keepalive() end),
     SplitPattern = binary:compile_pattern([<<"@">>, <<"/">>]),
-    catch ets:new(jlib, [named_table, protected, set, {keypos, 1}]),
+    %% Table is public to allow ETS insert to fix / update the table even if table already exist
+    %% with another owner.
+    catch ets:new(jlib, [named_table, public, set, {keypos, 1}, {heir, Owner, undefined}]),
     ets:insert(jlib, {string_to_jid_pattern, SplitPattern}),
     ok.
 
+%% Process used to keep jlib ETS table alive in case the original owner dies.
+%% The table need to be public, otherwise subsequent inserts would fail.
+ets_keepalive() ->
+    receive
+        _ ->
+            ets_keepalive()
+    end.
+
 -spec make(binary(), binary(), binary()) -> jid() | error.
 
 make(User, Server, Resource) ->