1#!/bin/sh 2 3# Copyright (c) 2013, 2021, Oracle and/or its affiliates. 4# 5# This program is free software; you can redistribute it and/or modify 6# it under the terms of the GNU General Public License, version 2.0, 7# as published by the Free Software Foundation. 8# 9# This program is also distributed with certain software (including 10# but not limited to OpenSSL) that is licensed under separate terms, 11# as designated in a particular file or component or in included license 12# documentation. The authors of MySQL hereby grant you an additional 13# permission to link the program and your derivative works with the 14# separately licensed software that they have included with MySQL. 15# 16# This program is distributed in the hope that it will be useful, 17# but WITHOUT ANY WARRANTY; without even the implied warranty of 18# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19# GNU General Public License, version 2.0, for more details. 20# 21# You should have received a copy of the GNU General Public License 22# along with this program; if not, write to the Free Software 23# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 24 25 26sourcedir=@PROJECT_SOURCE_DIR@ 27builddir=@PROJECT_BINARY_DIR@ 28installdir=@CMAKE_INSTALL_PREFIX@ 29 30# Install Trees: 31bindir=@INSTALL_BINDIR@ 32libexecdir=@INSTALL_SBINDIR@ 33libdir=@INSTALL_LIBDIR@ 34scriptsdir=@INSTALL_SCRIPTDIR@ 35sharedir=@INSTALL_MYSQLSHAREDIR@ 36memcachedbin=@MEMCACHED_BIN_PATH@ 37 38SOURCE_DIR=$sourcedir 39BUILD_DIR=$builddir 40INSTALL_DIR=$installdir 41 42MYSELF=`who am i | awk '{print $1}'` 43WORKING_DIR=`pwd` 44 45if test -w $WORKING_DIR 46 then 47 HOME_BASE=$WORKING_DIR 48 else 49 HOME_BASE=$HOME 50fi 51 52# In an in-source build, BUILD_DIR = SOURCE_DIR. 53# Try BUILD_DIR first. If it does not exist, we assume this is an install, 54# so we use INSTALL_DIR. 55if test -d $BUILD_DIR 56 then 57 # Use build dir 58 MEMCACHED_DIR=$BUILD_DIR/storage/ndb/memcache/extra/memcached 59 MGM_CLIENT_DIR=$BUILD_DIR/storage/ndb/src/mgmclient 60 MGM_SERVER_DIR=$BUILD_DIR/storage/ndb/src/mgmsrv 61 NDBD_DIR=$BUILD_DIR/storage/ndb/src/kernel 62 MYSQL_CLIENT_DIR=$BUILD_DIR/client 63 MYSQL_SERVER_DIR=$BUILD_DIR/scripts 64 ENGINE_SO_DIR=$BUILD_DIR/storage/ndb/memcache 65 METADATA_DIR=$BUILD_DIR/scripts/ 66 SCRIPTS_DIR=$INSTALL_DIR/$scriptsdir # See NOTE below 67 else 68 # Use install dir 69 MEMCACHED_DIR=`dirname $memcachedbin` 70 MGM_CLIENT_DIR=$INSTALL_DIR/$libexecdir 71 MGM_SERVER_DIR=$INSTALL_DIR/$libexecdir 72 NDBD_DIR=$INSTALL_DIR/$libexecdir 73 MYSQL_CLIENT_DIR=$INSTALL_DIR/$bindir 74 MYSQL_SERVER_DIR=$INSTALL_DIR/$libexecdir 75 ENGINE_SO_DIR=$INSTALL_DIR/$libdir 76 METADATA_DIR=$sharedir/memcache-api 77 SCRIPTS_DIR=$INSTALL_DIR/$scriptsdir 78fi 79 80## NOTE. 81## mysql_install_db only works from an installed copy. 82## mtr fixes this by reimplementing mysql_install_db internally. 83## Our solution for now is to hope we find a copy in the install_dir 84 85test_paths() { 86 test_exec_path $MGM_CLIENT_DIR ndb_mgm 87 test_exec_path $MGM_SERVER_DIR ndb_mgmd 88 test_exec_path $MYSQL_CLIENT_DIR mysql 89 test_exec_path $MYSQL_CLIENT_DIR mysqladmin 90 test_exec_path $MYSQL_SERVER_DIR mysqld_safe 91 test_exec_path $NDBD_DIR ndbd 92 test_exec_path $MEMCACHED_DIR memcached 93 test_exec_path $SCRIPTS_DIR mysql_install_db 94 test_read_path $ENGINE_SO_DIR ndb_engine.so 95 test_read_path $METADATA_DIR ndb_memcache_metadata.sql 96} 97 98test_exec_path() { 99 if [ ! -x $1/$2 ] 100 then 101 echo "Fatal error: cannot execute $2 at $1" 102 exit 103 fi 104} 105 106test_read_path() { 107 if [ ! -r $1/$2 ] 108 then 109 echo "Fatal error: cannot read $2 at $1" 110 exit 111 fi 112} 113 114build_dirs() { 115 echo Creating sandbox 116 mkdir $HOME_BASE/sandbox 117 mkdir $HOME_BASE/sandbox/data 118 mkdir $HOME_BASE/sandbox/ndb 119 mkdir $HOME_BASE/sandbox/ndb-config 120} 121 122write_my_cnf() { 123 ( echo "[mysqld]" 124 echo "ndbcluster" 125 echo "datadir=$HOME_BASE/sandbox/data" 126 echo "pid-file=$HOME_BASE/sandbox/mysqld.pid" 127 echo "user=$MYSELF" 128 echo "innodb_log_file_size=1M" 129 echo 130 ) > $HOME_BASE/sandbox/my.cnf 131 } 132 133write_cluster_ini() { 134 ( echo "[MGM]" 135 echo "NodeId=1" 136 echo "datadir=$HOME_BASE/sandbox/ndb" 137 echo "hostname=localhost" 138 echo 139 echo "[DB DEFAULT]" 140 echo "NoOfReplicas=1" 141 echo "TimeBetweenGlobalCheckpoints=12000" 142 echo "DataMemory=180M" 143 echo "IndexMemory=60M" 144 echo "HeartbeatIntervalDbApi=15000" 145 echo 146 echo "[NDBD]" 147 echo "NodeId=2" 148 echo "datadir=$HOME_BASE/sandbox/ndb" 149 echo 150 echo "[API]" 151 echo "[API]" 152 echo "[API]" 153 echo "[API]" 154 echo "[API]" 155 echo "[API]" 156 echo "[API]" 157 ) > $HOME_BASE/sandbox/cluster.ini 158} 159 160do_install_db() { 161 if test `uname` = "Darwin" 162 then OUTFILE=`mktemp XXXXXX` 163 else OUTFILE=`mktemp` 164 fi 165 $SCRIPTS_DIR/mysql_install_db \ 166 --basedir=$INSTALL_DIR --datadir=$HOME_BASE/sandbox/data \ 167 --skip-name-resolve --user=$MYSELF > $OUTFILE 168 if test ! -d $HOME_BASE/sandbox/data/mysql 169 then echo "Failed: mysql_install_db did not work:" 170 cat $OUTFILE 171 rm $OUTFILE 172 exit 173 else echo "Created MySQL System Tables" 174 rm $OUTFILE 175 fi 176} 177 178wait_for_mysql_ready() { 179 while ! $MYSQL_CLIENT_DIR/mysqladmin -s ping 180 do 181 sleep 1 182 echo waiting 183 done 184} 185 186 187start_mgm_server() { 188 INITIAL="--initial" 189 test -f $HOME_BASE/sandbox/ndb-config/ndb_1_config.bin.1 && INITIAL="" 190 191 $MGM_SERVER_DIR/ndb_mgmd -f $HOME_BASE/sandbox/cluster.ini \ 192 --config-dir=$HOME_BASE/sandbox/ndb-config $INITIAL 193 194 sleep 5 195} 196 197start_ndbd() { 198 $NDBD_DIR/ndbd 199 sleep 5 200} 201 202start_mysql_server() { 203 $MYSQL_SERVER_DIR/mysqld_safe --defaults-file=$HOME_BASE/sandbox/my.cnf & 204 sleep 3 205 wait_for_mysql_ready 206} 207 208mysqld_is_running() { 209 test_pid mysqld.pid 210} 211 212mgm_server_is_running() { 213 test_pid ndb/ndb_1.pid 214} 215 216ndbd_is_running() { 217 test_pid ndb/ndb_2.pid 218} 219 220memcached_is_running() { 221 test_pid memcached.pid 222} 223 224test_pid() { 225 test -f sandbox/$1 || return 1 226 SERVERPID=`cat $HOME_BASE/sandbox/$1` 227 ps -p "$SERVERPID" > /dev/null || return 1 228 return 0 229} 230 231load_metadata() { 232 echo Loading NDB Memcache configuration data 233 DDL_SCRIPT=$METADATA_DIR/ndb_memcache_metadata.sql 234 $MYSQL_CLIENT_DIR/mysql --connect-timeout=10 -u root < $DDL_SCRIPT || TRY_AGAIN=1 235 test "$TRY_AGAIN" = "1" && $MYSQL_CLIENT_DIR/mysql --connect-timeout=10 \ 236 -u root < $DDL_SCRIPT 237} 238 239start_memcached() { 240 $MEMCACHED_DIR/memcached -d -v \ 241 -P $HOME_BASE/sandbox/memcached.pid \ 242 -E $ENGINE_SO_DIR/ndb_engine.so $1 $2 243} 244 245stop_memcached() { 246 SERVERPID=`cat $HOME_BASE/sandbox/memcached.pid` 247 test -n "$SERVERPID" && kill $SERVERPID 248} 249 250stop_mysqld() { 251 $MYSQL_CLIENT_DIR/mysqladmin -u root shutdown 252} 253 254stop_mgm_server() { 255 $MGM_CLIENT_DIR/ndb_mgm -e shutdown 256} 257 258final_message() { 259 sleep 2 260 echo 261 echo "Sandbox directory is $HOME_BASE/sandbox" 262 echo "Memcached is $MEMCACHED_DIR/memcached" 263 echo 264 echo "Use \"sh sandbox.sh stop\" to stop memcached & MySQL Cluster" 265 echo 266} 267 268usage() { 269 echo "sandbox.sh start [ndb_mgmd | ndbd | mysql | memcached]" 270 echo " stop [ndb_mgmd | mysql | memcached]" 271 echo " status" 272 echo 273 exit 274} 275 276cmd_status() { 277 if mgm_server_is_running 278 then echo "[ndb_mgmd] running" 279 else echo "[ndb_mgmd] stopped" 280 fi 281 if ndbd_is_running 282 then echo "[ndbd] running" 283 else echo "[ndbd] stopped" 284 fi 285 if mysqld_is_running 286 then echo "[mysqld] running" 287 else echo "[mysqld] stopped" 288 fi 289 if memcached_is_running 290 then echo "[memcached] running" 291 else echo "[memcached] stopped" 292 fi 293} 294 295cmd_stop() { 296 test "$1" = "memcached" && stop_memcached && exit 297 test "$1" = "mysqld" && stop_mysqld && exit 298 test "$1" = "ndb_mgmd" && stop_mgm_server && exit 299 300 test "$1" = "" || usage 301 302 # stop all 303 mysqld_is_running && stop_mysqld 304 memcached_is_running && stop_memcached 305 mgm_server_is_running && stop_mgm_server 306} 307 308cmd_start() { 309 test "$1" = "memcached" && start_memcached "$2" "$3" && exit 310 test "$1" = "mysqld" && start_mysql_server && exit 311 test "$1" = "ndbd" && start_ndbd && exit 312 test "$1" = "ndb_mgmd" && start_mgm_server && exit 313 314 test "$1" = "" || usage 315 316 # start all 317 test -d sandbox || build_dirs 318 test -f sandbox/my.cnf || write_my_cnf 319 test -f sandbox/cluster.ini || write_cluster_ini 320 test -d sandbox/data/mysql || do_install_db 321 mgm_server_is_running || start_mgm_server 322 ndbd_is_running || start_ndbd 323 mysqld_is_running || start_mysql_server 324 test -d sandbox/data/ndbmemcache || load_metadata 325 memcached_is_running || start_memcached 326 327 final_message 328} 329 330 331# ------------------------------ main script -------------------------- 332 333( cd $HOME_BASE 334 test_paths 335 if test "$1" = "stop" 336 then 337 cmd_stop "$2" 338 elif test "$1" = "start" 339 then 340 cmd_start "$2" "$3" "$4" 341 elif test "$1" = "status" 342 then 343 cmd_status 344 else 345 usage 346 fi 347) 348