#!/bin/sh
#
# aerospike-server	Aerospike Database server
#
# chkconfig: - 85 15
# description:	Starts and stops Aerospike Clustered \
#		Database Server daemon (asd)
# processname:  asd
# config: /etc/aerospike/aerospike.conf
# pidfile: /var/run/aerospike/asd.pid

### BEGIN INIT INFO
# Provides:          aerospike
# Required-Start:    $remote_fs $network
# Required-Stop:     $remote_fs $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Aerospike Clustered Data Service
### END INIT INFO

# Do not load RH compatibility interface.
WITHOUT_RC_COMPAT=1

# Source function library.
. /etc/init.d/functions

PIDDIR=/var/run/aerospike
PIDFILE=/var/run/aerospike/asd.pid
LOCKFILE=/var/lock/subsys/aerospike
RETVAL=0


ASD=/usr/bin/asd
ASDN=$(basename $ASD)

CONFIG_FILE=/etc/aerospike/aerospike.conf
ASD_COLDSTART=
ASD_USER=_aerospike
ASD_GROUP=_aerospike
STOP_TIMEOUT=10
INITFNS=/etc/aerospike/initfns

SourceIfNotEmpty /etc/sysconfig/aerospike-server


if [ -f $INITFNS ]; then . $INITFNS; fi
if [ -n $LD_PRELOAD ]; then export LD_PRELOAD; fi

# in production, the corefiles are so huge as to prevent
# quick restarts of servers. Turn this on only if requested
# DAEMON_COREFILE_LIMIT="unlimited"

set_shmall() {
	mem=`/sbin/sysctl -n kernel.shmall`
	min=4294967296
	if [ ${#mem} -le ${#min} ]; then
	    if [ $mem -lt $min ]; then
		echo "kernel.shmall too low, setting to 4G pages = 16TB"
		/sbin/sysctl -w kernel.shmall=$min
	    fi
	fi
}

set_shmmax() {
	mem=`/sbin/sysctl -n kernel.shmmax`
	min=1073741824
	if [ ${#mem} -le ${#min} ]; then
	    if [ $mem -lt $min ]; then
		echo "kernel.shmmax too low, setting to 1GB"
		/sbin/sysctl -w kernel.shmmax=$min
	    fi
	fi
}

create_piddir() {
	[ -d $PIDDIR ] || mkdir -- $PIDDIR
	chown root:$AS_GROUP $PIDDIR
	chmod 0775 $PIDDIR
}


start() {
	[ -x $ASD ] || exit 0
	ulimit -n 100000
	logger -t aerospike  "ulimit -n="`ulimit -n`
	set_shmall
	set_shmmax
	create_piddir
	start_daemon --pidfile "$PIDFILE" --lockfile "$LOCKFILE" --expect-user $AS_USER --displayname aerospike-server -- $ASD --config-file $CONFIG_FILE $ASD_COLDSTART
	RETVAL=$?
	return $RETVAL
}

stop() {
	stop_daemon --pidfile "$PIDFILE" --lockfile "$LOCKFILE" --expect-user $AS_USER --displayname aerospike-server -- $ASD
	RETVAL=$?
	return $RETVAL
}

restart()
{
	stop
	sleep 3s
	start
}

reload()
{
	msg_reloading aerospike-server
	stop_daemon --pidfile "$PIDFILE" --expect-user $AS_USER -HUP --displayname aerospike-server -- $ASD
	RETVAL=$?
	return $RETVAL
} 

# See how we were called.
case "$1" in
	start)
		start
		;;
	coldstart)
		ASD_COLDSTART="--cold-start"
		start
		;;
	stop)
		stop
		;;
	reload)
		reload
		;;
	restart)
		restart
		;;
	condstop)
		if [ -e "$LOCKFILE" ]; then
			stop
		fi
		;;
	condrestart)
		if [ -e "$LOCKFILE" ]; then
			restart
		fi
		;;
	condreload)
		if [ -e "$LOCKFILE" ]; then
			reload
		fi
		;;
	status)
		status --pidfile "$PIDFILE" --expect-user $AS_USER --displayname aerospike-server -- $ASD
		RETVAL=$?
		;;
	*)
		msg_usage "${0##*/} {start|coldstart|stop|reload|restart|condstop|condrestart|condreload|status}"
		RETVAL=1
esac

exit $RETVAL
