Hi guys,<br><br>Just wanted to check if anyone got a chance to look at this.<br><br>Thanks,<br>-Gagan<br><br><div class="gmail_quote">On Tue, Nov 22, 2011 at 1:09 AM, Talk Erlang <span dir="ltr"><<a href="mailto:talkerlang@gmail.com">talkerlang@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div style="word-wrap:break-word"><div>Hello everyone,</div><div><br></div><div>I have a vanilla distributed erlang environment with two ejabberd nodes(I guess there could be more but assuming two for simplicity), with Mnesia replication on both.</div>
I think the following piece of code can lead to a race condition if two ejabberd nodes are started at the same time:<div><br></div><div><div><b><font style="font-size:11px" color="#3b1d8f">load_permanent_rooms(Host, ServerHost, Access, HistorySize, RoomShaper) -></font></b></div>
<div><b><font style="font-size:11px" color="#3b1d8f">    case catch mnesia:dirty_select(</font></b></div><div><b><font style="font-size:11px" color="#3b1d8f">                 muc_room, [{#muc_room{name_host = {'_', Host}, _ = '_'},</font></b></div>
<div><b><font style="font-size:11px" color="#3b1d8f">                             [],</font></b></div><div><b><font style="font-size:11px" color="#3b1d8f">                             ['$_']}]) of</font></b></div>
<div><b><font style="font-size:11px" color="#3b1d8f">        {'EXIT', Reason} -></font></b></div><div><b><font style="font-size:11px" color="#3b1d8f">            ?ERROR_MSG("~p", [Reason]),</font></b></div>
<div><b><font style="font-size:11px" color="#3b1d8f">            ok;</font></b></div><div><b><font style="font-size:11px" color="#3b1d8f">        Rs -></font></b></div><div><b><font style="font-size:11px" color="#3b1d8f">            lists:foreach(</font></b></div>
<div><b><font style="font-size:11px" color="#3b1d8f">              fun(R) -></font></b></div><div><b><font style="font-size:11px" color="#3b1d8f">                      {Room, Host} = R#muc_room.name_host,</font></b></div>
<div><b><font style="font-size:11px" color="#3b1d8f">                      case mnesia:dirty_read(muc_online_room, {Room, Host}) of</font></b></div><div><b><font style="font-size:11px" color="#3b1d8f">                          [] -></font></b></div>
<div><b><font style="font-size:11px" color="#3b1d8f">                              {ok, Pid} = mod_muc_room:start(</font></b></div><div><b><font style="font-size:11px" color="#3b1d8f">                                            Host,</font></b></div>
<div><b><font style="font-size:11px" color="#3b1d8f">                                            ServerHost,</font></b></div><div><b><font style="font-size:11px" color="#3b1d8f">                                            Access,</font></b></div>
<div><b><font style="font-size:11px" color="#3b1d8f">                                            Room,</font></b></div><div><b><font style="font-size:11px" color="#3b1d8f">                                            HistorySize,</font></b></div>
<div><b><font style="font-size:11px" color="#3b1d8f">                                            RoomShaper,</font></b></div><div><b><font style="font-size:11px" color="#3b1d8f">                                            R#muc_room.opts),</font></b></div>
<div><b><font style="font-size:11px" color="#3b1d8f">                              register_room(Host, Room, Pid);</font></b></div></div><div><b><br></b></div><div><br></div><div>If two nodes start at the same time, they both will probably execute the same code, i.e. read from Mnesia(muc_room, which is a persistent room table) at the same time, and there is a possibility that if the table is empty, might even try to spawn the same mod_muc_room(s) processes.</div>
<div><br></div><div>Should it not be a protected/locked read & write? I imagine the sequence should be somewhat like:</div><div>Lock DB --> Read --> Write(if table does not exist) --> Unclock DB.</div><div><br>
</div><div>Please correct me if I'm wrong.</div><div><b><br></b></div><div><b><br></b></div><div><b>Thanks a lot!</b></div></div></blockquote></div><br>