Skip to content

Commit 4cd55f5

Browse files
committed
Clean expired quotes - Fix out of memory on huge quotes list
1 parent 1031b3b commit 4cd55f5

File tree

1 file changed

+42
-4
lines changed

1 file changed

+42
-4
lines changed

app/code/Magento/Sales/Cron/CleanExpiredQuotes.php

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@
55
*/
66
namespace Magento\Sales\Cron;
77

8+
use Exception;
9+
use Magento\Quote\Model\QuoteRepository;
810
use Magento\Quote\Model\ResourceModel\Quote\Collection as QuoteCollection;
911
use Magento\Sales\Model\ResourceModel\Collection\ExpiredQuotesCollection;
1012
use Magento\Store\Model\StoreManagerInterface;
13+
use Psr\Log\LoggerInterface;
1114

1215
/**
1316
* Cron job for cleaning expired Quotes
@@ -24,16 +27,32 @@ class CleanExpiredQuotes
2427
*/
2528
private $storeManager;
2629

30+
/**
31+
* @var QuoteRepository
32+
*/
33+
private $quoteRepository;
34+
35+
/**
36+
* @var LoggerInterface
37+
*/
38+
private $logger;
39+
2740
/**
2841
* @param StoreManagerInterface $storeManager
2942
* @param ExpiredQuotesCollection $expiredQuotesCollection
43+
* @param QuoteRepository $quoteRepository
44+
* @param LoggerInterface $logger
3045
*/
3146
public function __construct(
3247
StoreManagerInterface $storeManager,
33-
ExpiredQuotesCollection $expiredQuotesCollection
48+
ExpiredQuotesCollection $expiredQuotesCollection,
49+
QuoteRepository $quoteRepository,
50+
LoggerInterface $logger
3451
) {
3552
$this->storeManager = $storeManager;
3653
$this->expiredQuotesCollection = $expiredQuotesCollection;
54+
$this->quoteRepository = $quoteRepository;
55+
$this->logger = $logger;
3756
}
3857

3958
/**
@@ -52,13 +71,32 @@ public function execute()
5271
// Last page returns 1 even when we don't have any results
5372
$lastPage = $quoteCollection->getSize() ? $quoteCollection->getLastPageNumber() : 0;
5473

55-
for ($currentPage = 1; $currentPage <= $lastPage; $currentPage++) {
74+
for ($currentPage = $lastPage; $currentPage >= 1; $currentPage--) {
5675
$quoteCollection->setCurPage($currentPage);
5776

58-
$quoteCollection->walk('delete');
77+
$this->deleteQuotes($quoteCollection);
78+
}
79+
}
80+
}
5981

60-
$quoteCollection->clear();
82+
/**
83+
* @param QuoteCollection $quoteCollection
84+
*/
85+
private function deleteQuotes(QuoteCollection $quoteCollection): void
86+
{
87+
foreach ($quoteCollection as $quote) {
88+
try {
89+
$this->quoteRepository->delete($quote);
90+
} catch (Exception $e) {
91+
$message = sprintf(
92+
'Unable to delete expired quote (ID: %s): %s',
93+
$quote->getId(),
94+
(string)$e
95+
);
96+
$this->logger->error($message);
6197
}
6298
}
99+
100+
$quoteCollection->clear();
63101
}
64102
}

0 commit comments

Comments
 (0)