From 4d86898aa0c0c87ee618746a16d286cfc39e8fe7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Nowak?= <luke@nexedi.com> Date: Fri, 11 Mar 2011 16:29:37 +0000 Subject: [PATCH] - change behavoiour and do *NOT* call mysql_install unconditionally Unfortunately mysql_install dies in case if there is software upgrade. And from current knowledge the only "portable" way to know that mysql database was initialised is to check for existence of mysql directory in datadir, which contains system tables. Such check assumes that installation went fine and then tries to start mysql. If installation was not correct mysqld will die, which is acceptable, as wrapper will exit. git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@44200 20353a03-c40f-0410-a6d1-a30d3c3de9de --- .../erp5/src/slapos/recipe/erp5/__init__.py | 16 +++---- .../erp5/src/slapos/recipe/erp5/mysql.py | 42 ++++++++++--------- 2 files changed, 31 insertions(+), 27 deletions(-) diff --git a/slapos/recipe/erp5/src/slapos/recipe/erp5/__init__.py b/slapos/recipe/erp5/src/slapos/recipe/erp5/__init__.py index 54439944ff..6cefd55bf9 100644 --- a/slapos/recipe/erp5/src/slapos/recipe/erp5/__init__.py +++ b/slapos/recipe/erp5/src/slapos/recipe/erp5/__init__.py @@ -522,9 +522,6 @@ SSLRandomSeed connect builtin self.substituteTemplate(self.getTemplateFilename('my.cnf.in'), mysql_conf)) - initialise_command_list = [self.options['mysql_install_binary'], - '--skip-name-resolve', '--no-defaults', - '--datadir=%s' % mysql_conf['data_directory']] mysql_command_list = [self.options['mysql_binary'].strip(), '--no-defaults', '-B', '--user=root', '--socket=%s' % mysql_conf['socket'], @@ -537,11 +534,14 @@ SSLRandomSeed connect builtin mysql_script])) self.path_list.extend(zc.buildout.easy_install.scripts([('mysqld', __name__ + '.mysql', 'runMysql')], self.ws, - sys.executable, self.wrapper_directory, arguments=[ - initialise_command_list, { - 'mysqld_binary':self.options['mysqld_binary'], - 'configuration_file':mysql_conf_path, - }])) + sys.executable, self.wrapper_directory, arguments=[dict( + mysql_install_binary=self.options['mysql_install_binary'].strip(), + mysqld_binary=self.options['mysqld_binary'].strip(), + data_directory=mysql_conf['data_directory'].strip(), + mysql_binary=self.options['mysql_binary'].strip(), + socket=mysql_conf['socket'].strip(), + configuration_file=mysql_conf_path, + )])) self.path_list.extend([mysql_conf_path]) # The return could be more explicit database, user ... return mysql_conf diff --git a/slapos/recipe/erp5/src/slapos/recipe/erp5/mysql.py b/slapos/recipe/erp5/src/slapos/recipe/erp5/mysql.py index 3efa2f4db0..67fed97a5b 100644 --- a/slapos/recipe/erp5/src/slapos/recipe/erp5/mysql.py +++ b/slapos/recipe/erp5/src/slapos/recipe/erp5/mysql.py @@ -6,25 +6,29 @@ import time def runMysql(args): sleep = 60 - initialise_command_list = args[0] - mysql_conf = args[1] - mysql_wrapper_list = [mysql_conf['mysqld_binary'], - '--defaults-file=%s' % mysql_conf['configuration_file']] - while True: - # XXX: Protect with proper root password - popen = subprocess.Popen(initialise_command_list, - stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - result = popen.communicate()[0] - if popen.returncode is None or popen.returncode != 0: - print "Failed to initialise server.\nThe error was: %s" % result - print "Waiting for %ss and retrying" % sleep - time.sleep(sleep) - else: - print "Mysql properly initialised" - break - sys.stdout.flush() - sys.stderr.flush() - os.execl(mysql_wrapper_list[0], *mysql_wrapper_list) + conf = args[0] + mysqld_wrapper_list = [conf['mysqld_binary'], '--defaults-file=%s' % + conf['configuration_file']] + # we trust mysql_install that if mysql directory is available mysql was + # correctly initalised + if not os.path.isdir(os.path.join(conf['data_directory'], 'mysql')): + while True: + # XXX: Protect with proper root password + popen = subprocess.Popen([conf['mysql_install_binary'], + '--skip-name-resolve', '--no-defaults', '--datadir=%s' % + conf['data_directory']], + stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + result = popen.communicate()[0] + if popen.returncode is None or popen.returncode != 0: + print "Failed to initialise server.\nThe error was: %s" % result + print "Waiting for %ss and retrying" % sleep + time.sleep(sleep) + else: + print "Mysql properly initialised" + break + else: + print "MySQL already initalised, starting" + os.execl(mysqld_wrapper_list[0], *mysqld_wrapper_list) def updateMysql(args): -- 2.30.9