342 lines
8.5 KiB
Bash
342 lines
8.5 KiB
Bash
#!/bin/sh
|
|
|
|
# Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License, version 2.0,
|
|
# as published by the Free Software Foundation.
|
|
#
|
|
# This program is also distributed with certain software (including
|
|
# but not limited to OpenSSL) that is licensed under separate terms,
|
|
# as designated in a particular file or component or in included license
|
|
# documentation. The authors of MySQL hereby grant you an additional
|
|
# permission to link the program and your derivative works with the
|
|
# separately licensed software that they have included with MySQL.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License, version 2.0, for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
|
|
sourcedir=@PROJECT_SOURCE_DIR@
|
|
builddir=@PROJECT_BINARY_DIR@
|
|
installdir=@CMAKE_INSTALL_PREFIX@
|
|
|
|
# Install Trees:
|
|
bindir=@INSTALL_BINDIR@
|
|
sbindir=@INSTALL_SBINDIR@
|
|
libdir=@INSTALL_LIBDIR@
|
|
sharedir=@INSTALL_MYSQLSHAREDIR@
|
|
memcachedbin=@MEMCACHED_BIN_PATH@
|
|
|
|
SOURCE_DIR=$sourcedir
|
|
BUILD_DIR=$builddir
|
|
INSTALL_DIR=$installdir
|
|
|
|
MYSELF=`who am i | awk '{print $1}'`
|
|
WORKING_DIR=`pwd`
|
|
|
|
if test -w $WORKING_DIR
|
|
then
|
|
HOME_BASE=$WORKING_DIR
|
|
else
|
|
HOME_BASE=$HOME
|
|
fi
|
|
|
|
# In an in-source build, BUILD_DIR = SOURCE_DIR.
|
|
# Try BUILD_DIR first. If it does not exist, we assume this is an install,
|
|
# so we use INSTALL_DIR.
|
|
if test -d $BUILD_DIR
|
|
then
|
|
# Use build dir
|
|
RUNTIME_OUTPUT_DIR=$BUILD_DIR/runtime_output_directory
|
|
MEMCACHED_DIR=$BUILD_DIR/storage/ndb/memcache/extra/memcached
|
|
MGM_CLIENT_DIR=$RUNTIME_OUTPUT_DIR
|
|
MGM_SERVER_DIR=$RUNTIME_OUTPUT_DIR
|
|
NDBD_DIR=$RUNTIME_OUTPUT_DIR
|
|
MYSQL_CLIENT_DIR=$RUNTIME_OUTPUT_DIR
|
|
MYSQL_SERVER_DIR=$RUNTIME_OUTPUT_DIR
|
|
MYSQLD_SAFE_DIR=$BUILD_DIR/scripts
|
|
ENGINE_SO_DIR=$BUILD_DIR/library_output_directory
|
|
METADATA_DIR=$BUILD_DIR/scripts/
|
|
else
|
|
# Use install dir
|
|
MEMCACHED_DIR=`dirname $memcachedbin`
|
|
MGM_CLIENT_DIR=$INSTALL_DIR/$sbindir
|
|
MGM_SERVER_DIR=$INSTALL_DIR/$sbindir
|
|
NDBD_DIR=$INSTALL_DIR/$sbindir
|
|
MYSQL_CLIENT_DIR=$INSTALL_DIR/$bindir
|
|
MYSQL_SERVER_DIR=$INSTALL_DIR/$bindir
|
|
MYSQLD_SAFE_DIR=$INSTALL_DIR/$sbindir
|
|
ENGINE_SO_DIR=$INSTALL_DIR/$libdir
|
|
METADATA_DIR=$sharedir/memcache-api
|
|
fi
|
|
|
|
test_paths() {
|
|
test_exec_path $MGM_CLIENT_DIR ndb_mgm
|
|
test_exec_path $MGM_SERVER_DIR ndb_mgmd
|
|
test_exec_path $MYSQL_CLIENT_DIR mysql
|
|
test_exec_path $MYSQL_CLIENT_DIR mysqladmin
|
|
test_exec_path $MYSQL_SERVER_DIR mysqld
|
|
test_exec_path $MYSQLD_SAFE_DIR mysqld_safe
|
|
test_exec_path $NDBD_DIR ndbd
|
|
test_exec_path $MEMCACHED_DIR memcached
|
|
test_read_path $ENGINE_SO_DIR ndb_engine.so
|
|
test_read_path $METADATA_DIR ndb_memcache_metadata.sql
|
|
}
|
|
|
|
test_exec_path() {
|
|
if [ ! -x $1/$2 ]
|
|
then
|
|
echo "Fatal error: cannot execute $2 at $1"
|
|
exit
|
|
fi
|
|
}
|
|
|
|
test_read_path() {
|
|
if [ ! -r $1/$2 ]
|
|
then
|
|
echo "Fatal error: cannot read $2 at $1"
|
|
exit
|
|
fi
|
|
}
|
|
|
|
build_dirs() {
|
|
echo Creating sandbox
|
|
mkdir $HOME_BASE/sandbox
|
|
mkdir $HOME_BASE/sandbox/data
|
|
mkdir $HOME_BASE/sandbox/ndb
|
|
mkdir $HOME_BASE/sandbox/ndb-config
|
|
}
|
|
|
|
write_my_cnf() {
|
|
( echo "[mysqld]"
|
|
echo "ndbcluster"
|
|
echo "datadir=$HOME_BASE/sandbox/data"
|
|
echo "pid-file=$HOME_BASE/sandbox/mysqld.pid"
|
|
echo "user=$MYSELF"
|
|
echo "innodb_log_file_size=1M"
|
|
echo
|
|
) > $HOME_BASE/sandbox/my.cnf
|
|
}
|
|
|
|
write_cluster_ini() {
|
|
( echo "[MGM]"
|
|
echo "NodeId=1"
|
|
echo "datadir=$HOME_BASE/sandbox/ndb"
|
|
echo "hostname=localhost"
|
|
echo
|
|
echo "[DB DEFAULT]"
|
|
echo "NoOfReplicas=1"
|
|
echo "TimeBetweenGlobalCheckpoints=12000"
|
|
echo "DataMemory=200M"
|
|
echo "HeartbeatIntervalDbApi=15000"
|
|
echo
|
|
echo "[NDBD]"
|
|
echo "NodeId=2"
|
|
echo "datadir=$HOME_BASE/sandbox/ndb"
|
|
echo
|
|
echo "[API]"
|
|
echo "[API]"
|
|
echo "[API]"
|
|
echo "[API]"
|
|
echo "[API]"
|
|
echo "[API]"
|
|
echo "[API]"
|
|
) > $HOME_BASE/sandbox/cluster.ini
|
|
}
|
|
|
|
do_install_db() {
|
|
if test `uname` = "Darwin"
|
|
then OUTFILE=`mktemp XXXXXX`
|
|
else OUTFILE=`mktemp`
|
|
fi
|
|
$MYSQL_SERVER_DIR/mysqld --initialize-insecure \
|
|
--basedir=$INSTALL_DIR --datadir=$HOME_BASE/sandbox/data \
|
|
--skip-name-resolve --user=$MYSELF > $OUTFILE
|
|
if test ! -d $HOME_BASE/sandbox/data/mysql
|
|
then echo "Failed: mysqld --initialize did not work:"
|
|
cat $OUTFILE
|
|
rm $OUTFILE
|
|
exit
|
|
else echo "Created MySQL System Tables"
|
|
rm $OUTFILE
|
|
fi
|
|
}
|
|
|
|
wait_for_mysql_ready() {
|
|
while ! $MYSQL_CLIENT_DIR/mysqladmin -s ping
|
|
do
|
|
sleep 1
|
|
echo waiting
|
|
done
|
|
}
|
|
|
|
|
|
start_mgm_server() {
|
|
INITIAL="--initial"
|
|
test -f $HOME_BASE/sandbox/ndb-config/ndb_1_config.bin.1 && INITIAL=""
|
|
|
|
$MGM_SERVER_DIR/ndb_mgmd -f $HOME_BASE/sandbox/cluster.ini \
|
|
--config-dir=$HOME_BASE/sandbox/ndb-config $INITIAL
|
|
|
|
sleep 5
|
|
}
|
|
|
|
start_ndbd() {
|
|
$NDBD_DIR/ndbd
|
|
sleep 5
|
|
}
|
|
|
|
start_mysql_server() {
|
|
$MYSQLD_SAFE_DIR/mysqld_safe --defaults-file=$HOME_BASE/sandbox/my.cnf &
|
|
sleep 3
|
|
wait_for_mysql_ready
|
|
}
|
|
|
|
mysqld_is_running() {
|
|
test_pid mysqld.pid
|
|
}
|
|
|
|
mgm_server_is_running() {
|
|
test_pid ndb/ndb_1.pid
|
|
}
|
|
|
|
ndbd_is_running() {
|
|
test_pid ndb/ndb_2.pid
|
|
}
|
|
|
|
memcached_is_running() {
|
|
test_pid memcached.pid
|
|
}
|
|
|
|
test_pid() {
|
|
test -f sandbox/$1 || return 1
|
|
SERVERPID=`cat $HOME_BASE/sandbox/$1`
|
|
ps -p "$SERVERPID" > /dev/null || return 1
|
|
return 0
|
|
}
|
|
|
|
load_metadata() {
|
|
echo Loading NDB Memcache configuration data
|
|
DDL_SCRIPT=$METADATA_DIR/ndb_memcache_metadata.sql
|
|
$MYSQL_CLIENT_DIR/mysql --connect-timeout=10 -u root < $DDL_SCRIPT || TRY_AGAIN=1
|
|
test "$TRY_AGAIN" = "1" && $MYSQL_CLIENT_DIR/mysql --connect-timeout=10 \
|
|
-u root < $DDL_SCRIPT
|
|
}
|
|
|
|
start_memcached() {
|
|
$MEMCACHED_DIR/memcached -d -v \
|
|
-P $HOME_BASE/sandbox/memcached.pid \
|
|
-E $ENGINE_SO_DIR/ndb_engine.so $1 $2
|
|
}
|
|
|
|
stop_memcached() {
|
|
SERVERPID=`cat $HOME_BASE/sandbox/memcached.pid`
|
|
test -n "$SERVERPID" && kill $SERVERPID
|
|
}
|
|
|
|
stop_mysqld() {
|
|
$MYSQL_CLIENT_DIR/mysqladmin -u root shutdown
|
|
}
|
|
|
|
stop_mgm_server() {
|
|
$MGM_CLIENT_DIR/ndb_mgm -e shutdown
|
|
}
|
|
|
|
final_message() {
|
|
sleep 2
|
|
echo
|
|
echo "Sandbox directory is $HOME_BASE/sandbox"
|
|
echo "Memcached is $MEMCACHED_DIR/memcached"
|
|
echo
|
|
echo "Use \"sh sandbox.sh stop\" to stop memcached & MySQL Cluster"
|
|
echo
|
|
}
|
|
|
|
usage() {
|
|
echo "sandbox.sh start [ndb_mgmd | ndbd | mysql | memcached]"
|
|
echo " stop [ndb_mgmd | mysql | memcached]"
|
|
echo " status"
|
|
echo
|
|
exit
|
|
}
|
|
|
|
cmd_status() {
|
|
if mgm_server_is_running
|
|
then echo "[ndb_mgmd] running"
|
|
else echo "[ndb_mgmd] stopped"
|
|
fi
|
|
if ndbd_is_running
|
|
then echo "[ndbd] running"
|
|
else echo "[ndbd] stopped"
|
|
fi
|
|
if mysqld_is_running
|
|
then echo "[mysqld] running"
|
|
else echo "[mysqld] stopped"
|
|
fi
|
|
if memcached_is_running
|
|
then echo "[memcached] running"
|
|
else echo "[memcached] stopped"
|
|
fi
|
|
}
|
|
|
|
cmd_stop() {
|
|
test "$1" = "memcached" && stop_memcached && exit
|
|
test "$1" = "mysqld" && stop_mysqld && exit
|
|
test "$1" = "ndb_mgmd" && stop_mgm_server && exit
|
|
|
|
test "$1" = "" || usage
|
|
|
|
# stop all
|
|
mysqld_is_running && stop_mysqld
|
|
memcached_is_running && stop_memcached
|
|
mgm_server_is_running && stop_mgm_server
|
|
}
|
|
|
|
cmd_start() {
|
|
test "$1" = "memcached" && start_memcached "$2" "$3" && exit
|
|
test "$1" = "mysqld" && start_mysql_server && exit
|
|
test "$1" = "ndbd" && start_ndbd && exit
|
|
test "$1" = "ndb_mgmd" && start_mgm_server && exit
|
|
|
|
test "$1" = "" || usage
|
|
|
|
# start all
|
|
test -d sandbox || build_dirs
|
|
test -f sandbox/my.cnf || write_my_cnf
|
|
test -f sandbox/cluster.ini || write_cluster_ini
|
|
test -d sandbox/data/mysql || do_install_db
|
|
mgm_server_is_running || start_mgm_server
|
|
ndbd_is_running || start_ndbd
|
|
mysqld_is_running || start_mysql_server
|
|
test -d sandbox/data/ndbmemcache || load_metadata
|
|
memcached_is_running || start_memcached
|
|
|
|
final_message
|
|
}
|
|
|
|
|
|
# ------------------------------ main script --------------------------
|
|
|
|
( cd $HOME_BASE
|
|
test_paths
|
|
if test "$1" = "stop"
|
|
then
|
|
cmd_stop "$2"
|
|
elif test "$1" = "start"
|
|
then
|
|
cmd_start "$2" "$3" "$4"
|
|
elif test "$1" = "status"
|
|
then
|
|
cmd_status
|
|
else
|
|
usage
|
|
fi
|
|
)
|