#!/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()
