From 71151b2583d81e28c5f5d42a690c649f4e84f3bf Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Thu, 11 Feb 2010 00:09:20 +0000 Subject: [PATCH] OStatus: garbage collect unused PuSH subscriptions when the last local subscriber unsubs --- plugins/OStatus/OStatusPlugin.php | 23 ++++++++++++++++++++--- plugins/OStatus/actions/pushcallback.php | 19 ++++++++++++------- plugins/OStatus/classes/Feedinfo.php | 22 ++++++++++++++++------ 3 files changed, 48 insertions(+), 16 deletions(-) diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 4b9b4d2c32..ce02393e43 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -234,13 +234,30 @@ class OStatusPlugin extends Plugin } } + + /** + * Garbage collect unused feeds on unsubscribe + */ + function onEndUnsubscribe($user, $other) + { + $feed = Feedinfo::staticGet('profile_id', $other->id); + if ($feed) { + $sub = new Subscription(); + $sub->subscribed = $other->id; + $sub->limit(1); + if (!$sub->find(true)) { + common_log(LOG_INFO, "Unsubscribing from now-unused feed $feed->feeduri on hub $feed->huburi"); + $feed->unsubscribe(); + } + } + return true; + } + function onCheckSchema() { - // warning: the autoincrement doesn't seem to set. - // alter table feedinfo change column id id int(11) not null auto_increment; $schema = Schema::get(); $schema->ensureTable('feedinfo', Feedinfo::schemaDef()); $schema->ensureTable('hubsub', HubSub::schemaDef()); return true; - } + } } diff --git a/plugins/OStatus/actions/pushcallback.php b/plugins/OStatus/actions/pushcallback.php index a5e02e08f1..471d079ab9 100644 --- a/plugins/OStatus/actions/pushcallback.php +++ b/plugins/OStatus/actions/pushcallback.php @@ -91,15 +91,20 @@ class PushCallbackAction extends Action #} // OK! - common_log(LOG_INFO, __METHOD__ . ': sub confirmed'); - $feedinfo->sub_start = common_sql_date(time()); - if ($lease_seconds > 0) { - $feedinfo->sub_end = common_sql_date(time() + $lease_seconds); + if ($mode == 'subscribe') { + common_log(LOG_INFO, __METHOD__ . ': sub confirmed'); + $feedinfo->sub_start = common_sql_date(time()); + if ($lease_seconds > 0) { + $feedinfo->sub_end = common_sql_date(time() + $lease_seconds); + } else { + $feedinfo->sub_end = null; + } + $feedinfo->update(); } else { - $feedinfo->sub_end = null; + common_log(LOG_INFO, __METHOD__ . ": unsub confirmed; deleting sub record for $topic"); + $feedinfo->delete(); } - $feedinfo->update(); - + print $challenge; } } diff --git a/plugins/OStatus/classes/Feedinfo.php b/plugins/OStatus/classes/Feedinfo.php index 2344a4a0ee..d3cccd42f0 100644 --- a/plugins/OStatus/classes/Feedinfo.php +++ b/plugins/OStatus/classes/Feedinfo.php @@ -112,9 +112,9 @@ class Feedinfo extends Memcached_DataObject /*extra*/ null, /*auto_increment*/ true), new ColumnDef('profile_id', 'integer', - null, true), + null, true, 'UNI'), new ColumnDef('group_id', 'integer', - null, true), + null, true, 'UNI'), new ColumnDef('feeduri', 'varchar', 255, false, 'UNI'), new ColumnDef('homeuri', 'varchar', @@ -160,7 +160,7 @@ class Feedinfo extends Memcached_DataObject function keyTypes() { - return array('id' => 'K', 'feeduri' => 'U'); // @fixme we'll need a profile_id key at least + return array('id' => 'K', 'profile_id' => 'U', 'group_id' => 'U', 'feeduri' => 'U'); } function sequenceKey() @@ -261,11 +261,11 @@ class Feedinfo extends Memcached_DataObject /** * Send a subscription request to the hub for this feed. - * The hub will later send us a confirmation POST to /feedsub/callback. + * The hub will later send us a confirmation POST to /main/push/callback. * * @return bool true on success, false on failure */ - public function subscribe() + public function subscribe($mode='subscribe') { if (common_config('feedsub', 'nohub')) { // Fake it! We're just testing remote feeds w/o hubs. @@ -278,7 +278,7 @@ class Feedinfo extends Memcached_DataObject try { $callback = common_local_url('pushcallback', array('feed' => $this->id)); $headers = array('Content-Type: application/x-www-form-urlencoded'); - $post = array('hub.mode' => 'subscribe', + $post = array('hub.mode' => $mode, 'hub.callback' => $callback, 'hub.verify' => 'async', 'hub.verify_token' => $this->verify_token, @@ -308,6 +308,16 @@ class Feedinfo extends Memcached_DataObject } } + /** + * Send an unsubscription request to the hub for this feed. + * The hub will later send us a confirmation POST to /main/push/callback. + * + * @return bool true on success, false on failure + */ + public function unsubscribe() { + return $this->subscribe('unsubscribe'); + } + /** * Read and post notices for updates from the feed. * Currently assumes that all items in the feed are new, -- 2.39.2