Issue #3469792 by amateescu, antonnavi, smustgrave, djdevin, quietone: Workspaces with thousands of items can't be published

merge-requests/9800/head
catch 2024-10-10 11:28:16 +01:00
parent 4548e07086
commit 83e1aa9da3
2 changed files with 26 additions and 2 deletions

View File

@ -4,6 +4,7 @@ namespace Drupal\workspaces;
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 @@ class WorkspaceMerger implements WorkspaceMergerInterface {
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 @@ class WorkspaceMerger implements WorkspaceMergerInterface {
$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;
}
}
}
}

View File

@ -4,6 +4,7 @@ namespace Drupal\workspaces;
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 @@ class WorkspacePublisher implements WorkspacePublisherInterface {
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 @@ class WorkspacePublisher implements WorkspacePublisherInterface {
$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;
}
}
}
});