Skip to content

Commit e3652d6

Browse files
committed
ACP2E-4303: Reindexing stuck due to high memory usage
1 parent 6be87d9 commit e3652d6

File tree

4 files changed

+74
-1
lines changed

4 files changed

+74
-1
lines changed

app/code/Magento/CatalogRule/Model/Indexer/IndexBuilder.php

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
use Magento\CatalogRule\Model\ResourceModel\Rule\RuleIdProvider;
2121
use Magento\CatalogRule\Model\Rule;
2222
use Magento\CatalogRule\Model\RuleFactory;
23+
use Magento\Customer\Api\GroupExcludedWebsiteRepositoryInterface;
2324
use Magento\Eav\Model\Config;
2425
use Magento\Framework\App\ObjectManager;
2526
use Magento\Framework\App\ResourceConnection;
@@ -214,6 +215,11 @@ class IndexBuilder
214215
*/
215216
private $ruleFactory;
216217

218+
/**
219+
* @var GroupExcludedWebsiteRepositoryInterface
220+
*/
221+
private $groupExcludedWebsiteRepository;
222+
217223
/**
218224
* @param RuleCollectionFactory $ruleCollectionFactory
219225
* @param PriceCurrencyInterface $priceCurrency
@@ -243,6 +249,7 @@ class IndexBuilder
243249
* @param CatalogRuleInsertBatchSizeCalculator|null $insertBatchSizeCalculator
244250
* @param RuleIdProvider|null $ruleIdProvider
245251
* @param RuleFactory|null $ruleFactory
252+
* @param GroupExcludedWebsiteRepositoryInterface|null $groupExcludedWebsiteRepository
246253
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
247254
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
248255
*/
@@ -274,7 +281,8 @@ public function __construct(
274281
?DynamicBatchSizeCalculator $batchSizeCalculator = null,
275282
?CatalogRuleInsertBatchSizeCalculator $insertBatchSizeCalculator = null,
276283
?RuleIdProvider $ruleIdProvider = null,
277-
?RuleFactory $ruleFactory = null
284+
?RuleFactory $ruleFactory = null,
285+
?GroupExcludedWebsiteRepositoryInterface $groupExcludedWebsiteRepository = null
278286
) {
279287
$this->resource = $resource;
280288
$this->connection = $resource->getConnection();
@@ -331,6 +339,8 @@ public function __construct(
331339
ObjectManager::getInstance()->get(RuleIdProvider::class);
332340
$this->ruleFactory = $ruleFactory ??
333341
ObjectManager::getInstance()->get(RuleFactory::class);
342+
$this->groupExcludedWebsiteRepository = $groupExcludedWebsiteRepository ??
343+
ObjectManager::getInstance()->get(GroupExcludedWebsiteRepositoryInterface::class);
334344
}
335345

336346
/**
@@ -443,13 +453,20 @@ protected function doReindexFull()
443453
{
444454
$dynamicBatchCount = $this->insertBatchSizeCalculator->getInsertBatchSize($this->connection);
445455
$ruleIds = $this->getActiveRuleIds();
456+
457+
$allExcludedWebsites = $this->groupExcludedWebsiteRepository->getAllExcludedWebsites();
458+
446459
foreach ($ruleIds as $ruleId) {
447460

448461
$rule = $this->loadRuleById($ruleId);
449462
if (!$rule) {
450463
$this->logger->warning("Rule ID {$ruleId} not found, skipping");
451464
continue;
452465
}
466+
467+
$ruleExcludedWebsites = $this->filterExcludedWebsitesForRule($rule, $allExcludedWebsites);
468+
$rule->setData('excluded_website_ids', $ruleExcludedWebsites);
469+
453470
$this->reindexRuleProduct->execute($rule, $dynamicBatchCount, true);
454471

455472
$rule->clearInstance();
@@ -780,6 +797,33 @@ protected function loadRuleById($ruleId)
780797
return $rule->getId() ? $rule : null;
781798
}
782799

800+
/**
801+
* Filter excluded websites for a specific rule based on its customer groups
802+
*
803+
* @param Rule $rule
804+
* @param array $allExcludedWebsites
805+
* @return array
806+
*/
807+
private function filterExcludedWebsitesForRule(Rule $rule, array $allExcludedWebsites): array
808+
{
809+
$ruleExcludedWebsites = [];
810+
$customerGroupIds = $rule->getCustomerGroupIds();
811+
812+
if (empty($customerGroupIds) || empty($allExcludedWebsites)) {
813+
return $ruleExcludedWebsites;
814+
}
815+
816+
foreach ($customerGroupIds as $customerGroupId) {
817+
if (isset($allExcludedWebsites[$customerGroupId])) {
818+
foreach ($allExcludedWebsites[$customerGroupId] as $websiteId) {
819+
$ruleExcludedWebsites[$websiteId] = $websiteId;
820+
}
821+
}
822+
}
823+
824+
return array_values($ruleExcludedWebsites);
825+
}
826+
783827
/**
784828
* Get active rules
785829
*

app/code/Magento/CatalogRule/Model/Indexer/ReindexRuleProduct.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,9 +173,12 @@ private function prepareRuleData(Rule $rule): array
173173
$toTimeInAdminTz = $this->parseDateByWebsiteTz((string)$rule->getToDate(), self::ADMIN_WEBSITE_ID);
174174

175175
$excludedWebsites = [];
176+
176177
$ruleExtensionAttributes = $rule->getExtensionAttributes();
177178
if ($ruleExtensionAttributes && $ruleExtensionAttributes->getExcludeWebsiteIds()) {
178179
$excludedWebsites = $ruleExtensionAttributes->getExcludeWebsiteIds();
180+
} elseif ($rule->hasData('excluded_website_ids')) {
181+
$excludedWebsites = $rule->getData('excluded_website_ids') ?: [];
179182
}
180183

181184
return [

app/code/Magento/CatalogRule/Model/ResourceModel/Product/AttributeValuesLoader.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,4 +232,17 @@ private function evictOldBatchesIfNeeded(): void
232232
}
233233
}
234234
}
235+
236+
/**
237+
* Reset all loaded data and clear cache
238+
*
239+
* @return void
240+
*/
241+
public function resetCache(): void
242+
{
243+
$this->loadedData = [];
244+
$this->loadedBatches = [];
245+
$this->batchQueue = [];
246+
$this->totalCount = null;
247+
}
235248
}

app/code/Magento/CatalogRule/Model/ResourceModel/Product/Collection.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,4 +131,17 @@ public function getAllAttributeValues($attribute)
131131

132132
return $this->loaderCache[$attributeId];
133133
}
134+
135+
/**
136+
* Clear attribute loader cache
137+
*
138+
* @return void
139+
*/
140+
public function __destruct()
141+
{
142+
foreach ($this->loaderCache as $loader) {
143+
$loader->resetCache();
144+
}
145+
$this->loaderCache = [];
146+
}
134147
}

0 commit comments

Comments
 (0)