diff --git a/feeds.module b/feeds.module index e4b0856..cba702d 100644 --- a/feeds.module +++ b/feeds.module @@ -96,6 +96,7 @@ function feeds_cron_queue_info() { $queues = array(); $queues['feeds_source_import'] = array( 'worker callback' => 'feeds_source_import', + 'time' => 60, ); $queues['feeds_source_clear'] = array( 'worker callback' => 'feeds_source_clear', diff --git a/includes/FeedsSource.inc b/includes/FeedsSource.inc index ec8a6cf..4117925 100644 --- a/includes/FeedsSource.inc +++ b/includes/FeedsSource.inc @@ -290,19 +290,23 @@ class FeedsSource extends FeedsConfigurable { if (is_numeric($fetcher_period)) { $period = $fetcher_period; } - // Schedule as soon as possible if a batch is active. - $period = $this->progressImporting() === FEEDS_BATCH_COMPLETE ? $period : 0; $job = array( 'type' => $this->id, 'id' => $this->feed_nid, 'period' => $period, 'periodic' => TRUE, ); - if ($period != FEEDS_SCHEDULE_NEVER) { + if ($period == FEEDS_SCHEDULE_NEVER) { + JobScheduler::get('feeds_source_import')->remove($job); + } + elseif ($this->progressImporting() === FEEDS_BATCH_COMPLETE) { JobScheduler::get('feeds_source_import')->set($job); } else { - JobScheduler::get('feeds_source_import')->remove($job); + // Feed is not fully imported yet, so we put this job back in the queue + // immediately for further processing. + $queue = DrupalQueue::get('feeds_source_import'); + $queue->createItem($job); } } diff --git a/tests/feeds_scheduler.test b/tests/feeds_scheduler.test index afab3db..3eef89c 100644 --- a/tests/feeds_scheduler.test +++ b/tests/feeds_scheduler.test @@ -227,23 +227,17 @@ class FeedsSchedulerTestCase extends FeedsWebTestCase { db_query("UPDATE {job_schedule} SET next = 0"); $this->drupalPost('import/node/delete-items', array(), 'Delete'); - $this->assertEqual(0, db_query("SELECT COUNT(*) FROM {node} WHERE type = 'article'")->fetchField()); + $node_count = db_query("SELECT COUNT(*) FROM {node} WHERE type = 'article'")->fetchField(); + $this->assertEqual(0, $node_count); - // Hit cron (item count / limit) times, assert correct number of articles. - for ($i = 0; $i < ceil(86 / $limit); $i++) { + // Hit cron for importing, until we have all items. + while ($node_count < 86) { $this->cronRun(); - sleep(1); - if ($limit * ($i + 1) < 86) { - $count = $limit * ($i + 1); - $period = 0; // Import should be rescheduled for ASAP. - } - else { - $count = 86; // We've reached our total of 86. - $period = 1800; // Hence we should find the Source's default period. - } - $this->assertEqual($count, db_query("SELECT COUNT(*) FROM {node} WHERE type = 'article'")->fetchField()); - $this->assertEqual($period, db_query("SELECT period FROM {job_schedule} WHERE type = 'node' AND id = 0")->fetchField()); + $node_count = db_query("SELECT COUNT(*) FROM {node} WHERE type = 'article'")->fetchField(); } + $this->assertEqual(86, db_query("SELECT COUNT(*) FROM {node} WHERE type = 'article'")->fetchField(), 'Number of nodes is correct after batched importing via cron.'); + // Import should be rescheduled for 1800 seconds. + $this->assertEqual(1800, db_query("SELECT period FROM {job_schedule} WHERE type = 'node' AND id = 0")->fetchField()); } // Delete a couple of nodes, then hit cron again. They should not be replaced