~percona-core/percona-qa/trunk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#!/bin/bash
# Created by Roel Van de Paar, Percona LLC

# This script executes a single Mongo JS test. In single-use mode, it is executed from within the mongod directory with no options, except TEST_TO_RUN
# (set below) which indicates what test should be run. In automated/wrapper mode (i.e. when called by the wrapper mongo_js_run.sh) one or two variables
# can be passed. The first one ($1) is a working directory which should be used. The second ($2) is the path to mongod. The script will change into this
# directory before continuing with the JS test execution. Note: mongo_js_run.sh will also copy this script into the test directory and modify the
# TEST_TO_RUN parameter for each JS test executed. (Note: If a working directory is passed as $1, it is assumed that this directory already exists)

# Main user/automated script configurable variables
TEST_TO_RUN=./parallel/basic.js            # The actual test to run
PRI_ENGINE=tokuft                          # Primary engine to use for testing (usually tokuft)
SEC_ENGINE=wiredTiger                      # Compare primary engine against this engine (usually mmapv1 or wiredTiger)
SEC_ENGINE=mmapv1
PRI_ENGINE=tokuft
TEST_TO_RUN=./noPassthroughWithMongod/index_retry.js

# Semi-configurable user variables. Automated script configurable variables
VERBOSE=1                                  # Leave to 1 unless you know what you are doing (used for script automation/output log vebosity)
WORKDIR=""                                 # Automatically set to /dev/shm if left empty (recommended)

# Internal variables, do not change
SCRIPT_PWD=$(cd `dirname $0` && pwd)
PRI_ENGINE_NAME=$(echo ${PRI_ENGINE} | tr '[:lower:]' '[:upper:]')
SEC_ENGINE_NAME=$(echo ${SEC_ENGINE} | tr '[:lower:]' '[:upper:]')
PRI_SHORT_ENGINE_NAME=$(echo ${PRI_ENGINE_NAME} | sed 's|V[0-9]\+||')
SEC_SHORT_ENGINE_NAME=$(echo ${SEC_ENGINE_NAME} | sed 's|V[0-9]\+||')

echoit(){
  echo "[$(date +'%T')] $1"
  if [ "${WORKDIR}" != "" ]; then echo "[$(date +'%T')] $1" >> /${WORKDIR}/single_test_mongo.log; fi
}

if [ "${1}" == "" ]; then
  TMPFS_SPACE=$(df -BM | grep '/dev/shm' | awk '{print $4}' | head -n1 | sed 's|[^0-9]||')
  if [ "${TMPFS_SPACE}" == "" -o $TMPFS_SPACE -lt 1000 ]; then
    echo "Assert: not sufficient space on /dev/shm (or there were issues accessing /dev/shm). Expected at least 1GB free, but found only ${TMPFS_SPACE}MB."
    exit 1
  fi
  RANDOMD=$(echo $RANDOM$RANDOM$RANDOM | sed 's/..\(......\).*/\1/')  # Random number generator (6 digits)
  WORKDIR="/dev/shm/${RANDOMD}"
  mkdir -p ${WORKDIR}
  if [ ! -d ${WORKDIR} ]; then
    echo "Assert: attempted to create ${WORKDIR}, but it does not exist after creation!"
    exit 1
  else
    echoit "Setup work directory ${WORKDIR}..."
  fi
else
  WORKDIR="${1}"
  if [ ! -d ${WORKDIR} ]; then
    echo "Assert: a work directory was passed to this script (${WORKDIR}), however this directory does not exist..."
    exit 1
  else
    if [ ${VERBOSE} -eq 1 ]; then echoit "Using passed work directory ${WORKDIR}..."; fi
  fi
fi

if [ "${2}" != "" ]; then
  if [ ! -d ${2} ]; then
    echoit "Assert: a Mongo directory was passed to this script (${2}), however this directory does not exist..."
    exit 1
  else
    cd ${2}
    if [ ${VERBOSE} -eq 1 ]; then echoit "Changed current directory to ${2}..."; fi
  fi
fi

if [ ${VERBOSE} -eq 1 ]; then echoit "Checking prerequisites..."; fi
if [ ! -r mongod -o ! -r mongo -o ! -r mongos ]; then
  echoit "Assert: required binaries ./mongod, ./mongo and ./mongos not all present in the current directory!"
  ps -ef | grep "mongo_js_run" | grep -v grep | awk '{print $2}' | kill -9 >/dev/null 2>&1  # Halting parent script MJR, if running
  exit 1
fi
TEST_TO_RUN=$(echo ${TEST_TO_RUN} | sed 's|^[\.][/]||;s|^jstests[/]||;s|^[\./]\+||')  # If [.][/][jstests][/] is present at the start, remove it
if [ ! -r ${PWD}/jstests/${TEST_TO_RUN} ]; then
  echoit "Assert: test ${TEST_TO_RUN} (i.e. ${PWD}/jstests/${TEST_TO_RUN}) was specified to this script (variable \${TEST_TO_RUN), but the test was not found."
  exit 1
fi

