Revision a354dfce
Von Moritz Bunkus vor etwa 5 Jahren hinzugefügt
SL/DB/Manager/BackgroundJob.pm | ||
---|---|---|
8 | 8 |
use SL::DB::Helper::Paginated; |
9 | 9 |
use SL::DB::Helper::Sorted; |
10 | 10 |
|
11 |
use SL::System::TaskServer; |
|
12 |
|
|
11 | 13 |
sub object_class { 'SL::DB::BackgroundJob' } |
12 | 14 |
|
13 | 15 |
__PACKAGE__->make_manager_methods; |
... | ... | |
36 | 38 |
cron_spec => '', |
37 | 39 |
next_run_at => undef, |
38 | 40 |
next_run_at => { le => $now } ] ]); |
39 |
|
|
40 |
return $class->get_all(query => [ or => [ @interval_args, @once_args ] ]); |
|
41 |
my @node_filter; |
|
42 |
|
|
43 |
my $node_id = SL::System::TaskServer->node_id; |
|
44 |
if ($::lx_office_conf{task_server}->{only_run_tasks_for_this_node}) { |
|
45 |
@node_filter = (node_id => $node_id); |
|
46 |
} else { |
|
47 |
@node_filter = ( |
|
48 |
or => [ |
|
49 |
node_id => undef, |
|
50 |
node_id => '', |
|
51 |
node_id => $node_id, |
|
52 |
]); |
|
53 |
} |
|
54 |
|
|
55 |
return $class->get_all(query => [ or => [ @interval_args, @once_args ], @node_filter ]); |
|
41 | 56 |
} |
42 | 57 |
|
43 | 58 |
1; |
Auch abrufbar als: Unified diff
Task-Server auf unterschiedlichen Maschinen laufen lassen können
Jede Task-Server-Instanz und jeder Hintergrundjob haben nun ein neues
Attribute »node_id«. Darüber kann gesteuert werden, dass bestimmte
Jobs nur von einer bestimmten Instanz ausgeführt werden.
Die »node_id« eines neu angelegten Jobs ist standardmäßig leer. Das
bedeutet, dass ein Job von einer beliebigen Task-Server-Instanz
ausgeführt werden kann.
Die »node_id« eines Task-Servers ist standardmäßig der Hostname (siehe
ausgabe von »perl -MSys::Hostname -le 'print hostname()'«), kann aber
in der Konfigurationsdatei überschrieben werden (»[task_server]« →
»node_id«).
Zusätzlich gibt es den Konfigurationsparameter »[task_server]« →
»only_run_tasks_for_this_node«. Ist dieser Parameter gesetzt, so führt
der Task-Server nur diejenigen Jobs aus, deren »node_id«-Feld mit der
»node_id« der Task-Server-Instanz übereinstimmt. Andernfalls werden
auch diejenigen Jobs ausgeführt, deren »node_id«-Feld leer ist.
Achtung: es findet momentan keinerlei Locking statt. Das bedeutet,
dass es für jede Datenbank nur eine Task-Server-Instanz geben darf,
bei der »only_run_tasks_for_this_node« nicht gesetzt ist. Für
Load-Balancing eignet sich das also bisher noch nicht.