diff --git a/lib/MogileFS/Config.pm b/lib/MogileFS/Config.pm index 1861910..cc682be 100644 --- a/lib/MogileFS/Config.pm +++ b/lib/MogileFS/Config.pm @@ -213,6 +213,27 @@ sub config { } sub check_database { + my $class = shift; + my $sto = $class->check_database_connection; + $class->check_database_schema; + $sto->pre_daemonize_checks; +} + +sub check_database_forever { + my $class = shift; + my $sto; + while () { + $sto = eval { $class->check_database_connection }; + last if $sto; + # XXX is it ok to use Mgd::log here? + Mgd::log('err', "Cannot connect to MogileFS database, try again later. Details: err=$@"); + sleep 5; # XXX configurable? + } + $class->check_database_schema; + $sto->pre_daemonize_checks; +} + +sub check_database_connection { my $sto = eval { Mgd::get_store() }; unless ($sto && $sto->ping) { die qq{ @@ -226,15 +247,17 @@ run 'mogdbsetup'. Details: [sto=$sto, err=$@] } } + $sto; +} +sub check_database_schema { my $sversion = MogileFS::Config->server_setting('schema_version') || 0; my $expect_ver = MogileFS::Store->latest_schema_version; unless ($sversion == $expect_ver || MogileFS::Config->config('no_schema_check')) { + # XXX Should probably use syslog if it's already daemonized? die "Server's database schema version of $sversion doesn't match expected value of $expect_ver. Halting.\n\n". "Please run mogdbsetup to upgrade your schema.\n"; } - - $sto->pre_daemonize_checks; } # set_server_setting( key, value ) diff --git a/lib/MogileFS/Server.pm b/lib/MogileFS/Server.pm index 60b4340..d96f9c3 100644 --- a/lib/MogileFS/Server.pm +++ b/lib/MogileFS/Server.pm @@ -96,9 +96,14 @@ sub run { die "mogilefsd cannot be run as root\n" if $< == 0 && MogileFS->config('user') ne "root"; - MogileFS::Config->check_database; daemonize() if MogileFS->config("daemonize"); + # open up our log + Sys::Syslog::openlog('mogilefsd', 'pid', 'daemon'); + Mgd::log('info', 'beginning run'); + + MogileFS::Config->check_database_forever; # XXX configurable use of check_database vs. check_database_forever? Start check_database before daemonize() + MogileFS::ProcManager->set_min_workers('queryworker' => MogileFS->config('query_jobs')); MogileFS::ProcManager->set_min_workers('delete' => MogileFS->config('delete_jobs')); MogileFS::ProcManager->set_min_workers('replicate' => MogileFS->config('replicate_jobs')); @@ -107,10 +112,6 @@ sub run { MogileFS::ProcManager->set_min_workers('fsck' => MogileFS->config('fsck_jobs')); MogileFS::ProcManager->set_min_workers('job_master' => 1); - # open up our log - Sys::Syslog::openlog('mogilefsd', 'pid', 'daemon'); - Mgd::log('info', 'beginning run'); - unless (MogileFS::ProcManager->write_pidfile) { Mgd::log('info', "Couldn't write pidfile, ending run"); Sys::Syslog::closelog();