Mercurial > prosody-hg
comparison plugins/muc/mod_muc.lua @ 8657:a804f2e75f10
MUC: Prevent room eviction on storage failure
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Wed, 07 Mar 2018 17:38:01 +0100 |
| parents | 0e84814a7ece |
| children | 75c7e887c4b9 |
comparison
equal
deleted
inserted
replaced
| 8656:0e84814a7ece | 8657:a804f2e75f10 |
|---|---|
| 127 local eviction_hit_rate = module:measure("room_eviction", "rate"); | 127 local eviction_hit_rate = module:measure("room_eviction", "rate"); |
| 128 local rooms = cache.new(module:get_option_number("muc_room_cache_size", 100), function (jid, room) | 128 local rooms = cache.new(module:get_option_number("muc_room_cache_size", 100), function (jid, room) |
| 129 module:log("debug", "Evicting room %s", jid); | 129 module:log("debug", "Evicting room %s", jid); |
| 130 eviction_hit_rate(); | 130 eviction_hit_rate(); |
| 131 room_items_cache[room.jid] = room:get_public() and room:get_name() or nil; | 131 room_items_cache[room.jid] = room:get_public() and room:get_name() or nil; |
| 132 room_save(room, nil, true); -- Force to disk | 132 local ok, err = room_save(room, nil, true); -- Force to disk |
| 133 if not ok then | |
| 134 module:log("error", "Failed to swap inactive room %s to disk: %s", jid, err); | |
| 135 return false; | |
| 136 end | |
| 133 end); | 137 end); |
| 134 | 138 |
| 135 -- Automatically destroy empty non-persistent rooms | 139 -- Automatically destroy empty non-persistent rooms |
| 136 module:hook("muc-occupant-left",function(event) | 140 module:hook("muc-occupant-left",function(event) |
| 137 local room = event.room | 141 local room = event.room |
| 139 module:fire_event("muc-room-destroyed", { room = room }); | 143 module:fire_event("muc-room-destroyed", { room = room }); |
| 140 end | 144 end |
| 141 end, -1); | 145 end, -1); |
| 142 | 146 |
| 143 function track_room(room) | 147 function track_room(room) |
| 144 rooms:set(room.jid, room); | 148 if rooms:set(room.jid, room) then |
| 145 -- When room is created, over-ride 'save' method | 149 -- When room is created, over-ride 'save' method |
| 146 room.save = room_save; | 150 room.save = room_save; |
| 151 return room; | |
| 152 end | |
| 153 return false; | |
| 147 end | 154 end |
| 148 | 155 |
| 149 local function restore_room(jid) | 156 local function restore_room(jid) |
| 150 local node = jid_split(jid); | 157 local node = jid_split(jid); |
| 151 local data, err = room_configs:get(node); | 158 local data, err = room_configs:get(node); |
| 152 local state = room_state:get(node); | 159 local state = room_state:get(node); |
| 153 if data then | 160 if data then |
| 154 module:log("debug", "Restoring room %s from storage", jid); | 161 module:log("debug", "Restoring room %s from storage", jid); |
| 155 local room = muclib.restore_room(data, state); | 162 local room = muclib.restore_room(data, state); |
| 156 track_room(room); | 163 return track_room(room); |
| 157 return room; | |
| 158 elseif err then | 164 elseif err then |
| 159 module:log("error", "Error restoring room %s from storage: %s", jid, err); | 165 module:log("error", "Error restoring room %s from storage: %s", jid, err); |
| 160 local room = muclib.new_room(jid, { locked = math.huge }); | 166 local room = muclib.new_room(jid, { locked = math.huge }); |
| 161 return room; | 167 return room; |
| 162 end | 168 end |
| 214 seen[room.jid] = true; | 220 seen[room.jid] = true; |
| 215 end | 221 end |
| 216 for room_jid in pairs(persistent_rooms_storage:get(nil) or {}) do | 222 for room_jid in pairs(persistent_rooms_storage:get(nil) or {}) do |
| 217 if not seen[room_jid] then | 223 if not seen[room_jid] then |
| 218 local room = restore_room(room_jid); | 224 local room = restore_room(room_jid); |
| 219 if room == nil then | 225 if room then |
| 226 coroutine.yield(room); | |
| 227 else | |
| 220 module:log("error", "Missing data for room '%s', omitting from iteration", room_jid); | 228 module:log("error", "Missing data for room '%s', omitting from iteration", room_jid); |
| 221 else | |
| 222 coroutine.yield(room); | |
| 223 end | 229 end |
| 224 end | 230 end |
| 225 end | 231 end |
| 226 end); | 232 end); |
| 227 end | 233 end |
