Comparison

plugins/mod_storage_sql.lua @ 9885:64e16d1e91f6

mod_storage_internal,_sql: Key item count cache on both username and store
author Kim Alvefur <zash@zash.se>
date Fri, 22 Mar 2019 18:02:27 +0100
parent 9884:9751c17f5281
child 9889:e3ad2c845431
comparison
equal deleted inserted replaced
9884:9751c17f5281 9885:64e16d1e91f6
5 local json = require "util.json"; 5 local json = require "util.json";
6 local sql = require "util.sql"; 6 local sql = require "util.sql";
7 local xml_parse = require "util.xml".parse; 7 local xml_parse = require "util.xml".parse;
8 local uuid = require "util.uuid"; 8 local uuid = require "util.uuid";
9 local resolve_relative_path = require "util.paths".resolve_relative_path; 9 local resolve_relative_path = require "util.paths".resolve_relative_path;
10 local jid_join = require "util.jid".join;
10 11
11 local is_stanza = require"util.stanza".is_stanza; 12 local is_stanza = require"util.stanza".is_stanza;
12 local t_concat = table.concat; 13 local t_concat = table.concat;
13 14
14 local noop = function() end 15 local noop = function() end
235 quota = archive_item_limit; 236 quota = archive_item_limit;
236 truncate = true; 237 truncate = true;
237 }; 238 };
238 archive_store.__index = archive_store 239 archive_store.__index = archive_store
239 function archive_store:append(username, key, value, when, with) 240 function archive_store:append(username, key, value, when, with)
240 local item_count = archive_item_count_cache:get(username); 241 local cache_key = jid_join(username, host, self.store);
242 local item_count = archive_item_count_cache:get(cache_key);
241 if not item_count then 243 if not item_count then
242 local ok, ret = engine:transaction(function() 244 local ok, ret = engine:transaction(function()
243 local count_sql = [[ 245 local count_sql = [[
244 SELECT COUNT(*) FROM "prosodyarchive" 246 SELECT COUNT(*) FROM "prosodyarchive"
245 WHERE "host"=? AND "user"=? AND "store"=?; 247 WHERE "host"=? AND "user"=? AND "store"=?;
253 end); 255 end);
254 if not ok or not item_count then 256 if not ok or not item_count then
255 module:log("error", "Failed while checking quota for %s: %s", username, ret); 257 module:log("error", "Failed while checking quota for %s: %s", username, ret);
256 return nil, "Failure while checking quota"; 258 return nil, "Failure while checking quota";
257 end 259 end
258 archive_item_count_cache:set(username, item_count); 260 archive_item_count_cache:set(cache_key, item_count);
259 end 261 end
260 262
261 module:log("debug", "%s has %d items out of %d limit", username, item_count, archive_item_limit); 263 module:log("debug", "%s has %d items out of %d limit", username, item_count, archive_item_limit);
262 if item_count >= archive_item_limit then 264 if item_count >= archive_item_limit then
263 return nil, "quota-limit"; 265 return nil, "quota-limit";
278 ]]; 280 ]];
279 if key then 281 if key then
280 local result, err = engine:delete(delete_sql, host, user or "", store, key); 282 local result, err = engine:delete(delete_sql, host, user or "", store, key);
281 if result then 283 if result then
282 item_count = item_count - result:affected(); 284 item_count = item_count - result:affected();
283 archive_item_count_cache:set(username, item_count); 285 archive_item_count_cache:set(cache_key, item_count);
284 end 286 end
285 else 287 else
286 item_count = item_count + 1; 288 item_count = item_count + 1;
287 key = uuid.generate(); 289 key = uuid.generate();
288 end 290 end
289 local t, encoded_value = assert(serialize(value)); 291 local t, encoded_value = assert(serialize(value));
290 engine:insert(insert_sql, host, user or "", store, when, with, key, t, encoded_value); 292 engine:insert(insert_sql, host, user or "", store, when, with, key, t, encoded_value);
291 archive_item_count_cache:set(username, item_count+1); 293 archive_item_count_cache:set(cache_key, item_count+1);
292 return key; 294 return key;
293 end); 295 end);
294 if not ok then return ok, ret; end 296 if not ok then return ok, ret; end
295 return ret; -- the key 297 return ret; -- the key
296 end 298 end
458 sql_query = string.format(sql_query, t_concat(where, " AND "), 460 sql_query = string.format(sql_query, t_concat(where, " AND "),
459 query.reverse and "ASC" or "DESC", unlimited); 461 query.reverse and "ASC" or "DESC", unlimited);
460 end 462 end
461 return engine:delete(sql_query, unpack(args)); 463 return engine:delete(sql_query, unpack(args));
462 end); 464 end);
463 archive_item_count_cache:set(username, nil); 465 local cache_key = jid_join(username, host, self.store);
466 archive_item_count_cache:set(cache_key, nil);
464 return ok and stmt:affected(), stmt; 467 return ok and stmt:affected(), stmt;
465 end 468 end
466 469
467 local stores = { 470 local stores = {
468 keyval = keyval_store; 471 keyval = keyval_store;