Skip to content

Commit 9ea5b1c

Browse files
committed
fix(queues): Change event to ensure objects exist
Multiple listeners on `ResourceCreated` can cause issues where one listener is dependent on objects created in another. This moves one of the listeners to a later event to ensure needed objects exist.
1 parent c51faa1 commit 9ea5b1c

File tree

3 files changed

+54
-18
lines changed

3 files changed

+54
-18
lines changed

app/Listeners/Resources/Queues/Queues.php

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use App\Modules\Resources\Events\AssetCreated;
66
use App\Modules\Resources\Events\SubresourceCreated;
77
use App\Modules\Resources\Events\SubresourceDeleted;
8+
use App\Modules\Resources\Events\ChildCreated;
89
use App\Modules\Queues\Models\Queue;
910
use App\Modules\Queues\Models\Walltime;
1011
use App\Modules\Queues\Models\Scheduler;
@@ -22,36 +23,38 @@ class Queues
2223
*/
2324
public function subscribe(Dispatcher $events): void
2425
{
25-
$events->listen(AssetCreated::class, self::class . '@handleAssetCreated');
26+
$events->listen(ChildCreated::class, self::class . '@handleChildCreated');
2627
$events->listen(SubresourceCreated::class, self::class . '@handleSubresourceCreated');
2728
$events->listen(SubresourceDeleted::class, self::class . '@handleSubresourceDeleted');
2829
}
2930

3031
/**
3132
* Create a default scheduler for a new compute asset
3233
*
33-
* @param AssetCreated $event
34+
* @param ChildCreated $event
3435
* @return void
3536
*/
36-
public function handleAssetCreated(AssetCreated $event): void
37+
public function handleChildCreated(ChildCreated $event): void
3738
{
38-
if ($event->asset->resourcetype != 1)
39-
{
40-
return;
41-
}
39+
$subresource = $event->child->subresource;
4240

43-
$child = $event->asset->children->first();
44-
45-
$scheduler = new Scheduler;
46-
$scheduler->hostname = $event->asset->rolename . '-adm.' . str_replace('www', '', request()->getHost());
47-
if ($child)
41+
if (substr($subresource->name, -strlen('-Nonspecific')) == '-Nonspecific')
4842
{
49-
$scheduler->queuesubresourceid = $child->subresourceid;
43+
$scheduler = Scheduler::query()
44+
->where('queuesubresourceid', '=', $subresource->id)
45+
->first();
46+
47+
if (!$scheduler)
48+
{
49+
$scheduler = new Scheduler;
50+
$scheduler->hostname = $subresource->resource->rolename . '-adm.' . str_replace('www.', '', request()->getHost());
51+
$scheduler->queuesubresourceid = $subresource->id;
52+
$scheduler->batchsystem = $subresource->resource->batchsystem;
53+
$scheduler->schedulerpolicyid = 1;
54+
$scheduler->defaultmaxwalltime = 1209600;
55+
$scheduler->save();
56+
}
5057
}
51-
$scheduler->batchsystem = $event->asset->batchsystem;
52-
$scheduler->schedulerpolicyid = 1;
53-
$scheduler->defaultmaxwalltime = 1209600;
54-
$scheduler->save();
5558
}
5659

5760
/**
@@ -70,7 +73,6 @@ public function handleSubresourceCreated(SubresourceCreated $event): void
7073
}
7174

7275
$queue = new Queue;
73-
7476
$queue->name = config()->get('module.queues.prefix', 'system-') . $subresource->cluster;
7577
$queue->cluster = $subresource->cluster;
7678
$queue->groupid = '-1';
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
namespace App\Modules\Resources\Events;
4+
5+
use App\Modules\Resources\Models\Child;
6+
7+
class ChildCreated
8+
{
9+
/**
10+
* @var Child
11+
*/
12+
public $child;
13+
14+
/**
15+
* Constructor
16+
*
17+
* @param Child $child
18+
* @return void
19+
*/
20+
public function __construct(Child $child)
21+
{
22+
$this->child = $child;
23+
}
24+
}

app/Modules/Resources/Models/Child.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Illuminate\Database\Eloquent\Model;
66
use Illuminate\Database\Eloquent\Relations\BelongsTo;
7+
use App\Modules\Resources\Events\ChildCreated;
78

89
/**
910
* Model for a subresource mapping
@@ -28,6 +29,15 @@ class Child extends Model
2829
*/
2930
public $timestamps = false;
3031

32+
/**
33+
* The event map for the model.
34+
*
35+
* @var array<string,string>
36+
*/
37+
protected $dispatchesEvents = [
38+
'created' => ChildCreated::class,
39+
];
40+
3141
/**
3242
* Defines a relationship to a resource
3343
*

0 commit comments

Comments
 (0)