diff --git a/patches.json b/patches.json index 68e0a85..76969c6 100644 --- a/patches.json +++ b/patches.json @@ -271,6 +271,9 @@ "Fixes the error 'The file can't be deleted. Warning!unlink: No such file or directory' when flushing JS/CSS cache from the Admin": { ">=2.4.0 <2.4.1-p1": "MCLOUD-10279__errors_when_flushing_js_css_cache_from_admin__2.4.0.patch", ">=2.4.1-p1 <2.4.7": "MCLOUD-10279__errors_when_flushing_js_css_cache_from_admin__2.4.4.patch" + }, + "Reduced the number of times the same deployment configurations load": { + ">=2.4.6 <2.4.6-p2": "MCLOUD-10604__performance_degradation_around_deployment_configuration__2.4.6.patch" } }, "magento/module-paypal": { diff --git a/patches/MCLOUD-10604__performance_degradation_around_deployment_configuration__2.4.6.patch b/patches/MCLOUD-10604__performance_degradation_around_deployment_configuration__2.4.6.patch new file mode 100644 index 0000000..0f63865 --- /dev/null +++ b/patches/MCLOUD-10604__performance_degradation_around_deployment_configuration__2.4.6.patch @@ -0,0 +1,134 @@ +diff -Nuar a/vendor/magento/framework/App/DeploymentConfig.php b/vendor/magento/framework/App/DeploymentConfig.php +index 6713baa3a1d..64f32d5516b 100644 +--- a/vendor/magento/framework/App/DeploymentConfig.php ++++ b/vendor/magento/framework/App/DeploymentConfig.php +@@ -51,6 +51,16 @@ class DeploymentConfig + */ + private $overrideData; + ++ /** ++ * @var array ++ */ ++ private $envOverrides = []; ++ ++ /** ++ * @var array ++ */ ++ private $readerLoad = []; ++ + /** + * Constructor + * +@@ -84,7 +94,9 @@ class DeploymentConfig + } + $result = $this->getByKey($key); + if ($result === null) { +- $this->reloadData(); ++ if (empty($this->flatData) || count($this->getAllEnvOverrides())) { ++ $this->reloadData(); ++ } + $result = $this->getByKey($key); + } + return $result ?? $defaultValue; +@@ -114,13 +126,13 @@ class DeploymentConfig + { + if ($key === null) { + if (empty($this->data)) { +- $this->reloadData(); ++ $this->reloadInitialData(); + } + return $this->data; + } + $result = $this->getConfigDataByKey($key); + if ($result === null) { +- $this->reloadData(); ++ $this->reloadInitialData(); + $result = $this->getConfigDataByKey($key); + } + return $result; +@@ -170,28 +182,55 @@ class DeploymentConfig + * @throws FileSystemException + * @throws RuntimeException + */ +- private function reloadData(): void ++ private function reloadInitialData(): void + { ++ if (empty($this->readerLoad) || empty($this->data) || empty($this->flatData)) { ++ $this->readerLoad = $this->reader->load(); ++ } + $this->data = array_replace( +- $this->reader->load(), ++ $this->readerLoad, + $this->overrideData ?? [], + $this->getEnvOverride() + ); ++ } ++ ++ /** ++ * Loads the configuration data ++ * ++ * @return void ++ * @throws FileSystemException ++ * @throws RuntimeException ++ */ ++ private function reloadData(): void ++ { ++ $this->reloadInitialData(); + // flatten data for config retrieval using get() + $this->flatData = $this->flattenParams($this->data); ++ $this->flatData = $this->getAllEnvOverrides() + $this->flatData; ++ } + +- // allow reading values from env variables by convention +- // MAGENTO_DC_{path}, like db/connection/default/host => +- // can be overwritten by MAGENTO_DC_DB__CONNECTION__DEFAULT__HOST +- foreach (getenv() as $key => $value) { +- if (false !== \strpos($key, self::MAGENTO_ENV_PREFIX) +- && $key !== self::OVERRIDE_KEY +- ) { +- // convert MAGENTO_DC_DB__CONNECTION__DEFAULT__HOST into db/connection/default/host +- $flatKey = strtolower(str_replace([self::MAGENTO_ENV_PREFIX, '__'], ['', '/'], $key)); +- $this->flatData[$flatKey] = $value; ++ /** ++ * Load all getenv() configs once ++ * ++ * @return array ++ */ ++ private function getAllEnvOverrides(): array ++ { ++ if (empty($this->envOverrides)) { ++ // allow reading values from env variables by convention ++ // MAGENTO_DC_{path}, like db/connection/default/host => ++ // can be overwritten by MAGENTO_DC_DB__CONNECTION__DEFAULT__HOST ++ foreach (getenv() as $key => $value) { ++ if (false !== \strpos($key, self::MAGENTO_ENV_PREFIX) ++ && $key !== self::OVERRIDE_KEY ++ ) { ++ // convert MAGENTO_DC_DB__CONNECTION__DEFAULT__HOST into db/connection/default/host ++ $flatKey = strtolower(str_replace([self::MAGENTO_ENV_PREFIX, '__'], ['', '/'], $key)); ++ $this->envOverrides[$flatKey] = $value; ++ } + } + } ++ return $this->envOverrides; + } + + /** +diff -Nuar a/vendor/magento/framework/Module/ModuleList.php b/vendor/magento/framework/Module/ModuleList.php +index b3cf433bbaf..32e2d2b1550 100644 +--- a/vendor/magento/framework/Module/ModuleList.php ++++ b/vendor/magento/framework/Module/ModuleList.php +@@ -140,8 +140,11 @@ class ModuleList implements ModuleListInterface + */ + private function loadConfigData() + { +- if (null === $this->configData && null !== $this->config->get(ConfigOptionsListConstants::KEY_MODULES)) { +- $this->configData = $this->config->get(ConfigOptionsListConstants::KEY_MODULES); ++ if (null === $this->configData) { ++ $config = $this->config->get(ConfigOptionsListConstants::KEY_MODULES); ++ if (null !== $config) { ++ $this->configData = $config; ++ } + } + } + }