1#!/usr/bin/python
2# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6"""This script will run optimize table for chromeos_autotest_db
7
8This script might have notable impact on the mysql performance as it locks
9tables and rebuilds indexes. So be careful when running it on production
10systems.
11"""
12
13import logging
14import socket
15import subprocess
16import sys
17
18import common
19from autotest_lib.client.common_lib.cros.graphite import autotest_stats
20from autotest_lib.frontend import database_settings_helper
21from autotest_lib.scheduler import email_manager
22
23# Format Appears as: [Date] [Time] - [Msg Level] - [Message]
24LOGGING_FORMAT = '%(asctime)s - %(levelname)s - %(message)s'
25STATS_KEY = 'db_optimize.%s' % socket.gethostname()
26timer = autotest_stats.Timer(STATS_KEY)
27
28@timer.decorate
29def main_without_exception_handling():
30    database_settings = database_settings_helper.get_default_db_config()
31    command = ['mysqlcheck',
32               '-o', database_settings['NAME'],
33               '-u', database_settings['USER'],
34               '-p%s' % database_settings['PASSWORD'],
35               # we want to do db optimation on each master/slave
36               # in rotation. Do not write otimize table to bin log
37               # so that it won't be picked up by slaves automatically
38               '--skip-write-binlog',
39               ]
40    subprocess.check_call(command)
41
42
43def main():
44    logging.basicConfig(level=logging.INFO, format=LOGGING_FORMAT)
45    logging.info('Calling: %s', sys.argv)
46    try:
47        main_without_exception_handling()
48    except Exception as e:
49        message = 'Uncaught exception; terminating db_optimize.'
50        email_manager.manager.log_stacktrace(message)
51        logging.exception(message)
52        raise
53    finally:
54        email_manager.manager.send_queued_emails()
55    logging.info('db_optimize completed.')
56
57
58if __name__ == '__main__':
59    main()
60