function continue_enqueuing($configs = null, $enqueue_status = null) { if (!$this->is_started() || $this->get_status_option('queue_finished')) { return; } // if full sync queue is full, don't enqueue more items $max_queue_size_full_sync = Jetpack_Sync_Settings::get_setting('max_queue_size_full_sync'); $full_sync_queue = new Jetpack_Sync_Queue('full_sync'); $available_queue_slots = $max_queue_size_full_sync - $full_sync_queue->size(); if ($available_queue_slots <= 0) { return; } else { $remaining_items_to_enqueue = min(Jetpack_Sync_Settings::get_setting('max_enqueue_full_sync'), $available_queue_slots); } if (!$configs) { $configs = $this->get_config(); } if (!$enqueue_status) { $enqueue_status = $this->get_enqueue_status(); } foreach (Jetpack_Sync_Modules::get_modules() as $module) { $module_name = $module->name(); // skip module if not configured for this sync or module is done if (!isset($configs[$module_name]) || !$configs[$module_name] || !$enqueue_status[$module_name] || true === $enqueue_status[$module_name][2]) { continue; } list($items_enqueued, $next_enqueue_state) = $module->enqueue_full_sync_actions($configs[$module_name], $remaining_items_to_enqueue, $enqueue_status[$module_name][2]); $enqueue_status[$module_name][2] = $next_enqueue_state; // if items were processed, subtract them from the limit if (!is_null($items_enqueued) && $items_enqueued > 0) { $enqueue_status[$module_name][1] += $items_enqueued; $remaining_items_to_enqueue -= $items_enqueued; } // stop processing if we've reached our limit of items to enqueue if (0 >= $remaining_items_to_enqueue) { $this->set_enqueue_status($enqueue_status); return; } } $this->set_enqueue_status($enqueue_status); // setting autoload to true means that it's faster to check whether we should continue enqueuing $this->update_status_option('queue_finished', time(), true); /** * Fires when a full sync ends. This action is serialized * and sent to the server with checksums so that we can confirm the * sync was successful. * * @since 4.2.0 */ do_action('jetpack_full_sync_end', ''); }
protected function result() { $args = $this->input(); $queue_name = $this->validate_queue($args['queue']); if (is_wp_error($queue_name)) { return $queue_name; } if ($args['number_of_items'] < 1 || $args['number_of_items'] > 100) { return new WP_Error('invalid_number_of_items', 'Number of items needs to be an integer that is larger than 0 and less then 100', 400); } require_once JETPACK__PLUGIN_DIR . 'sync/class.jetpack-sync-queue.php'; $queue = new Jetpack_Sync_Queue($queue_name); if (0 === $queue->size()) { return new WP_Error('queue_size', 'The queue is empty and there is nothing to send', 400); } require_once JETPACK__PLUGIN_DIR . 'sync/class.jetpack-sync-sender.php'; $sender = Jetpack_Sync_Sender::get_instance(); // try to give ourselves as much time as possible set_time_limit(0); // let's delete the checkin state if ($args['force']) { $queue->unlock(); } $buffer = $this->get_buffer($queue, $args['number_of_items']); // Check that the $buffer is not checkout out already if (is_wp_error($buffer)) { return new WP_Error('buffer_open', "We couldn't get the buffer it is currently checked out", 400); } if (!is_object($buffer)) { return new WP_Error('buffer_non-object', 'Buffer is not an object', 400); } Jetpack_Sync_Settings::set_is_syncing(true); list($items_to_send, $skipped_items_ids, $items) = $sender->get_items_to_send($buffer, $args['encode']); Jetpack_Sync_Settings::set_is_syncing(false); return array('buffer_id' => $buffer->id, 'items' => $items_to_send, 'skipped_items' => $skipped_items_ids, 'codec' => $args['encode'] ? $sender->get_codec()->name() : null, 'sent_timestamp' => time()); }