Description
Preconditions and environment
- 2.4.7-p3
Steps to reproduce
- Make sure you have more than 100 orders
- Make sure your
sales_order_grid
is also filled with this orders - Truncate
sales_order_grid
- Make sure async indexing of grids is true
- run
magerun2 sys:cron:run sales_grid_order_async_insert
vendor/magento/module-sales/Model/ResourceModel/Grid.php
public function refreshBySchedule()
{
$lastUpdatedAt = null;
$notSyncedIds = $this->notSyncedDataProvider->getIds($this->mainTableName, $this->gridTableName);
foreach (array_chunk($notSyncedIds, self::BATCH_SIZE) as $bunch) {
$select = $this->getGridOriginSelect()->where($this->mainTableName . '.entity_id IN (?)', $bunch);
The code above will be run and fetch $notSyncedIds
and chunck it in batches. The provider used is: vendor/magento/module-sales/Model/ResourceModel/Provider/UpdatedIdListProvider.php
and does this:
public function getIds($mainTableName, $gridTableName)
{
$mainTableName = $this->resourceConnection->getTableName($mainTableName);
$gridTableName = $this->resourceConnection->getTableName($gridTableName);
$select = $this->idListQueryBuilder->build($mainTableName, $gridTableName);
return $this->getConnection()->fetchAll($select, [], \Zend_Db::FETCH_COLUMN);
and builds a select with the idListQueryBuilder
:
public function build(string $mainTableName, string $gridTableName): Select
{
$select = $this->getConnection()->select()
->from(['main_table' => $mainTableName], ['main_table.entity_id'])
->joinLeft(
['grid_table' => $this->resourceConnection->getTableName($gridTableName)],
'main_table.entity_id = grid_table.entity_id',
[]
);
$select->where('grid_table.entity_id IS NULL');
$select->limit(Grid::BATCH_SIZE); // should be removed
foreach ($this->additionalGridTables as $table) {
$select->joinLeft(
[$table => $table],
sprintf(
'%s.%s = %s.%s',
'main_table',
'entity_id',
$table,
'entity_id'
),
[]
)
->where($table . '.entity_id IS NULL');
}
return $select;
}
In here there is limit: $select->limit(Grid::BATCH_SIZE);
the same as the chunk batch size in refreshBySchedule
. This looks like a bug to me, because you will never get more items than 100. Now this will probably only occur when the sales_order_grid
is truncated or more than 100 orders are placed between the cron execution.
Expected result
All items from sales_order
are inserted in the table sales_order_grid
.
Actual result
Only 100 (batch size) items are inserted in the table.
Additional information
No response
Release note
No response
Triage and priority
- Severity: S0 - Affects critical data or functionality and leaves users without workaround.
- Severity: S1 - Affects critical data or functionality and forces users to employ a workaround.
- Severity: S2 - Affects non-critical data or functionality and forces users to employ a workaround.
- Severity: S3 - Affects non-critical data or functionality and does not force users to employ a workaround.
- Severity: S4 - Affects aesthetics, professional look and feel, “quality” or “usability”.
Metadata
Metadata
Assignees
Labels
Type
Projects
Status