fix xsegbd to work with the new scheme. needs further testing
[archipelago] / xseg / launch
1 #!/bin/bash
2 #
3 # Launcher for xseg configurations
4
5 NI_SAVED=${NONINTERACTIVE}
6 export NONINTERACTIVE=1
7 source envsetup
8 export NONINTERACTIVE=${NI_SAVED}
9
10 function pretty_print {
11         echo "======================="
12         echo "$1"
13         echo "======================="
14 }
15
16 function fail {
17         echo "${1}"
18         exit 1
19 }
20
21 function parse_config {
22         [ -e ~/.xsegrc ] && source ~/.xsegrc
23
24         [ -z "${HOSTNAME}" ] && HOSTNAME=`hostname`
25         [ -z "${XSEG_HOME}" ] && XSEG_HOME="/root/archip/xseg"
26         [ -z "${MODULES_DIR}" ] && MODULES_DIR="${XSEG_HOME}/lib/kernel"
27         #type:name:nr_ports:nr_requests:request_size:extra_size:page_shift
28         [ -z "${SPEC}" ] && SPEC="segdev:xsegbd:4:1024:12"
29         [ -z "${REQS}" ] && REQS=512
30         [ -z "${PORTS}" ] && PORTS=16
31         [ -z "${IMAGES}" ] && IMAGES="/srv/archip/images"
32         [ -z "${XSEG_LOGS}" ] && BLOCKD_LOGS="/srv/archip/logs"
33         [ -z "${DEVICE_PREFIX}" ] && DEVICE_PREFIX="/dev/xsegbd"
34         [ -z "${XSEGBD_SYSFS}" ] && XSEGBD_SYSFS="/sys/bus/xsegbd"
35         [ -z "${CHRDEV_NAME}" ] && CHRDEV_NAME=/dev/`cat /proc/devices | grep segdev | awk '{print $2}'`
36         [ "${CHRDEV_NAME}" = "/dev/" ] && CHRDEV_NAME="/dev/segdev"
37         [ -z "${CHRDEV_MAJOR}" ] && CHRDEV_MAJOR=`cat /proc/devices | grep segdev | awk '{print $1}'`
38         [ -z "${CHRDEV_MAJOR}" ] && CHRDEV_MAJOR=60
39         [ -z "${NR_OPS}" ] && NR_OPS=16
40 }
41
42 function unload_module {
43         rmmod "$1"
44 }
45
46 function unload_all {
47         unload_module "xsegbd"
48         rm "${CHRDEV_NAME}" || true
49         unload_module "xseg_segdev"
50         unload_module "xseg_pthread"
51         unload_module "xseg_posix"
52         unload_module "segdev"
53         unload_module "xseg"
54 }
55
56 function load_module {
57         (lsmod | grep "$1" > /dev/null) || insmod "${MODULES_DIR}/$1.ko" "$2" || exit 1
58 }
59
60 function mk_chardev {
61         ls "${CHRDEV_NAME}" &> /dev/null || \
62         mknod "${CHRDEV_NAME}" c "${CHRDEV_MAJOR}" 0 || exit 1
63 }
64
65 function load_all {
66         load_module "xseg"
67         load_module "segdev"
68         load_module "xseg_posix"
69         load_module "xseg_pthread"
70         load_module "xseg_segdev"
71         mk_chardev
72         "${XSEG_HOME}/peers/user/xseg" "${SPEC}" create
73         load_module "xsegbd" "spec=$SPEC"
74 }
75
76 # spawn_filed - Spawn a filed instance
77 #
78 # @param $1             root directory  
79 # @param $2             xseg port
80
81 function spawn_filed {
82         "${XSEG_HOME}/peers/user/filed" "$1" -p "$2" -g "${SPEC}" -n ${NR_OPS} -v &> "${XSEG_LOGS}/filed-${HOSTNAME}" &
83 }
84
85 # map_volume - Map a volume to an xsegbd device
86 #
87 # @param $1             target/volume name
88 # @param $2             src port
89 # @param $3             dst port
90 function map_volume {
91         echo "$1 $2:$3:${REQS}" > "${XSEGBD_SYSFS}/add" || exit 1
92 }
93
94 # unmap_device - Unmap an xsegbd device/volume
95 #
96 # @param $1             xsegbd device id
97 function unmap_device {
98         echo "$1" > "${XSEGBD_SYSFS}/remove" || exit 1
99 }
100
101 function help {
102         echo "Usage: ./launch [list | <configuration> [start | stop] | insmod | rmmod]"
103 }
104
105 if [ -n "$NONINTERACTIVE" ]; then
106         exit 0
107 fi
108
109 parse_config
110
111 case $1 in
112 list)
113         echo "filed [start|stop]"
114         echo " "
115         echo "insmod"
116         echo "rmmod"
117         ;;
118 insmod)
119         load_all
120         mk_chardev
121         ;;
122 rmmod)
123         rm ${CHRDEV_NAME}
124         unload_all
125         ;;
126 config)
127         echo "HOSTNAME=${HOSTNAME}"
128         echo "XSEG_HOME=${XSEG_HOME}"
129         echo "MODULES_DIR=${MODULES_DIR}"
130         echo "SPEC=${SPEC}"
131         echo "REQS=${REQS}"
132         echo "PORTS=${PORTS}"
133         echo "IMAGES=${IMAGES}"
134         echo "XSEG_LOGS=${XSEG_LOGS}"
135         echo "DEVICE_PREFIX=${DEVICE_PREFIX}"
136         echo "XSEGBD_SYSFS=${XSEGBD_SYSFS}"
137         echo "CHRDEV_NAME=${CHRDEV_NAME}"
138         echo "CHRDEV_MAJOR=${CHRDEV_MAJOR}"
139         echo "NR_OPS=${NR_OPS}"
140         ;;
141 filed)
142         case $2 in
143         start)
144                 mk_chardev
145                 load_all
146                 spawn_filed ${IMAGES} 1
147 #               map_volume xsegvol 0 1
148                 ;;
149         stop)
150                 pkill -f peers/user/filed
151                 sleep 0.5
152 #               unmap_device 0
153                 rm ${CHRDEV_NAME}
154                 unload_all
155                 ;;
156         *)
157                 help
158                 ;;
159         esac
160         ;;
161 *)
162         help
163         ;;
164 esac
165