diff --git a/core/modules/workspaces/src/WorkspaceMerger.php b/core/modules/workspaces/src/WorkspaceMerger.php index 0cf34c3e26d36a1697ecfc3d15c5a4a19b8e21f5..56a198ee0d898e82e68c6982772973247e341022 100644 --- a/core/modules/workspaces/src/WorkspaceMerger.php +++ b/core/modules/workspaces/src/WorkspaceMerger.php @@ -4,6 +4,7 @@ use Drupal\Core\Database\Connection; use Drupal\Core\Entity\EntityTypeManagerInterface; +use Drupal\Core\Site\Settings; use Drupal\Core\Utility\Error; use Psr\Log\LoggerInterface; @@ -31,6 +32,10 @@ public function merge() { try { $transaction = $this->database->startTransaction(); + $max_execution_time = ini_get('max_execution_time'); + $step_size = Settings::get('entity_update_batch_size', 50); + $counter = 0; + foreach ($this->getDifferringRevisionIdsOnSource() as $entity_type_id => $revision_difference) { $entity_type = $this->entityTypeManager->getDefinition($entity_type_id); $revisions_on_source = $this->entityTypeManager->getStorage($entity_type_id) @@ -48,6 +53,14 @@ public function merge() { $revision->{$field_name}->target_id = $this->targetWorkspace->id(); $revision->setSyncing(TRUE); $revision->save(); + $counter++; + + // Extend the execution time in order to allow processing workspaces + // that contain a large number of items. + if ((int) ($counter / $step_size) >= 1) { + set_time_limit($max_execution_time); + $counter = 0; + } } } } diff --git a/core/modules/workspaces/src/WorkspacePublisher.php b/core/modules/workspaces/src/WorkspacePublisher.php index 1c568b46b41b9a367d316a99723c1026c9a4f711..f8610247269386eb1fe135a547458a27bea303a6 100644 --- a/core/modules/workspaces/src/WorkspacePublisher.php +++ b/core/modules/workspaces/src/WorkspacePublisher.php @@ -4,6 +4,7 @@ use Drupal\Core\Database\Connection; use Drupal\Core\Entity\EntityTypeManagerInterface; +use Drupal\Core\Site\Settings; use Drupal\Core\StringTranslation\StringTranslationTrait; use Drupal\Core\Utility\Error; use Drupal\workspaces\Event\WorkspacePostPublishEvent; @@ -45,9 +46,11 @@ public function publish() { try { $transaction = $this->database->startTransaction(); - // @todo Handle the publishing of a workspace with a batch operation in - // https://www.drupal.org/node/2958752. $this->workspaceManager->executeOutsideWorkspace(function () use ($tracked_entities) { + $max_execution_time = ini_get('max_execution_time'); + $step_size = Settings::get('entity_update_batch_size', 50); + $counter = 0; + foreach ($tracked_entities as $entity_type_id => $revision_difference) { $entity_revisions = $this->entityTypeManager->getStorage($entity_type_id) ->loadMultipleRevisions(array_keys($revision_difference)); @@ -68,6 +71,14 @@ public function publish() { $entity->original = $default_revisions[$entity->id()]; $entity->save(); + $counter++; + + // Extend the execution time in order to allow processing workspaces + // that contain a large number of items. + if ((int) ($counter / $step_size) >= 1) { + set_time_limit($max_execution_time); + $counter = 0; + } } } });