#!/bin/bash # Copyright 2012 GRNET S.A. All rights reserved. # # Redistribution and use in source and binary forms, with or # without modification, are permitted provided that the following # conditions are met: # # 1. Redistributions of source code must retain the above # copyright notice, this list of conditions and the following # disclaimer. # # 2. Redistributions in binary form must reproduce the above # copyright notice, this list of conditions and the following # disclaimer in the documentation and/or other materials # provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # The views and conclusions contained in the software and # documentation are those of the authors and should not be # interpreted as representing official policies, either expressed # or implied, of GRNET S.A. # NI_SAVED=${NONINTERACTIVE} export NONINTERACTIVE=1 source envsetup export NONINTERACTIVE=${NI_SAVED} set +e function pretty_print { echo "=======================" echo "$1" echo "=======================" } function fail { echo "${1}" exit 1 } function parse_config { [ -e ~/.xsegrc ] && source ~/.xsegrc [ -z "${HOSTNAME}" ] && HOSTNAME=`hostname` [ -z "${XSEG_HOME}" ] && XSEG_HOME="/root/archip/xseg" [ -z "${MODULES_DIR}" ] && MODULES_DIR="${XSEG_HOME}/lib/kernel" [ -z "${SPEC}" ] && SPEC="segdev:xsegbd:512:1024:12" [ -z "${REQS}" ] && REQS=512 [ -z "${PORTS}" ] && PORTS=512 [ -z "${IMAGES}" ] && IMAGES="/home/user/archip/xseg/peers/user/foo" [ -z "${MAPS}" ] && MAPS="/home/user/archip/xseg/peers/user/foo" [ -z "${PITHOS}" ] && PITHOS="/srv/pithos/data/blocks" [ -z "${PITHOSMAPS}" ] && PITHOSMAPS="/srv/pithos/data/maps" [ -z "${XSEG_LOGS}" ] && XSEG_LOGS="/srv/archip/logs" [ -z "${DEVICE_PREFIX}" ] && DEVICE_PREFIX="/dev/xsegbd" [ -z "${XSEGBD_SYSFS}" ] && XSEGBD_SYSFS="/sys/bus/xsegbd" [ -z "${CHRDEV_NAME}" ] && CHRDEV_NAME="/dev/`cat /proc/devices | grep segdev | awk '{print $2}'`" [ "${CHRDEV_NAME}" = "/dev/" ] && CHRDEV_NAME="/dev/segdev" [ -z "${CHRDEV_MAJOR}" ] && CHRDEV_MAJOR=`cat /proc/devices | grep segdev | awk '{print $1}'` [ -z "${CHRDEV_MAJOR}" ] && CHRDEV_MAJOR=60 [ -z "${NR_OPS}" ] && NR_OPS=128 [ -z "${BPORT}" ] && BPORT=0 [ -z "${VPORT_START}" ] && VPORT_START=4 [ -z "${VPORT_END}" ] && VPORT_END=200 [ -z "${MPORT}" ] && MPORT=1 [ -z "${MBPORT}" ] && MBPORT=2 [ -z "${VTOOL}" ] && VTOOL=3 } function unload_module { rmmod "$1" } function unload_all { unload_module "xsegbd" rm "${CHRDEV_NAME}" || true unload_module "xseg_segdev" unload_module "xseg_posix" unload_module "xseg_pthread" unload_module "segdev" unload_module "xseg" } function load_module { (lsmod | grep "$1" > /dev/null) || insmod "${MODULES_DIR}/$1.ko" "$2" || exit 1 } function mk_chardev { ls "${CHRDEV_NAME}" &> /dev/null || \ mknod "${CHRDEV_NAME}" c "${CHRDEV_MAJOR}" 0 || exit 1 } function load_all { load_module "xseg" load_module "segdev" load_module "xseg_posix" load_module "xseg_pthread" load_module "xseg_segdev" mk_chardev "${XSEG_HOME}/peers/user/xseg" "${SPEC}" create || true load_module "xsegbd" "spec=$SPEC" } function create_segment { "${XSEG_HOME}/peer/users/xseg" "${SPEC}" create } function destroy_segment { "${XSEG_TOOL}" "${SPEC}" destroy } function alloc_requests { "${XSEG_TOOL}" "${SPEC}" $1 alloc_requests $2 } function free_requests { "${XSEG_TOOL}" "${SPEC}" $1 free_requests $2 } function spawn_filed { pgrep -f "peers/user/filed" || \ "${XSEG_HOME}/peers/user/filed" "$IMAGES" -p "$BPORT" -g "${SPEC}" -n \ ${NR_OPS} &> "${XSEG_LOGS}/filed-${HOSTNAME}" & } function spawn_pfiled { "${XSEG_HOME}/peers/user/pfiled" -p "$BPORT" -g "${SPEC}" -n \ ${NR_OPS} "${PITHOS}" "${IMAGES}" -v 1 &> "${XSEG_LOGS}/pfiled-${HOSTNAME}" & } function spawn_pfiledm { "${XSEG_HOME}/peers/user/pfiled" -p "$MBPORT" -g "${SPEC}" -n \ ${NR_OPS} "${PITHOSMAPS}" "${MAPS}" -v 1 &> "${XSEG_LOGS}/pfiledm-${HOSTNAME}" & } function spawn_sosd { "${XSEG_HOME}/peers/user/mt-sosd" -p "$BPORT" -g "${SPEC}" -n \ ${NR_OPS} --pool "blocks" -v 3 &> "${XSEG_LOGS}/sosd-${HOSTNAME}" & } function spawn_sosdm { "${XSEG_HOME}/peers/user/mt-sosd" -p "$MBPORT" -g "${SPEC}" -n \ ${NR_OPS} --pool "maps" -v 3 &> "${XSEG_LOGS}/sosdm-${HOSTNAME}" & } function spawn_vlmcd { pgrep -f "peers/user/st-vlmcd" || \ "${XSEG_HOME}/peers/user/st-vlmcd" -t 1 -sp "$VPORT_START" \ -ep "$VPORT_END" -bp "$BPORT" -mp "$MPORT" -g \ "${SPEC}" -n ${NR_OPS} -v 3 &> "${XSEG_LOGS}/vlmcd-${HOSTNAME}" & # alloc_requests "$VPORT:0" 128 } function spawn_mapperdc { echo "\"${XSEG_HOME}/peers/user/mt-mapperd\" -t 1 -sp \"$MPORT\" -ep \"$MPORT\" -bp \"$BPORT\" -mbp \"$MBPORT\" -g \"${SPEC}\" -n ${NR_OPS} -v 3" pgrep -f "mt-mapperd" || \ "${XSEG_HOME}/peers/user/mt-mapperd" -t 1 -sp "$MPORT" -ep "$MPORT"\ -bp "$BPORT" -mbp "$MBPORT" -g "${SPEC}"\ -n ${NR_OPS} -v 3 &> "${XSEG_LOGS}/mapperd-${HOSTNAME}" & # alloc_requests "$MPORT:0" 128 } function spawn_mapperd { pgrep -f "mapperd.py" || \ "${XSEG_HOME}/peers/user/mapperd.py" -p "$MPORT" -b "$BPORT" -g "${SPEC}" \ &> "${XSEG_LOGS}/mapperd-${HOSTNAME}" & # alloc_requests "$MPORT:0" 128 } # map_volume - Map a volume to an xsegbd device # # @param $1 target/volume name # @param $2 src port # @param $3 dst port function map_volume { echo "$1 $2:$3:${REQS}" > "${XSEGBD_SYSFS}/add" || exit 1 } # unmap_device - Unmap an xsegbd device/volume # # @param $1 xsegbd device id function unmap_device { echo "$1" > "${XSEGBD_SYSFS}/remove" || exit 1 } function help { echo "Usage: ./launch [list | [start | stop] | insmod | rmmod]" } if [ -n "$NONINTERACTIVE" ]; then exit 0 fi parse_config XSEG_TOOL="${XSEG_HOME}/peers/user/xseg" case $1 in list) echo "filed [start|stop]" echo "map [start|stap]" echo " " echo "insmod" echo "rmmod" ;; insmod) load_all mk_chardev ;; rmmod) rm ${CHRDEV_NAME} unload_all ;; config) echo "HOSTNAME=${HOSTNAME}" echo "XSEG_HOME=${XSEG_HOME}" echo "MODULES_DIR=${MODULES_DIR}" echo "SPEC=${SPEC}" echo "REQS=${REQS}" echo "PORTS=${PORTS}" echo "IMAGES=${IMAGES}" echo "PITHOS=${PITHOS}" echo "XSEG_LOGS=${XSEG_LOGS}" echo "DEVICE_PREFIX=${DEVICE_PREFIX}" echo "XSEGBD_SYSFS=${XSEGBD_SYSFS}" echo "CHRDEV_NAME=${CHRDEV_NAME}" echo "CHRDEV_MAJOR=${CHRDEV_MAJOR}" echo "NR_OPS=${NR_OPS}" echo "BPORT=${BPORT}" echo "VPORT=${VPORT}" echo "MPORT=${MPORT}" ;; filed) case $2 in start) load_all sleep 0.5 spawn_filed sleep 0.5 map_volume xsegvol 3 0 ;; stop) pkill -f peers/user/filed sleep 0.5 unmap_device 3 unload_all ;; esac ;; map) case $2 in start) load_all sleep 0.5 spawn_pfiled spawn_mapperd spawn_vlmcd ;; stop) pkill -f peers/user/mt-vlmcd || true # free_requests "$VPORT:0" 128 || true pkill -f peers/user/mt-mapperd || true # free_requests "$MPORT:0" 128 || true pkill -f peers/user/pfiled || true sleep 0.5 unload_all ;; *) help ;; esac ;; nomodules) case $2 in start) spawn_filed spawn_mapperd spawn_vlmcd ;; stop) pkill -f peers/user/mt-vlmcd || true # free_requests "$VPORT:0" 128 || true pkill -f peers/user/mt-mapperd || true # free_requests "$MPORT:0" 128 || true pkill -f peers/user/filed || true ;; *) help ;; esac ;; one) case $2 in start) load_all sleep 1 spawn_filed spawn_mapperdc spawn_vlmcd ;; stop) pkill -f peers/user/mt-vlmcd || true # free_requests "$VPORT:0" 128 || true pkill -f peers/user/mt-mapperd || true # free_requests "$MPORT:0" 128 || true pkill -f peers/user/filed || true sleep 0.5 unload_all ;; *) help ;; esac ;; doublemap) case $2 in start) load_all sleep 0.5 spawn_pfiled spawn_pfiledm spawn_mapperdc spawn_vlmcd ;; stop) pkill -f peers/user/st-vlmcd || true # free_requests "$VPORT:0" 128 || true pkill -f peers/user/mt-mapperd || true # free_requests "$MPORT:0" 128 || true pkill -f peers/user/pfiled || true sleep 0.5 unload_all ;; *) help ;; esac ;; mapperd) case $2 in start) spawn_mapperdc ;; stop) pkill -f peers/user/mt-mapperd || true ;; *) help ;; esac ;; doublesosd) case $2 in start) load_all sleep 0.5 spawn_sosd spawn_sosdm spawn_mapperdc spawn_vlmcd ;; stop) pkill -f peers/user/st-vlmcd || true # free_requests "$VPORT:0" 128 || true pkill -f peers/user/mt-mapperd || true # free_requests "$MPORT:0" 128 || true pkill -f peers/user/mt-sosd || true sleep 0.5 unload_all ;; *) help ;; esac ;; mtmapperd) case $2 in start) spawn_mapperdc ;; stop) pkill -f peers/user/mt-mapperd || true ;; *) help ;; esac ;; *) help ;; esac