if [ ${VERBOSE} -eq 1 ]; then echoit "Intializing per-engine working directories..."; fi
WORKDIR_SEC="${WORKDIR}/$(echo ${PRI_SHORT_ENGINE_NAME})_RUN_DATA"
mkdir -p ${WORKDIR_SEC}
if [ ! -d ${WORKDIR_SEC} ]; then 
  echoit "Assert: this script tried to create the directory ${WORKDIR_SEC}, but the directory does not exist after creation!"
  exit 1
fi
WORKDIR_PRI="${WORKDIR}/$(echo ${SEC_SHORT_ENGINE_NAME})_RUN_DATA"
mkdir -p ${WORKDIR_PRI}
if [ ! -d ${WORKDIR_PRI} ]; then 
  echoit "Assert: this script tried to create the directory ${WORKDIR_PRI}, but the directory does not exist after creation!"
  exit 1
fi

PORT1=$[10000 + ( $RANDOM % ( 55000 ) )]  # ~10-65K port range
PORT2=$[10000 + ( $RANDOM % ( 55000 ) )]  # ~10-65K port range

while true ; do
  if [ "$PORT1" != "$PORT2" ]  && [[ ! $(netstat -vatn | grep -0 $PORT1) ]] && [[ ! $(netstat -vatn | grep -0 $PORT2) ]]; then
    break
  else
    PORT1=$[10000 + ( $RANDOM % ( 55000 ) )]  # ~10-65K port range
    PORT2=$[10000 + ( $RANDOM % ( 55000 ) )]  # ~10-65K port range
  fi
done

REPORT_PRI=${WORKDIR}/smoke.py_$(echo ${PRI_SHORT_ENGINE_NAME} | sed 's|V[0-9]\+||').log
REPORT_SEC=${WORKDIR}/smoke.py_$(echo ${SEC_SHORT_ENGINE_NAME} | sed 's|V[0-9]\+||').log
# --with-cleanbb cannot be used (yet): ref smoke.py; cleanbb terminates all mongod instances on the box. 
# It is likely also not necessary, as we use per-trial working directories already 
DEFAULT_OPTIONS="--mode=files ${PWD}/jstests/${TEST_TO_RUN}"
OPTIONS_PRI="--port=$PORT1 --smoke-db-prefix ${WORKDIR_PRI} --report-file=${REPORT_PRI}.report --storageEngine ${PRI_ENGINE} ${DEFAULT_OPTIONS}"
OPTIONS_SEC="--port=$PORT2 --smoke-db-prefix ${WORKDIR_SEC} --report-file=${REPORT_SEC}.report --storageEngine ${SEC_ENGINE} ${DEFAULT_OPTIONS}"
FILTER='tests succeeded'

if [ ${VERBOSE} -eq 1 ]; then echoit "Terminating all owned mongod instances..."; fi
ps -ef | egrep "mongo" | grep "$(whoami)" | grep "$$" | grep ${WORKDIR} | egrep -v "grep|single|js_run" | awk '{print $2}' | xargs kill -9 2>/dev/null

if [ ${VERBOSE} -eq 1 ]; then echoit "Executing test ${TEST_TO_RUN} against ${PRI_ENGINE}..."; fi
./buildscripts/smoke.py ${OPTIONS_PRI} >> ${REPORT_PRI} 2>&1
RESULT_PRI="$(cat ${REPORT_PRI} | grep "${FILTER}" | head -n1)"
echoit "> ${RESULT_PRI} for ${PRI_ENGINE} on ${TEST_TO_RUN}"

if [ ${VERBOSE} -eq 1 ]; then echoit "Terminating all owned mongod instances..."; fi
ps -ef | egrep "mongo" | grep "$(whoami)" | grep "$$" | grep ${WORKDIR} | egrep -v "grep|single|js_run" | awk '{print $2}' | xargs kill -9 2>/dev/null

if [ ${VERBOSE} -eq 1 ]; then echoit "Executing test ${TEST_TO_RUN} against ${SEC_ENGINE}..."; fi
./buildscripts/smoke.py ${OPTIONS_SEC} >> ${REPORT_SEC} 2>&1
RESULT_SEC="$(cat ${REPORT_SEC} | grep "${FILTER}" | head -n1)"
echoit "> ${RESULT_SEC} for ${SEC_ENGINE} on ${TEST_TO_RUN}"

if [ ${VERBOSE} -eq 1 ]; then echoit "Terminating all owned mongod instances..."; fi
ps -ef | egrep "mongo" | grep "$(whoami)" | grep "$$" | grep ${WORKDIR} | egrep -v "grep|single|js_run" | awk '{print $2}' | xargs kill -9 2>/dev/null

if   [ "${RESULT_PRI}" == "1 tests succeeded" -a "${RESULT_SEC}" == "1 tests succeeded" ]; then
  exit 0
elif [ "${RESULT_PRI}" == "0 tests succeeded" -a "${RESULT_SEC}" == "1 tests succeeded" ]; then
  exit 1
elif [ "${RESULT_PRI}" == "1 tests succeeded" -a "${RESULT_SEC}" == "0 tests succeeded" ]; then
  exit 2
elif [ "${RESULT_PRI}" == "0 tests succeeded" -a "${RESULT_SEC}" == "0 tests succeeded" ]; then
  exit 3
else
  exit 4
fi