Index: modules/aggregator/aggregator.fetcher.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/aggregator/aggregator.fetcher.inc,v retrieving revision 1.10 diff -u -p -r1.10 aggregator.fetcher.inc --- modules/aggregator/aggregator.fetcher.inc 12 Oct 2009 15:54:59 -0000 1.10 +++ modules/aggregator/aggregator.fetcher.inc 2 Nov 2009 01:23:07 -0000 @@ -38,7 +38,7 @@ function aggregator_aggregator_fetch($fe switch ($result->code) { case 304: db_update('aggregator_feed') - ->fields(array('checked' => REQUEST_TIME)) + ->fields(array('checked' => REQUEST_TIME, 'queued' => 0)) ->condition('fid', $feed->fid) ->execute(); drupal_set_message(t('There is no new syndicated content from %site.', array('%site' => $feed->title))); @@ -62,7 +62,7 @@ function aggregator_aggregator_fetch($fe if ($feed->hash == $md5) { db_update('aggregator_feed') ->condition('fid', $feed->fid) - ->fields(array('checked' => REQUEST_TIME)) + ->fields(array('checked' => REQUEST_TIME, 'queued' => 0)) ->execute(); drupal_set_message(t('There is no new syndicated content from %site.', array('%site' => $feed->title))); break; Index: modules/aggregator/aggregator.install =================================================================== RCS file: /cvs/drupal/drupal/modules/aggregator/aggregator.install,v retrieving revision 1.27 diff -u -p -r1.27 aggregator.install --- modules/aggregator/aggregator.install 29 Sep 2009 15:13:54 -0000 1.27 +++ modules/aggregator/aggregator.install 2 Nov 2009 01:23:08 -0000 @@ -143,6 +143,12 @@ function aggregator_schema() { 'default' => 0, 'description' => 'Last time feed was checked for new items, as Unix timestamp.', ), + 'queued' => array( + 'type' => 'int', + 'not null' => TRUE, + 'default' => 0, + 'description' => 'Time when this feed was queued for refresh, 0 if not queued.', + ), 'link' => array( 'type' => 'varchar', 'length' => 255, @@ -195,6 +201,9 @@ function aggregator_schema() { 'url' => array('url'), 'title' => array('title'), ), + 'indexes' => array( + 'queued' => array('queued'), + ), ); $schema['aggregator_item'] = array( @@ -275,3 +284,16 @@ function aggregator_update_7000() { function aggregator_update_7001() { variable_set('aggregator_teaser_length', variable_get('teaser_length')); } + +/** + * Add queued flag. + */ +function aggregator_update_7002() { + db_add_field('aggregator_feed', 'queued', array( + 'type' => 'int', + 'not null' => TRUE, + 'default' => 0, + 'description' => 'Time when this feed was queued for refresh, 0 if not queued.', + )); + db_add_index('aggregator_feed', 'queued', array('queued')); +} \ No newline at end of file Index: modules/aggregator/aggregator.module =================================================================== RCS file: /cvs/drupal/drupal/modules/aggregator/aggregator.module,v retrieving revision 1.428 diff -u -p -r1.428 aggregator.module --- modules/aggregator/aggregator.module 1 Nov 2009 17:50:45 -0000 1.428 +++ modules/aggregator/aggregator.module 2 Nov 2009 01:23:08 -0000 @@ -309,14 +309,26 @@ function aggregator_permission() { * Queues news feeds for updates once their refresh interval has elapsed. */ function aggregator_cron() { - $result = db_query('SELECT * FROM {aggregator_feed} WHERE checked + refresh < :time AND refresh != :never', array( + $result = db_query('SELECT * FROM {aggregator_feed} WHERE queued = 0 AND checked + refresh < :time AND refresh != :never', array( ':time' => REQUEST_TIME, ':never' => AGGREGATOR_CLEAR_NEVER )); $queue = DrupalQueue::get('aggregator_feeds'); foreach ($result as $feed) { - $queue->createItem($feed); + if ($queue->createItem($feed)) { + // Flag feed as queued to avoid queueing it more than once. + db_update('aggregator_feed') + ->fields(array('queued' => REQUEST_TIME)) + ->condition('fid', $feed->fid) + ->execute(); + } } + + // Unflag queued items after 6 hours assuming that the update has failed. + db_update('aggregator_feed') + ->fields(array('queued' => 0)) + ->condition('queued', REQUEST_TIME - (3600 * 6), '<') + ->execute(); } /** @@ -607,6 +619,7 @@ function aggregator_refresh($feed) { 'hash' => md5($feed->source_string), 'etag' => empty($feed->etag) ? '' : $feed->etag, 'modified' => empty($feed->modified) ? 0 : $feed->modified, + 'queued' => 0, )) ->execute();