浏览代码

fix: Avoids storing lobby room instance in the main room object.

We sometimes see "error   Top-level error, please report:
                  /usr/lib/prosody/util/serialization.lua:38: Can't serialize table: table has multiple references".
This also slows down restarting prosody.
master
damencho 5 年前
父节点
当前提交
734631a7a4
共有 1 个文件被更改,包括 18 次插入12 次删除
  1. 18
    12
      resources/prosody-plugins/mod_muc_lobby_rooms.lua

+ 18
- 12
resources/prosody-plugins/mod_muc_lobby_rooms.lua 查看文件

@@ -166,7 +166,7 @@ function attach_lobby_room(room)
166 166
         new_room:set_persistent(true);
167 167
         module:log("debug","Lobby room jid = %s created",lobby_room_jid);
168 168
         new_room.main_room = room;
169
-        room._data.lobbyroom = new_room;
169
+        room._data.lobbyroom = new_room.jid;
170 170
         room:save(true);
171 171
         return true
172 172
     end
@@ -178,9 +178,12 @@ function destroy_lobby_room(room, newjid, message)
178 178
     if not message then
179 179
         message = 'Lobby room closed.';
180 180
     end
181
-    if room and room._data.lobbyroom then
182
-        room._data.lobbyroom:set_persistent(false);
183
-        room._data.lobbyroom:destroy(newjid, message);
181
+    if lobby_muc_service and room and room._data.lobbyroom then
182
+        local lobby_room_obj = lobby_muc_service.get_room_from_jid(room._data.lobbyroom);
183
+        if lobby_room_obj then
184
+            lobby_room_obj:set_persistent(false);
185
+            lobby_room_obj:destroy(newjid, message);
186
+        end
184 187
         room._data.lobbyroom = nil;
185 188
     end
186 189
 end
@@ -315,7 +318,7 @@ process_host_module(main_muc_component_config, function(host_module, host)
315 318
                 label = 'Lobby room jid';
316 319
                 value = '';
317 320
             });
318
-            event.formdata['muc#roominfo_lobbyroom'] = room._data.lobbyroom.jid;
321
+            event.formdata['muc#roominfo_lobbyroom'] = room._data.lobbyroom;
319 322
         end
320 323
     end);
321 324
 
@@ -364,7 +367,7 @@ process_host_module(main_muc_component_config, function(host_module, host)
364 367
             local reply = st.error_reply(stanza, 'auth', 'registration-required'):up();
365 368
             reply.tags[1].attr.code = '407';
366 369
             reply:tag('x', {xmlns = MUC_NS}):up();
367
-            reply:tag('lobbyroom'):text(room._data.lobbyroom.jid);
370
+            reply:tag('lobbyroom'):text(room._data.lobbyroom);
368 371
             event.origin.send(reply:tag('x', {xmlns = MUC_NS}));
369 372
             return true;
370 373
         end
@@ -377,13 +380,16 @@ process_host_module(main_muc_component_config, function(host_module, host)
377 380
         local from = stanza:get_child('x', 'http://jabber.org/protocol/muc#user')
378 381
             :get_child('invite').attr.from;
379 382
 
380
-        if room._data.lobbyroom then
381
-            local occupant = room._data.lobbyroom:get_occupant_by_real_jid(invitee);
382
-            if occupant then
383
-                local display_name = occupant:get_presence():get_child_text(
384
-                    'nick', 'http://jabber.org/protocol/nick');
383
+        if lobby_muc_service and room._data.lobbyroom then
384
+            local lobby_room_obj = lobby_muc_service.get_room_from_jid(room._data.lobbyroom);
385
+            if lobby_room_obj then
386
+                local occupant = lobby_room_obj:get_occupant_by_real_jid(invitee);
387
+                if occupant then
388
+                    local display_name = occupant:get_presence():get_child_text(
389
+                            'nick', 'http://jabber.org/protocol/nick');
385 390
 
386
-                notify_lobby_access(room, from, occupant.nick, display_name, true);
391
+                    notify_lobby_access(room, from, occupant.nick, display_name, true);
392
+                end
387 393
             end
388 394
         end
389 395
     end);

正在加载...
取消
保存