Skip to content

Commit 7b83b54

Browse files
committed
MC-42025: Bad performance and outages after upgrade to MariaDB 10.2.34
1 parent 2088a94 commit 7b83b54

File tree

2 files changed

+150
-2
lines changed

2 files changed

+150
-2
lines changed

app/code/Magento/Sales/Model/Grid/LastUpdateTimeCache.php

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class LastUpdateTimeCache
1717
/**
1818
* Prefix for cache key.
1919
*/
20-
private const CACHE_PREFIX = 'LAST_GRID_UPDATE_TIME:';
20+
private const CACHE_PREFIX = 'LAST_GRID_UPDATE_TIME';
2121

2222
/**
2323
* @var CacheInterface
@@ -62,6 +62,17 @@ public function get(string $gridTableName): ?string
6262
return $lastUpdatedAt ?: null;
6363
}
6464

65+
/**
66+
* Remove last grid update time.
67+
*
68+
* @param string $gridTableName
69+
* @return void
70+
*/
71+
public function remove(string $gridTableName): void
72+
{
73+
$this->cache->remove($this->getCacheKey($gridTableName));
74+
}
75+
6576
/**
6677
* Generate cache key.
6778
*
@@ -70,6 +81,6 @@ public function get(string $gridTableName): ?string
7081
*/
7182
private function getCacheKey(string $gridTableName): string
7283
{
73-
return self::CACHE_PREFIX . $gridTableName;
84+
return self::CACHE_PREFIX . ':' . $gridTableName;
7485
}
7586
}
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Sales\Model\ResourceModel;
9+
10+
use Magento\Framework\ObjectManagerInterface;
11+
use Magento\Sales\Model\Grid\LastUpdateTimeCache;
12+
use Magento\Sales\Model\ResourceModel\Provider\UpdatedAtListProvider;
13+
use Magento\TestFramework\Helper\Bootstrap;
14+
use PHPUnit\Framework\TestCase;
15+
16+
/**
17+
* @magentoDataFixture Magento/Sales/_files/order_with_invoice_shipment_creditmemo.php
18+
*/
19+
class GridTest extends TestCase
20+
{
21+
/**
22+
* @var ObjectManagerInterface
23+
*/
24+
private $objectManager;
25+
26+
/**
27+
* @var LastUpdateTimeCache
28+
*/
29+
private $lastUpdateTimeCache;
30+
31+
/**
32+
* @inheritdoc
33+
*/
34+
protected function setUp(): void
35+
{
36+
$this->objectManager = Bootstrap::getObjectManager();
37+
$this->lastUpdateTimeCache = $this->objectManager->get(LastUpdateTimeCache::class);
38+
}
39+
40+
/**
41+
* @dataProvider gridDataProvider
42+
* @param array $constructorArgs
43+
* @param string $orderIdField
44+
*/
45+
public function testRefreshBySchedule(array $constructorArgs, string $orderIdField)
46+
{
47+
$constructorArgs['orderIdField'] = $constructorArgs['mainTableName'] . '.' . $orderIdField;
48+
$constructorArgs['columns'] = [
49+
$orderIdField => $constructorArgs['orderIdField'],
50+
'created_at' => $constructorArgs['mainTableName'] . '.created_at',
51+
'updated_at' => $constructorArgs['mainTableName'] . '.updated_at',
52+
];
53+
$constructorArgs['notSyncedDataProvider'] = $this->objectManager->get(UpdatedAtListProvider::class);
54+
$grid = $this->objectManager->create(Grid::class, $constructorArgs);
55+
56+
$order = $this->objectManager->create(\Magento\Sales\Model\Order::class)
57+
->loadByIncrementId('100000111');
58+
$connection = $grid->getConnection();
59+
$select = $connection->select()
60+
->from($constructorArgs['mainTableName'], ['created_at', 'updated_at'])
61+
->where($orderIdField, $order->getEntityId());
62+
$data = $connection->fetchRow($select);
63+
$this->assertNotEmpty($data);
64+
65+
//refresh data without cached updated_at
66+
$this->lastUpdateTimeCache->remove($constructorArgs['gridTableName']);
67+
$this->assertEmpty($this->lastUpdateTimeCache->get($constructorArgs['gridTableName']));
68+
sleep(1);
69+
$data['created_at'] = $data['updated_at'] = date('Y-m-d H:i:s');
70+
$connection->update(
71+
$constructorArgs['mainTableName'],
72+
$data,
73+
sprintf('%s = %d', $orderIdField, $order->getEntityId())
74+
);
75+
$grid->refreshBySchedule();
76+
77+
$select = $connection->select()
78+
->from($constructorArgs['gridTableName'], ['created_at', 'updated_at'])
79+
->where($orderIdField, $order->getEntityId());
80+
$gridData = $connection->fetchRow($select);
81+
$this->assertEquals($data, $gridData);
82+
83+
//refresh data with cached updated_at
84+
$this->assertNotEmpty($this->lastUpdateTimeCache->get($constructorArgs['gridTableName']));
85+
sleep(1);
86+
$data['created_at'] = $data['updated_at'] = date('Y-m-d H:i:s');
87+
$connection->update(
88+
$constructorArgs['mainTableName'],
89+
$data,
90+
sprintf('%s = %d', $orderIdField, $order->getEntityId())
91+
);
92+
$grid->refreshBySchedule();
93+
94+
$select = $connection->select()
95+
->from($constructorArgs['gridTableName'], ['created_at', 'updated_at'])
96+
->where($orderIdField, $order->getEntityId());
97+
$gridData = $connection->fetchRow($select);
98+
$this->assertEquals($data, $gridData);
99+
}
100+
101+
/**
102+
* @return array
103+
*/
104+
public function gridDataProvider(): array
105+
{
106+
return [
107+
'Magento\Sales\Model\ResourceModel\Order\Grid' => [
108+
[
109+
'mainTableName' => 'sales_order',
110+
'gridTableName' => 'sales_order_grid',
111+
],
112+
'entity_id',
113+
],
114+
'ShipmentGridAggregator' => [
115+
[
116+
'mainTableName' => 'sales_shipment',
117+
'gridTableName' => 'sales_shipment_grid',
118+
],
119+
'order_id',
120+
],
121+
'CreditmemoGridAggregator' => [
122+
[
123+
'mainTableName' => 'sales_creditmemo',
124+
'gridTableName' => 'sales_creditmemo_grid',
125+
],
126+
'order_id',
127+
],
128+
'Magento\Sales\Model\ResourceModel\Order\Invoice\Grid' => [
129+
[
130+
'mainTableName' => 'sales_invoice',
131+
'gridTableName' => 'sales_invoice_grid',
132+
],
133+
'order_id',
134+
],
135+
];
136+
}
137+
}

0 commit comments

Comments
 (0)