protected function result()
 {
     $args = $this->input();
     if (!isset($args['queue'])) {
         return new WP_Error('invalid_queue', 'Queue name is required', 400);
     }
     if (!in_array($args['queue'], array('sync', 'full_sync'))) {
         return new WP_Error('invalid_queue', 'Queue name should be sync or full_sync', 400);
     }
     require_once JETPACK__PLUGIN_DIR . 'sync/class.jetpack-sync-queue.php';
     $queue = new Jetpack_Sync_Queue($args['queue']);
     // False means that there was no lock to delete.
     $response = $queue->unlock();
     return array('success' => $response);
 }
 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', '');
 }
 function test_queue_is_persisted()
 {
     $other_queue = new Jetpack_Sync_Queue($this->queue->id);
     $this->queue->add('foo');
     $this->assertEquals(array('foo'), $other_queue->checkout(5)->get_item_values());
 }