diff options
| author | Darkelarious <darkelarious@333networks.com> | 2017-05-13 14:18:28 +0200 |
|---|---|---|
| committer | Darkelarious <darkelarious@333networks.com> | 2017-05-13 14:20:49 +0200 |
| commit | 34a2c7390ea9662d33258d384e72fff1912343ff (patch) | |
| tree | d96ea33c0107e4906a152aa1de4b5c75b81ba0a8 /lib/MasterServer/Core/Schedulers.pm | |
| parent | 84af66aba26d2088d5d95c240d176f3edaf17b58 (diff) | |
| download | MasterServer-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-x | lib/MasterServer/Core/Schedulers.pm | 117 |
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? - # + }, ); } |
