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