]>
git.proxmox.com Git - pmg-api.git/blob - PMG/Service/pmgmirror.pm
c8b7d1b81bebce5cef91f35dfa61399b0ed2a9a1
1 package PMG
::Service
::pmgmirror
;
6 use Time
::HiRes qw
(gettimeofday
);
9 use PVE
::Tools
qw(extract_param);
14 use PMG
::RESTEnvironment
;
18 use PMG
::ClusterConfig
;
21 use base
qw(PVE::Daemon);
23 my $cmdline = [$0, @ARGV];
25 my %daemon_options = (restart_on_error
=> 5, stop_wait_time
=> 5);
27 my $daemon = __PACKAGE__-
>new('pmgmirror', $cmdline, %daemon_options);
29 my $restart_request = 0;
33 my $updatetime = 60*2;
35 my $initial_memory_usage;
53 my $cinfo = PMG
::ClusterConfig-
>new(); # reload
54 my $role = $cinfo->{local}->{type
} // '-';
56 return if $role eq '-';
57 return if !$cinfo->{master
}; # just to be sure
59 my ($ccsec_start, $cusec_start) = gettimeofday
();
61 syslog
('info', "starting cluster syncronization");
63 my $master_ip = $cinfo->{master
}->{ip
};
64 my $master_name = $cinfo->{master
}->{name
};
66 PMG
::Cluster
::sync_config_from_master
($cinfo, $master_name, $master_ip);
68 my ($ccsec, $cusec) = gettimeofday
();
69 $csynctime += int (($ccsec-$ccsec_start)*1000 + ($cusec - $cusec_start)/1000);
71 $cinfo = PMG
::ClusterConfig-
>new(); # reload
72 $role = $cinfo->{local}->{type
} // '-';
74 return if $role eq '-';
75 return if !$cinfo->{master
}; # just to be sure
77 ($ccsec, $cusec) = gettimeofday
();
78 my $cptime = int (($ccsec-$ccsec_start) + ($cusec - $cusec_start)/1000000);
80 my $rstime = $rsynctime/1000.0
;
81 my $cstime = $csynctime/1000.0
;
82 my $dbtime = $cptime - $rstime - $cstime;
84 syslog
('info', sprintf("cluster syncronization finished (%.2f seconds " .
85 "(files %.2f, database %.2f, config %.2f))",
86 $cptime, $rstime, $dbtime, $cstime));
95 $next_update = time() + $updatetime;
97 eval { cluster_sync
(); };
99 syslog
('err', PMG
::Utils
::msgquote
("sync error: $err"));
104 last if $self->{terminate
};
106 my $mem = PVE
::ProcFSTools
::read_memory_usage
();
108 if (!defined($initial_memory_usage) || ($cycle < 10)) {
109 $initial_memory_usage = $mem->{resident
};
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();
120 while ((time() < $next_update) &&
121 ($wcount < $updatetime) && # protect against time wrap
122 !$restart_request && !$self->{terminate
}) {
124 $wcount++; sleep (1);
127 last if $self->{terminate
};
129 $self->restart_daemon() if $restart_request;
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");
138 start
=> [ __PACKAGE__
, 'start', []],
139 restart
=> [ __PACKAGE__
, 'restart', []],
140 stop
=> [ __PACKAGE__
, 'stop', []],