81 lines
2.3 KiB
Python
Executable File
81 lines
2.3 KiB
Python
Executable File
#!/usr/bin/python2
|
|
# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
"""This script will run optimize table for chromeos_autotest_db
|
|
|
|
This script might have notable impact on the mysql performance as it locks
|
|
tables and rebuilds indexes. So be careful when running it on production
|
|
systems.
|
|
"""
|
|
|
|
import argparse
|
|
import logging
|
|
import socket
|
|
import subprocess
|
|
import sys
|
|
|
|
import common
|
|
from autotest_lib.frontend import database_settings_helper
|
|
from autotest_lib.server import utils
|
|
|
|
# Format Appears as: [Date] [Time] - [Msg Level] - [Message]
|
|
LOGGING_FORMAT = '%(asctime)s - %(levelname)s - %(message)s'
|
|
STATS_KEY = 'db_optimize.%s' % socket.gethostname()
|
|
|
|
def main_without_exception_handling():
|
|
database_settings = database_settings_helper.get_default_db_config()
|
|
command = ['mysqlcheck',
|
|
'-o', database_settings['NAME'],
|
|
'-u', database_settings['USER'],
|
|
'-p%s' % database_settings['PASSWORD'],
|
|
# we want to do db optimation on each master/slave
|
|
# in rotation. Do not write otimize table to bin log
|
|
# so that it won't be picked up by slaves automatically
|
|
'--skip-write-binlog',
|
|
]
|
|
subprocess.check_call(command)
|
|
|
|
|
|
def should_optimize():
|
|
"""Check if the server should run db_optimize.
|
|
|
|
Only shard should optimize db.
|
|
|
|
@returns: True if it should optimize db otherwise False.
|
|
"""
|
|
return utils.is_shard()
|
|
|
|
|
|
def parse_args():
|
|
"""Parse command line arguments"""
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('-c', '--check_server', action='store_true',
|
|
help='Check if the server should optimize db.')
|
|
return parser.parse_args()
|
|
|
|
|
|
def main():
|
|
"""Main."""
|
|
args = parse_args()
|
|
|
|
logging.basicConfig(level=logging.INFO, format=LOGGING_FORMAT)
|
|
logging.info('Calling: %s', sys.argv)
|
|
|
|
if args.check_server and not should_optimize():
|
|
print 'Only shard can run db optimization.'
|
|
return
|
|
|
|
try:
|
|
main_without_exception_handling()
|
|
except Exception as e:
|
|
message = 'Uncaught exception; terminating db_optimize.'
|
|
logging.exception(message)
|
|
raise
|
|
logging.info('db_optimize completed.')
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|