From 08a4f0fbb0e9d412c758111c60b303b39e9f4fd4 Mon Sep 17 00:00:00 2001 From: catch Date: Wed, 15 Dec 2021 16:38:51 +0000 Subject: [PATCH] Issue #3254403 by paulmckibben, ranjith_kumar_k_u, longwave, Lendude, cilefen: system_post_update_sort_all_config can exhaust PHP memory in 9.3.0 (cherry picked from commit d55c0cbd36efffbd5381d516bd6fe92a6933cad1) --- core/modules/system/system.post_update.php | 25 +++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/core/modules/system/system.post_update.php b/core/modules/system/system.post_update.php index 0cc50521c1a..7ddcda6476b 100644 --- a/core/modules/system/system.post_update.php +++ b/core/modules/system/system.post_update.php @@ -5,6 +5,7 @@ * Post update functions for System. */ +use Drupal\Core\Site\Settings; use Drupal\Core\Config\Entity\ConfigEntityUpdater; use Drupal\Core\Entity\Display\EntityDisplayInterface; use Drupal\Core\Entity\Display\EntityViewDisplayInterface; @@ -208,9 +209,27 @@ function system_post_update_delete_authorize_settings() { /** * Sort all configuration according to its schema. */ -function system_post_update_sort_all_config() { +function system_post_update_sort_all_config(&$sandbox) { $factory = \Drupal::configFactory(); - foreach ($factory->listAll() as $name) { - $factory->getEditable($name)->save(); + $iteration_size = Settings::get('entity_update_batch_size', 50); + + if (empty($sandbox['progress'])) { + $sandbox['progress'] = 0; + $sandbox['all_config_names'] = $factory->listAll(); + $sandbox['max'] = count($sandbox['all_config_names']); + } + + $start = $sandbox['progress']; + $end = min($sandbox['max'], $start + $iteration_size); + for ($i = $start; $i < $end; $i++) { + $factory->getEditable($sandbox['all_config_names'][$i])->save(); + } + + if ($sandbox['max'] > 0 && $end < $sandbox['max']) { + $sandbox['progress'] = $end; + $sandbox['#finished'] = ($end - 1) / $sandbox['max']; + } + else { + $sandbox['#finished'] = 1; } }