Skip to content
Snippets Groups Projects
Commit 83e1aa9d authored by catch's avatar catch
Browse files

Issue #3469792 by amateescu, antonnavi, smustgrave, djdevin, quietone:...

Issue #3469792 by amateescu, antonnavi, smustgrave, djdevin, quietone: Workspaces with thousands of items can't be published
parent 4548e070
No related branches found
No related tags found
No related merge requests found
......@@ -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;
}
}
}
}
......
......@@ -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;
}
}
}
});
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment