From da512ad8c2b4cba719204d8a8f42ecba9716702e Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Thu, 9 Jul 2009 19:35:50 -0400 Subject: gc inboxes on a regular basis --- classes/Notice.php | 1 + classes/Notice_inbox.php | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) (limited to 'classes') diff --git a/classes/Notice.php b/classes/Notice.php index 08125cf7b..e16d84352 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -875,6 +875,7 @@ class Notice extends Memcached_DataObject } $qry .= '('.$id.', '.$this->id.', '.$source.', "'.$this->created.'") '; $cnt++; + Notice_inbox::gc($id); if ($cnt >= MAX_BOXCARS) { $inbox = new Notice_inbox(); $inbox->query($qry); diff --git a/classes/Notice_inbox.php b/classes/Notice_inbox.php index 940381f84..a1aa9b054 100644 --- a/classes/Notice_inbox.php +++ b/classes/Notice_inbox.php @@ -24,6 +24,9 @@ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; // We keep 5 pages of inbox notices in memcache, +1 for pagination check define('INBOX_CACHE_WINDOW', 101); +define('NOTICE_INBOX_GC_BOXCAR', 128); +define('NOTICE_INBOX_GC_MAX', 12800); +define('NOTICE_INBOX_LIMIT', 1000); define('NOTICE_INBOX_SOURCE_SUB', 1); define('NOTICE_INBOX_SOURCE_GROUP', 2); @@ -100,4 +103,41 @@ class Notice_inbox extends Memcached_DataObject { return Memcached_DataObject::pkeyGet('Notice_inbox', $kv); } + + static function gc($user_id) + { + $entry = new Notice_inbox(); + $entry->user_id = $user_id; + $entry->orderBy('created DESC'); + $entry->limit(NOTICE_INBOX_LIMIT - 1, NOTICE_INBOX_GC_MAX); + + $total = $entry->find(); + + if ($total > 0) { + $notices = array(); + $cnt = 0; + while ($entry->fetch()) { + $notices[] = $entry->notice_id; + $cnt++; + if ($cnt >= NOTICE_INBOX_GC_BOXCAR) { + self::deleteMatching($user_id, $notices); + $notices = array(); + $cnt = 0; + } + } + + if ($cnt > 0) { + self::deleteMatching($user_id, $notices); + $notices = array(); + } + } + } + + static function deleteMatching($user_id, $notices) + { + $entry = new Notice_inbox(); + return $entry->query('DELETE FROM notice_inbox '. + 'WHERE user_id = ' . $user_id . ' ' . + 'AND notice_id in ('.implode(',', $notices).')'); + } } -- cgit v1.2.3-54-g00ecf