From 112b6c40793a18262425ca039e4fe4a6eb68bce4 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 12 Oct 2010 16:29:13 -0700 Subject: [PATCH] Improve cache-friendliness of user_group->delete(). Doesn't clear all possible cached entries, but this should get the ones that matter most: lookups by id, nickname, and alias. This should ensure that if a group name gets reused as a new group or alias, it should work properly. There are some user-visible areas that aren't clear such as the 'top groups' lists on the GroupsAction sidebar; if a deleted group appears in those lists it'll go away within an hour when the cached query expires. --- classes/User_group.php | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/classes/User_group.php b/classes/User_group.php index fabb8e8d5c..1f70057852 100644 --- a/classes/User_group.php +++ b/classes/User_group.php @@ -551,29 +551,39 @@ class User_group extends Memcached_DataObject /** * Handle cascading deletion, on the model of notice and profile. * - * Pretty sure some caching won't get handled properly here. + * This should handle freeing up cached entries for the group's + * id, nickname, URI, and aliases. There may be other areas that + * are not de-cached in the UI, including the sidebar lists on + * GroupsAction */ function delete() { if ($this->id) { + // Safe to delete in bulk for now $related = array('Group_inbox', - 'Group_alias', 'Group_block', 'Group_member', - 'Local_group', - 'Related_group', - ); + 'Related_group'); Event::handle('UserGroupDeleteRelated', array($this, &$related)); - foreach ($related as $cls) { $inst = new $cls(); $inst->group_id = $this->id; $inst->delete(); } + // And related groups in the other direction... $inst = new Related_group(); $inst->related_group_id = $this->id; $inst->delete(); + + // Aliases and the local_group entry need to be cleared explicitly + // or we'll miss clearing some cache keys; that can make it hard + // to create a new group with one of those names or aliases. + $this->setAliases(array()); + $local = Local_group::staticGet('group_id', $this->id); + if ($local) { + $local->delete(); + } } else { common_log(LOG_WARN, "Ambiguous user_group->delete(); skipping related tables."); }