Skip to content

Commit 168f7df

Browse files
MAGETWO-65388: Indexation process in non-locking way for stock indexer
1 parent a45efb9 commit 168f7df

File tree

30 files changed

+486
-38
lines changed

30 files changed

+486
-38
lines changed

app/code/Magento/Bundle/Model/ResourceModel/Indexer/Stock.php

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,36 @@
1414
*/
1515
class Stock extends \Magento\CatalogInventory\Model\ResourceModel\Indexer\Stock\DefaultStock
1616
{
17+
/**
18+
* @var \Magento\CatalogInventory\Model\ResourceModel\Indexer\Stock\FrontendResource
19+
*/
20+
private $indexerStockFrontendResource;
21+
22+
/**
23+
* Class constructor
24+
*
25+
* @param \Magento\Framework\Model\ResourceModel\Db\Context $context
26+
* @param \Magento\Framework\Indexer\Table\StrategyInterface $tableStrategy
27+
* @param \Magento\Eav\Model\Config $eavConfig
28+
* @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
29+
* @param string $connectionName
30+
* @param null|\Magento\Indexer\Model\Indexer\StateFactory $stateFactory
31+
* @param null|\Magento\Indexer\Model\ResourceModel\FrontendResource $indexerStockFrontendResource
32+
*/
33+
public function __construct(
34+
\Magento\Framework\Model\ResourceModel\Db\Context $context,
35+
\Magento\Framework\Indexer\Table\StrategyInterface $tableStrategy,
36+
\Magento\Eav\Model\Config $eavConfig,
37+
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
38+
$connectionName = null,
39+
\Magento\Indexer\Model\Indexer\StateFactory $stateFactory = null,
40+
\Magento\Indexer\Model\ResourceModel\FrontendResource $indexerStockFrontendResource = null
41+
) {
42+
$this->indexerStockFrontendResource = $indexerStockFrontendResource ?: ObjectManager::getInstance()
43+
->get(\Magento\CatalogInventory\Model\ResourceModel\Indexer\Stock\FrontendResource::class);
44+
parent::__construct($context, $tableStrategy, $eavConfig, $scopeConfig, $connectionName, $stateFactory);
45+
}
46+
1747
/**
1848
* Retrieve table name for temporary bundle option stock index
1949
*
@@ -35,7 +65,7 @@ protected function _prepareBundleOptionStockData($entityIds = null, $usePrimaryT
3565
{
3666
$this->_cleanBundleOptionStockData();
3767
$linkField = $this->getMetadataPool()->getMetadata(ProductInterface::class)->getLinkField();
38-
$idxTable = $usePrimaryTable ? $this->getMainTable() : $this->getIdxTable();
68+
$idxTable = $usePrimaryTable ? $this->indexerStockFrontendResource->getMainTable() : $this->getIdxTable();
3969
$connection = $this->getConnection();
4070
$select = $connection->select()->from(
4171
['product' => $this->getTable('catalog_product_entity')],

app/code/Magento/Bundle/Model/ResourceModel/Selection/Collection.php

Lines changed: 98 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,14 @@
88
use Magento\Customer\Api\GroupManagementInterface;
99
use Magento\Framework\DataObject;
1010
use Magento\Framework\DB\Select;
11+
use Magento\Framework\EntityManager\MetadataPool;
12+
use Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitationFactory;
13+
use Magento\Framework\App\ObjectManager;
1114

1215
/**
1316
* Bundle Selections Resource Collection
17+
*
18+
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
1419
*/
1520
class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
1621
{
@@ -38,6 +43,98 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
3843
*/
3944
private $websiteScopePriceJoined = false;
4045

46+
/**
47+
* @var \Magento\CatalogInventory\Model\ResourceModel\Indexer\Stock\FrontendResource
48+
*/
49+
private $indexerStockFrontendResource;
50+
51+
/**
52+
* Collection constructor
53+
*
54+
* @param \Magento\Framework\Data\Collection\EntityFactory $entityFactory
55+
* @param \Psr\Log\LoggerInterface $logger
56+
* @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy
57+
* @param \Magento\Framework\Event\ManagerInterface $eventManager
58+
* @param \Magento\Eav\Model\Config $eavConfig
59+
* @param \Magento\Framework\App\ResourceConnection $resource
60+
* @param \Magento\Eav\Model\EntityFactory $eavEntityFactory
61+
* @param \Magento\Catalog\Model\ResourceModel\Helper $resourceHelper
62+
* @param \Magento\Framework\Validator\UniversalFactory $universalFactory
63+
* @param \Magento\Store\Model\StoreManagerInterface $storeManager
64+
* @param \Magento\Framework\Module\Manager $moduleManager
65+
* @param \Magento\Catalog\Model\Indexer\Product\Flat\State $catalogProductFlatState
66+
* @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
67+
* @param \Magento\Catalog\Model\Product\OptionFactory $productOptionFactory
68+
* @param \Magento\Catalog\Model\ResourceModel\Url $catalogUrl
69+
* @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate
70+
* @param \Magento\Customer\Model\Session $customerSession
71+
* @param \Magento\Framework\Stdlib\DateTime $dateTime
72+
* @param GroupManagementInterface $groupManagement
73+
* @param \Magento\Framework\DB\Adapter\AdapterInterface|null $connection
74+
* @param ProductLimitationFactory|null $productLimitationFactory
75+
* @param MetadataPool|null $metadataPool
76+
* @param null|\Magento\Indexer\Model\ResourceModel\FrontendResource $indexerFrontendResource
77+
* @param null|\Magento\Indexer\Model\ResourceModel\FrontendResource $indexerStockFrontendResource
78+
*
79+
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
80+
* @SuppressWarnings(Magento.TypeDuplication)
81+
*/
82+
public function __construct(
83+
\Magento\Framework\Data\Collection\EntityFactory $entityFactory,
84+
\Psr\Log\LoggerInterface $logger,
85+
\Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
86+
\Magento\Framework\Event\ManagerInterface $eventManager,
87+
\Magento\Eav\Model\Config $eavConfig,
88+
\Magento\Framework\App\ResourceConnection $resource,
89+
\Magento\Eav\Model\EntityFactory $eavEntityFactory,
90+
\Magento\Catalog\Model\ResourceModel\Helper $resourceHelper,
91+
\Magento\Framework\Validator\UniversalFactory $universalFactory,
92+
\Magento\Store\Model\StoreManagerInterface $storeManager,
93+
\Magento\Framework\Module\Manager $moduleManager,
94+
\Magento\Catalog\Model\Indexer\Product\Flat\State $catalogProductFlatState,
95+
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
96+
\Magento\Catalog\Model\Product\OptionFactory $productOptionFactory,
97+
\Magento\Catalog\Model\ResourceModel\Url $catalogUrl,
98+
\Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,
99+
\Magento\Customer\Model\Session $customerSession,
100+
\Magento\Framework\Stdlib\DateTime $dateTime,
101+
GroupManagementInterface $groupManagement,
102+
\Magento\Framework\DB\Adapter\AdapterInterface $connection = null,
103+
ProductLimitationFactory $productLimitationFactory = null,
104+
MetadataPool $metadataPool = null,
105+
\Magento\Indexer\Model\ResourceModel\FrontendResource $indexerFrontendResource = null,
106+
\Magento\Indexer\Model\ResourceModel\FrontendResource $indexerStockFrontendResource = null
107+
) {
108+
109+
$this->indexerStockFrontendResource = $indexerStockFrontendResource ?: ObjectManager::getInstance()
110+
->get(\Magento\CatalogInventory\Model\ResourceModel\Indexer\Stock\FrontendResource::class);
111+
parent::__construct(
112+
$entityFactory,
113+
$logger,
114+
$fetchStrategy,
115+
$eventManager,
116+
$eavConfig,
117+
$resource,
118+
$eavEntityFactory,
119+
$resourceHelper,
120+
$universalFactory,
121+
$storeManager,
122+
$moduleManager,
123+
$catalogProductFlatState,
124+
$scopeConfig,
125+
$productOptionFactory,
126+
$catalogUrl,
127+
$localeDate,
128+
$customerSession,
129+
$dateTime,
130+
$groupManagement,
131+
$connection,
132+
$productLimitationFactory,
133+
$metadataPool,
134+
$indexerFrontendResource
135+
);
136+
}
137+
41138
/**
42139
* Initialize collection
43140
*
@@ -162,7 +259,7 @@ public function addQuantityFilter()
162259
{
163260
$this->getSelect()
164261
->joinInner(
165-
['stock' => $this->getTable('cataloginventory_stock_status')],
262+
['stock' => $this->indexerStockFrontendResource->getMainTable()],
166263
'selection.product_id = stock.product_id',
167264
[]
168265
)

app/code/Magento/Bundle/composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
"magento/framework": "100.2.*",
1919
"magento/module-quote": "100.2.*",
2020
"magento/module-media-storage": "100.2.*",
21-
"magento/module-ui": "100.2.*"
21+
"magento/module-ui": "100.2.*",
22+
"magento/module-indexer": "100.2.*"
2223
},
2324
"suggest": {
2425
"magento/module-webapi": "100.2.*",

app/code/Magento/Bundle/etc/di.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,4 +151,9 @@
151151
</argument>
152152
</arguments>
153153
</type>
154+
<type name="Magento\Bundle\Model\ResourceModel\Selection\Collection">
155+
<arguments>
156+
<argument name="indexerStockFrontendResource" xsi:type="object">Magento\CatalogInventory\Model\ResourceModel\Indexer\Stock\FrontendResource</argument>
157+
</arguments>
158+
</type>
154159
</config>

app/code/Magento/CatalogInventory/Model/Indexer/Stock/AbstractAction.php

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,25 +70,34 @@ abstract class AbstractAction
7070
*/
7171
private $cacheCleaner;
7272

73+
/**
74+
* @var \Magento\CatalogInventory\Model\ResourceModel\Indexer\Stock\FrontendResource
75+
*/
76+
private $indexerStockFrontendResource;
77+
7378
/**
7479
* @param ResourceConnection $resource
7580
* @param \Magento\CatalogInventory\Model\ResourceModel\Indexer\StockFactory $indexerFactory
7681
* @param \Magento\Catalog\Model\Product\Type $catalogProductType
7782
* @param \Magento\Framework\Indexer\CacheContext $cacheContext
7883
* @param \Magento\Framework\Event\ManagerInterface $eventManager
84+
* @param null|\Magento\Indexer\Model\ResourceModel\FrontendResource $indexerStockFrontendResource
7985
*/
8086
public function __construct(
8187
ResourceConnection $resource,
8288
\Magento\CatalogInventory\Model\ResourceModel\Indexer\StockFactory $indexerFactory,
8389
\Magento\Catalog\Model\Product\Type $catalogProductType,
8490
\Magento\Framework\Indexer\CacheContext $cacheContext,
85-
\Magento\Framework\Event\ManagerInterface $eventManager
91+
\Magento\Framework\Event\ManagerInterface $eventManager,
92+
\Magento\Indexer\Model\ResourceModel\FrontendResource $indexerStockFrontendResource = null
8693
) {
8794
$this->_resource = $resource;
8895
$this->_indexerFactory = $indexerFactory;
8996
$this->_catalogProductType = $catalogProductType;
9097
$this->cacheContext = $cacheContext;
9198
$this->eventManager = $eventManager;
99+
$this->indexerStockFrontendResource = $indexerStockFrontendResource ?: ObjectManager::getInstance()
100+
->get(\Magento\CatalogInventory\Model\ResourceModel\Indexer\Stock\FrontendResource::class);
92101
}
93102

94103
/**
@@ -186,7 +195,7 @@ public function reindexAll()
186195
protected function _syncData()
187196
{
188197
$idxTableName = $this->_getIdxTable();
189-
$tableName = $this->_getTable('cataloginventory_stock_status');
198+
$tableName = $this->indexerStockFrontendResource->getMainTable();
190199

191200
$this->_deleteOldRelations($tableName);
192201

app/code/Magento/CatalogInventory/Model/Indexer/Stock/Action/Full.php

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@
1919
use Magento\Framework\App\ObjectManager;
2020
use Magento\Framework\Exception\LocalizedException;
2121
use Magento\CatalogInventory\Model\Indexer\Stock\AbstractAction;
22+
use Magento\Indexer\Model\ResourceModel\FrontendResource;
2223

2324
/**
2425
* Class Full reindex action
2526
*
2627
* @package Magento\CatalogInventory\Model\Indexer\Stock\Action
28+
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
2729
*/
2830
class Full extends AbstractAction
2931
{
@@ -53,23 +55,34 @@ class Full extends AbstractAction
5355
* @param ProductType $catalogProductType
5456
* @param CacheContext $cacheContext
5557
* @param EventManager $eventManager
58+
* @param null|\Magento\Indexer\Model\ResourceModel\FrontendResource $indexerStockFrontendResource
5659
* @param MetadataPool|null $metadataPool
5760
* @param BatchCalculator|null $batchSizeCalculator
5861
* @param BatchProviderInterface|null $batchProvider
5962
* @param array $memoryTablesMinRows
63+
*
64+
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
6065
*/
6166
public function __construct(
6267
ResourceConnection $resource,
6368
StockFactory $indexerFactory,
6469
ProductType $catalogProductType,
6570
CacheContext $cacheContext,
6671
EventManager $eventManager,
72+
FrontendResource $indexerStockFrontendResource = null,
6773
MetadataPool $metadataPool = null,
6874
BatchCalculator $batchSizeCalculator = null,
6975
BatchProviderInterface $batchProvider = null,
7076
array $memoryTablesMinRows = []
7177
) {
72-
parent::__construct($resource, $indexerFactory, $catalogProductType, $cacheContext, $eventManager);
78+
parent::__construct(
79+
$resource,
80+
$indexerFactory,
81+
$catalogProductType,
82+
$cacheContext,
83+
$eventManager,
84+
$indexerStockFrontendResource
85+
);
7386

7487
$this->metadataPool = $metadataPool ?: ObjectManager::getInstance()->get(MetadataPool::class);
7588
$this->batchProvider = $batchProvider ?: ObjectManager::getInstance()->get(BatchProviderInterface::class);
@@ -93,12 +106,12 @@ public function execute($ids = null)
93106
$this->useIdxTable(false);
94107
$entityMetadata = $this->metadataPool->getMetadata(\Magento\Catalog\Api\Data\ProductInterface::class);
95108

96-
$tableName = $this->_getTable('cataloginventory_stock_status');
97109
$columns = array_keys($this->_getConnection()->describeTable($this->_getIdxTable()));
98110

99111
/** @var \Magento\Catalog\Model\ResourceModel\Product\Indexer\AbstractIndexer $indexer */
100112
foreach ($this->_getTypeIndexers() as $indexer) {
101113
$connection = $indexer->getConnection();
114+
$tableName = $indexer->getMainTable();
102115

103116
$memoryTableMinRows = isset($this->memoryTablesMinRows[$indexer->getTypeId()])
104117
? $this->memoryTablesMinRows[$indexer->getTypeId()]

app/code/Magento/CatalogInventory/Model/Indexer/Stock/CacheCleaner.php

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Magento\Framework\Indexer\CacheContext;
1616
use Magento\CatalogInventory\Model\Stock;
1717
use Magento\Catalog\Model\Product;
18+
use Magento\Framework\App\ObjectManager;
1819

1920
/**
2021
* Clean product cache only when stock status was updated
@@ -46,22 +47,31 @@ class CacheCleaner
4647
*/
4748
private $connection;
4849

50+
/**
51+
* @var \Magento\CatalogInventory\Model\ResourceModel\Indexer\Stock\FrontendResource
52+
*/
53+
private $indexerStockFrontendResource;
54+
4955
/**
5056
* @param ResourceConnection $resource
5157
* @param StockConfigurationInterface $stockConfiguration
5258
* @param CacheContext $cacheContext
5359
* @param ManagerInterface $eventManager
60+
* @param null|\Magento\Indexer\Model\ResourceModel\FrontendResource $indexerStockFrontendResource
5461
*/
5562
public function __construct(
5663
ResourceConnection $resource,
5764
StockConfigurationInterface $stockConfiguration,
5865
CacheContext $cacheContext,
59-
ManagerInterface $eventManager
66+
ManagerInterface $eventManager,
67+
\Magento\Indexer\Model\ResourceModel\FrontendResource $indexerStockFrontendResource = null
6068
) {
6169
$this->resource = $resource;
6270
$this->stockConfiguration = $stockConfiguration;
6371
$this->cacheContext = $cacheContext;
6472
$this->eventManager = $eventManager;
73+
$this->indexerStockFrontendResource = $indexerStockFrontendResource ?: ObjectManager::getInstance()
74+
->get(\Magento\CatalogInventory\Model\ResourceModel\Indexer\Stock\FrontendResource::class);
6575
}
6676

6777
/**
@@ -89,7 +99,7 @@ private function getProductStockStatuses(array $productIds)
8999
{
90100
$select = $this->getConnection()->select()
91101
->from(
92-
$this->resource->getTableName('cataloginventory_stock_status'),
102+
$this->indexerStockFrontendResource->getMainTable(),
93103
['product_id', 'stock_status', 'qty']
94104
)->where('product_id IN (?)', $productIds)
95105
->where('stock_id = ?', Stock::DEFAULT_STOCK_ID)

0 commit comments

Comments
 (0)