aboutsummaryrefslogtreecommitdiff
path: root/lib/MasterServer/Core/Schedulers.pm
diff options
context:
space:
mode:
authorDarkelarious <darkelarious@333networks.com>2017-05-13 14:18:28 +0200
committerDarkelarious <darkelarious@333networks.com>2017-05-13 14:20:49 +0200
commit34a2c7390ea9662d33258d384e72fff1912343ff (patch)
treed96ea33c0107e4906a152aa1de4b5c75b81ba0a8 /lib/MasterServer/Core/Schedulers.pm
parent84af66aba26d2088d5d95c240d176f3edaf17b58 (diff)
downloadMasterServer-Perl-34a2c7390ea9662d33258d384e72fff1912343ff.tar.gz
MasterServer-Perl-34a2c7390ea9662d33258d384e72fff1912343ff.zip
revised synchronization methods, config settings and bug fixesv2.3.0
Diffstat (limited to 'lib/MasterServer/Core/Schedulers.pm')
-rwxr-xr-xlib/MasterServer/Core/Schedulers.pm117
1 files changed, 64 insertions, 53 deletions
diff --git a/lib/MasterServer/Core/Schedulers.pm b/lib/MasterServer/Core/Schedulers.pm
index 97e45a5..cee4e5c 100755
--- a/lib/MasterServer/Core/Schedulers.pm
+++ b/lib/MasterServer/Core/Schedulers.pm
@@ -1,4 +1,3 @@
-
package MasterServer::Core::Schedulers;
use strict;
@@ -18,75 +17,90 @@ our @EXPORT = qw |
################################################################################
sub long_periodic_tasks {
my $self = shift;
- my $num = 0;
+ my $prev = 0;
return AnyEvent->timer (
- after => 300, # 5 minutes grace time
- interval => 1800, # execute every half hour
+ after => 30, # 30 seconds grace time
+ interval => 3600, # execute every hour
cb => sub {
- ## update Killing Floor stats
- $self->read_kfstats();
+ # update Killing Floor stats
+ $self->read_kfstats() if $self->{kfstats_enabled};
+
+ # delete old masterserver applets that have been unresponsive for a while now
+ $self->remove_unresponsive_applets() if (defined $self->{firstrun});
# time spacer
my $t = 0;
# clean out handles from the previous round (executed or not)
$self->{scope}->{sync} = ();
-
- ## Query Epic Games'-based UCC applets periodically to get an additional
- ## list of online UT, Unreal (or other) game servers.
- if ($self->{master_applet_enabled}) {
- for my $ms (@{$self->{master_applet}}) {
+
+ # Synchronize with all other 333networks masterservers that are uplinking,
+ # added by synchronization or manually listed.
+ if ($self->{sync_enabled}) {
+
+ # get serverlist
+ my $masterserverlist = $self->get_server(
+ updated => 3600,
+ gamename => "333networks",
+ );
- # add 3 second delay to spread network/server load
+ foreach my $ms (@{$masterserverlist}) {
+ # add 5 second delay to spread network/server load
$self->{scope}->{sync}->{$t} = AnyEvent->timer(
- after => 3*$t++,
- cb => sub{$self->query_applet($ms)}
- );
+ after => 5*$t++,
+ cb => sub{$self->sync_with_master($ms)}
+ ) if ($ms->{hostport} > 0);
}
}
+
+ # do NOT reset $t, keep padding time -- you should not have more than 300
+ # entries in applets/syncer in total anyway.
- # do NOT reset $t, keep padding time -- you should not have more than 600
- # entries in applets/syncer in total.
-
- ## Request the masterlist for selected or all games from other
- ## 333networks-based masterservers that uplinked to us and otherwise made
- ## our list (config, manual entry, etc)
- if ($self->{sync_enabled}) {
- foreach my $ms (values %{$self->masterserver_list()}) {
+ # Query Epic Games-based UCC applets periodically to get an additional
+ # list of online UT, Unreal and other game servers.
+ if ($self->{master_applet_enabled}) {
- # add 3 second delay to spread network/server load
+ # get applet list
+ my $appletlist = $self->get_masterserver_applets();
+
+ for my $ms (@{$appletlist}) {
+
+ # add 5 second delay to spread network/server load
$self->{scope}->{sync}->{$t} = AnyEvent->timer(
- after => 3*$t++,
- cb => sub{$self->sync_with_master($ms) if ($ms->{tcp} > 0)}
+ after => 5*$t++,
+ cb => sub{$self->query_applet($ms)}
);
}
}
#
- # Also very long-running tasks, like once per day:
+ # very long-running tasks, like database dumps
+ # interval from config
#
- if ($num++ >= 47) {
- # reset counter
- $num = 0;
-
- #
- # do database dump
- #
- my $time = strftime('%Y-%m-%d-%H-%M',localtime);
-
- # read db type from db login
- my @db_type = split(':', $self->{dblogin}->[0]);
- $db_type[2] =~ s/dbname=//;
+ my $curr = 0;
+ $curr = strftime('%d',localtime) if ($self->{dump_db} =~ /^daily$/i );
+ $curr = strftime('%U',localtime) if ($self->{dump_db} =~ /^weekly$/i );
+ $curr = strftime('%m',localtime) if ($self->{dump_db} =~ /^monthly$/i);
+ $curr = strftime('%Y',localtime) if ($self->{dump_db} =~ /^yearly$/i );
+
+ # on change, execute
+ if ($prev < $curr) {
- if ($db_type[1] eq "Pg") {
- # use pg_dump to dump Postgresql databases
- system("pg_dump $db_type[2] -U $self->{dblogin}->[1] > $self->{root}/data/dumps/$db_type[1]-$time.db");
- $self->log("dump", "Dumping database to /data/dumps/$db_type[1]-$time.db");
+ # skip on first run
+ if ($prev == 0) {
+ # update timer and loop
+ $prev = $curr;
+ return;
}
+
+ # dump db
+ $self->dump_database();
+
+ # update timekeeper
+ $prev = $curr;
}
-
},
);
}
@@ -102,22 +116,19 @@ sub short_periodic_tasks {
interval => 120,
cb => sub {
- ## update stats on direct beacons and total number of servers
+ # update stats on direct beacons and total number of servers
$self->update_stats();
- ## determine whether servers are still uplinking to us. If not, toggle.
+ # determine whether servers are still uplinking to us. If not, toggle.
$self->write_direct_beacons() if (defined $self->{firstrun});
- ## delete old servers from the "pending" list (except for the first run)
+ # delete old servers from the "pending" list (except for the first run)
$self->delete_old_pending() if (defined $self->{firstrun});
- ## uplink to other 333networks masterservers with heartbeats,
- ## that way we can index other masterservers too
+ # uplink to other 333networks masterservers with heartbeats, so other
+ # masterservers can find us too
$self->send_heartbeats();
-
- #
- # more short tasks?
- #
+
},
);
}