Skip to content

Commit a1048da

Browse files
authored
Merge pull request #98 from spryker/frw-11561-duplications-and-dead-lock-fix
FRW-11561 duplications and deadlock fix
2 parents 6e25138 + 37e8a08 commit a1048da

File tree

3 files changed

+40
-73
lines changed

3 files changed

+40
-73
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"spryker/event-dispatcher-extension": "^1.0.0",
1010
"spryker/kernel": "^3.72.0",
1111
"spryker/laminas": "^1.0.0",
12-
"spryker/propel": "^3.45.0",
12+
"spryker/propel": "^3.47.0",
1313
"spryker/propel-orm": "^1.16.0",
1414
"spryker/symfony": "^3.1.0",
1515
"spryker/transfer": "^3.39.0",

src/Spryker/Zed/EventBehavior/Business/Model/EventResourcePluginResolver.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,8 +178,9 @@ protected function filterPluginsByResources(array $eventResourcePlugins, array $
178178
if (!isset($eventResourcePlugins[$resource])) {
179179
throw new EventResourceNotFoundException(
180180
sprintf(
181-
'There is no resource with the name: %s.',
181+
'There is no resource with the name: %s. Available resources are: %s',
182182
$resource,
183+
implode(', ', array_keys($eventResourcePlugins)),
183184
),
184185
);
185186
}

src/Spryker/Zed/EventBehavior/Business/Model/TriggerManager.php

Lines changed: 37 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,12 @@
2222
use Spryker\Zed\EventBehavior\Persistence\Propel\Behavior\EventBehavior;
2323
use Spryker\Zed\Kernel\Persistence\EntityManager\InstancePoolingTrait;
2424
use Spryker\Zed\Kernel\RequestIdentifier;
25+
use Spryker\Zed\Propel\Persistence\BatchProcessor\ActiveRecordBatchProcessorTrait;
2526

2627
class TriggerManager implements TriggerManagerInterface
2728
{
2829
use InstancePoolingTrait;
30+
use ActiveRecordBatchProcessorTrait;
2931

3032
/**
3133
* @uses \Orm\Zed\EventBehavior\Persistence\Map\SpyEventBehaviorEntityChangeTableMap::TABLE_NAME
@@ -67,7 +69,7 @@ class TriggerManager implements TriggerManagerInterface
6769
/**
6870
* @var bool|null
6971
*/
70-
protected static $eventBehaviorTableExists;
72+
protected static ?bool $eventBehaviorTableExists = null;
7173

7274
/**
7375
* @param \Spryker\Zed\EventBehavior\Dependency\Facade\EventBehaviorToEventInterface $eventFacade
@@ -98,45 +100,24 @@ public function __construct(
98100
*/
99101
public function triggerRuntimeEvents()
100102
{
101-
if (static::$eventBehaviorTableExists === false) {
102-
return;
103-
}
104-
105103
if (!$this->config->getEventBehaviorTriggeringStatus()) {
106104
return;
107105
}
108106

109-
$processId = RequestIdentifier::getRequestId();
110107
if (!$this->eventBehaviorTableExists()) {
111-
static::$eventBehaviorTableExists = false;
112-
113108
return;
114109
}
115110

116-
$triggeredEvents = 0;
111+
$processId = RequestIdentifier::getRequestId();
112+
117113
$limit = $this->config->getTriggerChunkSize();
118-
$primaryKeys = [];
119-
$offset = 0;
120-
$countEvents = 0;
121114

122115
do {
123-
$events = $this->getEventEntitiesByProcessId($processId, $offset, $limit);
124-
static::$eventBehaviorTableExists = true;
116+
$events = $this->getEventEntitiesByProcessId($processId, $limit);
125117
$currentCountEvents = count($events);
126-
$countEvents += $currentCountEvents;
127118

128-
$triggeredEvents += $this->triggerEvents($events);
129-
$primaryKeys = array_merge($primaryKeys, $this->getPrimaryKeys($events));
130-
$offset += $limit;
119+
$this->triggerEventsAndDelete($events);
131120
} while ($currentCountEvents === $limit);
132-
133-
if ($countEvents === $triggeredEvents && $triggeredEvents > 0) {
134-
$this->eventBehaviorEntityManager->deleteEventBehaviorEntityByProcessId($processId);
135-
136-
return;
137-
}
138-
139-
$this->eventBehaviorEntityManager->deleteEventBehaviorEntityByPrimaryKeys($primaryKeys);
140121
}
141122

142123
/**
@@ -149,7 +130,7 @@ public function triggerRuntimeEventsWithReport(): EventTriggerResponseTransfer
149130
$eventTriggerResponseTransfer->setEventBehaviorTableExists(true);
150131
$eventTriggerResponseTransfer->setIsEventTriggeringActive(true);
151132

152-
if (static::$eventBehaviorTableExists === false) {
133+
if ($this->eventBehaviorTableExists() === false) {
153134
$eventTriggerResponseTransfer->setMessage('Event behavior table does not exist.');
154135
$eventTriggerResponseTransfer->setEventBehaviorTableExists(false);
155136

@@ -163,25 +144,10 @@ public function triggerRuntimeEventsWithReport(): EventTriggerResponseTransfer
163144
return $eventTriggerResponseTransfer;
164145
}
165146

166-
if (!$this->eventBehaviorTableExists()) {
167-
static::$eventBehaviorTableExists = false;
168-
$eventTriggerResponseTransfer->setMessage('Event behavior table does not exist.');
169-
$eventTriggerResponseTransfer->setEventBehaviorTableExists(false);
170-
171-
return $eventTriggerResponseTransfer;
172-
}
173-
174147
$requestId = RequestIdentifier::getRequestId();
175148

176149
$eventTriggerResponseTransfer->setRequestId($requestId);
177150

178-
$events = $this->queryContainer->queryEntityChange($requestId)->find()->getData();
179-
$eventTriggerResponseTransfer->setEventCount(count($events));
180-
181-
static::$eventBehaviorTableExists = true;
182-
183-
$triggeredRows = $this->triggerEvents($events);
184-
185151
$deletedRows = 0;
186152
$limit = $this->config->getTriggerChunkSize();
187153
do {
@@ -191,8 +157,9 @@ public function triggerRuntimeEventsWithReport(): EventTriggerResponseTransfer
191157
$deletedRows += $this->triggerEventsAndDelete($events);
192158
} while ($countEvents === $limit);
193159

194-
$eventTriggerResponseTransfer->setTriggeredRows($triggeredRows);
160+
$eventTriggerResponseTransfer->setTriggeredRows($deletedRows);
195161
$eventTriggerResponseTransfer->setDeletedRows($deletedRows);
162+
$eventTriggerResponseTransfer->setEventCount($deletedRows);
196163

197164
$eventTriggerResponseTransfer->setIsSuccessful(true);
198165

@@ -223,20 +190,19 @@ public function triggerLostEvents()
223190

224191
/**
225192
* @param string $processId
226-
* @param int $offset
227193
* @param int $limit
228194
*
229195
* @return array<\Orm\Zed\EventBehavior\Persistence\SpyEventBehaviorEntityChange>
230196
*/
231-
protected function getEventEntitiesByProcessId(string $processId, int $offset, int $limit): array
197+
protected function getEventEntitiesByProcessId(string $processId, int $limit): array
232198
{
233199
$instancePoolingDisabled = false;
234200
if ($this->isInstancePoolingEnabled()) {
235201
$this->disableInstancePooling();
236202
$instancePoolingDisabled = true;
237203
}
238204

239-
$events = $this->queryContainer->queryEntityChange($processId)->setOffset($offset)->limit($limit)->find()->getData();
205+
$events = $this->queryContainer->queryEntityChange($processId)->limit($limit)->find()->getData();
240206

241207
if ($instancePoolingDisabled) {
242208
$this->enableInstancePooling();
@@ -249,21 +215,36 @@ protected function getEventEntitiesByProcessId(string $processId, int $offset, i
249215
return $events;
250216
}
251217

218+
/**
219+
* @param array<\Orm\Zed\EventBehavior\Persistence\SpyEventBehaviorEntityChange> $events
220+
*
221+
* @return void
222+
*/
223+
protected function deleteteEventEntities(array $events): void
224+
{
225+
foreach ($events as $event) {
226+
$this->remove($event);
227+
}
228+
229+
$this->commit();
230+
}
231+
252232
/**
253233
* @param array<\Orm\Zed\EventBehavior\Persistence\SpyEventBehaviorEntityChange> $events
254234
*
255235
* @return int
256236
*/
257237
protected function triggerEventsAndDelete(array $events): int
258238
{
259-
$primaryKeys = $this->getPrimaryKeys($events);
239+
if (!$events) {
240+
return 0;
241+
}
242+
260243
$triggeredRows = $this->triggerEvents($events);
261244

262-
if ($triggeredRows !== 0 && count($events) === $triggeredRows) {
263-
return $this->eventBehaviorEntityManager->deleteEventBehaviorEntityByPrimaryKeys($primaryKeys);
264-
}
245+
$this->deleteteEventEntities($events);
265246

266-
return 0;
247+
return $triggeredRows;
267248
}
268249

269250
/**
@@ -316,27 +297,12 @@ protected function triggerEvents(array $events): int
316297
*/
317298
protected function eventBehaviorTableExists(): bool
318299
{
319-
return class_exists(BaseSpyEventBehaviorEntityChangeQuery::class)
320-
&& class_exists(SpyEventBehaviorEntityChangeQuery::class)
321-
&& $this->propelFacade->tableExists(static::TABLE_NAME_EVENT_BEHAVIOR_ENTITY_CHANGE);
322-
}
323-
324-
/**
325-
* @param array<\Orm\Zed\EventBehavior\Persistence\SpyEventBehaviorEntityChange> $events
326-
*
327-
* @return array<int>
328-
*/
329-
protected function getPrimaryKeys(array $events): array
330-
{
331-
$keys = [];
332-
333-
foreach ($events as $event) {
334-
/** @var int $idEventBehaviorEntityChange */
335-
$idEventBehaviorEntityChange = $event->getIdEventBehaviorEntityChange();
336-
337-
$keys[] = $idEventBehaviorEntityChange;
300+
if (static::$eventBehaviorTableExists === null) {
301+
static::$eventBehaviorTableExists = class_exists(BaseSpyEventBehaviorEntityChangeQuery::class)
302+
&& class_exists(SpyEventBehaviorEntityChangeQuery::class)
303+
&& $this->propelFacade->tableExists(static::TABLE_NAME_EVENT_BEHAVIOR_ENTITY_CHANGE);
338304
}
339305

340-
return $keys;
306+
return static::$eventBehaviorTableExists;
341307
}
342308
}

0 commit comments

Comments
 (0)