]> git.proxmox.com Git - pmg-api.git/blame - PMG/Service/pmgmirror.pm
remove msgquote hack - syslog already work correctly
[pmg-api.git] / PMG / Service / pmgmirror.pm
CommitLineData
132089d5
DM
1package PMG::Service::pmgmirror;
2
3use strict;
4use warnings;
5use Data::Dumper;
6use Time::HiRes qw (gettimeofday);
7
8use PVE::SafeSyslog;
9use PVE::Tools qw(extract_param);
10use PVE::INotify;
11use PVE::Daemon;
83ad364b 12use PVE::ProcFSTools;
132089d5
DM
13
14use PMG::RESTEnvironment;
15use PMG::DBTools;
16use PMG::RuleDB;
17use PMG::Cluster;
18use PMG::ClusterConfig;
19use PMG::Statistic;
20
21use base qw(PVE::Daemon);
22
23my $cmdline = [$0, @ARGV];
24
25my %daemon_options = (restart_on_error => 5, stop_wait_time => 5);
26
27my $daemon = __PACKAGE__->new('pmgmirror', $cmdline, %daemon_options);
28
29my $restart_request = 0;
30my $next_update = 0;
31
32my $cycle = 0;
2c26c08d 33my $updatetime = 60*2;
132089d5 34
83ad364b 35my $initial_memory_usage;
132089d5
DM
36
37sub init {
83ad364b 38 # syslog('INIT');
132089d5
DM
39}
40
41sub hup {
42 my ($self) = @_;
43
44 $restart_request = 1;
45}
46
2c26c08d
DM
47sub cluster_sync {
48 my ($cinfo) = @_;
49
50 my $rsynctime = 0;
51 my $csynctime = 0;
52
53 my $cinfo = PMG::ClusterConfig->new(); # reload
54 my $role = $cinfo->{local}->{type} // '-';
55
56 return if $role eq '-';
57 return if !$cinfo->{master}; # just to be sure
58
59 my ($ccsec_start, $cusec_start) = gettimeofday ();
60
61 syslog ('info', "starting cluster syncronization");
62
63 my $master_ip = $cinfo->{master}->{ip};
64 my $master_name = $cinfo->{master}->{name};
65
66 PMG::Cluster::sync_config_from_master($cinfo, $master_name, $master_ip);
67
68 my ($ccsec, $cusec) = gettimeofday ();
69 $csynctime += int (($ccsec-$ccsec_start)*1000 + ($cusec - $cusec_start)/1000);
70
71 $cinfo = PMG::ClusterConfig->new(); # reload
72 $role = $cinfo->{local}->{type} // '-';
73
74 return if $role eq '-';
75 return if !$cinfo->{master}; # just to be sure
76
77 ($ccsec, $cusec) = gettimeofday ();
78 my $cptime = int (($ccsec-$ccsec_start) + ($cusec - $cusec_start)/1000000);
79
80 my $rstime = $rsynctime/1000.0;
81 my $cstime = $csynctime/1000.0;
82 my $dbtime = $cptime - $rstime - $cstime;
83
84 syslog('info', sprintf("cluster syncronization finished (%.2f seconds " .
85 "(files %.2f, database %.2f, config %.2f))",
86 $cptime, $rstime, $dbtime, $cstime));
87
88}
89
132089d5
DM
90sub run {
91 my ($self) = @_;
92
93 for (;;) { # forever
94
95 $next_update = time() + $updatetime;
96
2c26c08d 97 eval { cluster_sync(); };
132089d5 98 if (my $err = $@) {
b902c0b8 99 syslog('err', "sync error: $err");
132089d5
DM
100 }
101
83ad364b
DM
102 $cycle++;
103
104 last if $self->{terminate};
105
106 my $mem = PVE::ProcFSTools::read_memory_usage();
107
108 if (!defined($initial_memory_usage) || ($cycle < 10)) {
109 $initial_memory_usage = $mem->{resident};
110 } else {
111 my $diff = $mem->{resident} - $initial_memory_usage;
112 if ($diff > 5*1024*1024) {
113 syslog ('info', "restarting server after $cycle cycles to " .
114 "reduce memory usage (free $mem->{resident} ($diff) bytes)");
115 $self->restart_daemon();
116 }
117 }
118
132089d5
DM
119 my $wcount = 0;
120 while ((time() < $next_update) &&
121 ($wcount < $updatetime) && # protect against time wrap
122 !$restart_request && !$self->{terminate}) {
123
124 $wcount++; sleep (1);
125 };
126
127 last if $self->{terminate};
128
129 $self->restart_daemon() if $restart_request;
130 }
131}
132
133$daemon->register_start_command("Start the Database Mirror Daemon");
134$daemon->register_stop_command("Stop the Database Mirror Daemon");
135$daemon->register_restart_command(1, "Restart the Database Mirror Daemon");
136
137our $cmddef = {
138 start => [ __PACKAGE__, 'start', []],
139 restart => [ __PACKAGE__, 'restart', []],
140 stop => [ __PACKAGE__, 'stop', []],
141};
142
1431;