TestRunnerCodaJ12Multi.sh 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556
  1. #!/bin/bash
  2. source TestRunnerCommon.sh
  3. # Global varaibles for encoder options
  4. enable_sync=0
  5. wiki_log_file="./log/confluence.log"
  6. instance_num=0
  7. DEFAULT_BS_SIZE=5242880 # 5MB
  8. MIN_BS_SIZE=8192 # 8KB
  9. simulation="false"
  10. ################################################################################
  11. # Initialize parameter variables #
  12. ################################################################################
  13. function help {
  14. echo ""
  15. echo "-------------------------------------------------------------------------------"
  16. echo "Chips&Media conformance Tool v2.0"
  17. echo "All copyright reserved by Chips&Media"
  18. echo "-------------------------------------------------------------------------------"
  19. echo "$0 OPTION --input=cfg1,cfg2,... --instance-num=n"
  20. echo "-h help"
  21. echo "--enable-random It generates random parameters"
  22. echo "--bin-dir ref-c directory, default: ../../../design/ref_c/bin/Linux"
  23. echo "--cfg-dir base directory of encoder configuration files. default: ../../../fpga/board/jpgcfg_v20"
  24. echo "--yuv-dir base directory storing YUV. default: ./yuv"
  25. echo "--enable-tiledMode enable tiled mode"
  26. echo "--stream-endian ENDIAN bitstream endianness. refer to datasheet Chapter 4."
  27. echo "--frame-endian ENDIAN pixel endianness of 16bit input source. refer to datasheet Chapter 4."
  28. echo "--slice-height the vertical height of a slice. multiple of 16 for 420, multiple of 8 for others"
  29. echo "--enable-slice-intr enable get the interrupt at every slice encoded"
  30. echo "--pixelj 16bit-pixel justification. 0(default) - msb justified, 1 - lsb justified in little-endianness"
  31. echo "--bs-size bitstream buffer size in byte"
  32. echo "--instance-num The number of instances"
  33. }
  34. function generate_parameters {
  35. local input_file=$1
  36. local is_encoder=$2
  37. local ext="${input_file##%.}"
  38. if [ "$is_encoder" == "true" ]; then
  39. read_cfg $input_file
  40. else
  41. get_jpeg_info $input_file $jpeg_12bit
  42. fi
  43. if [ "$g_random_test" == "1" ] || [ "$txt_param_switch" == "1" ]; then
  44. g_stream_endian=$(gen_val 0 3 $stream_endian_temp)
  45. if [ "$jpeg_12bit" == "1" ]; then
  46. g_frame_endian=$(gen_val 0 7 $frame_endian_temp)
  47. else
  48. g_frame_endian=$(gen_val 0 3 $frame_endian_temp)
  49. fi
  50. slice_random=$(gen_val 0 1) # 0: disable slice done, 1: enable slice_done
  51. if [ "$slice_random" == "1" ] || [ "$slice_height_temp" != "0" ]; then
  52. if [ "$is_encoder" == "true" ]; then
  53. g_slice_height=$(gen_valid_slice_height $cfg_width $cfg_height $cfg_img_format $slice_height_temp)
  54. else
  55. pic_height_in_8=$(($jpg_height/8))
  56. if [ -z $slice_height_temp ]; then
  57. g_slice_height=$(gen_val 0 $pic_height_in_8 $slice_height_temp)
  58. g_slice_height=$(($g_slice_height * 8))
  59. else
  60. g_slice_height=$slice_height_temp
  61. fi
  62. fi
  63. if [ "$g_slice_height" != "0" ]; then
  64. g_enable_slice_intr=$(gen_val 0 1 $g_enable_slice_intr_temp)
  65. else
  66. g_enable_slice_intr=0
  67. fi
  68. else
  69. g_slice_height=0
  70. g_enable_slice_intr=0
  71. fi
  72. g_pixel_just=$(gen_val 0 1 $pixel_just_temp)
  73. g_bs_size=$(gen_val $MIN_BS_SIZE $DEFAULT_BS_SIZE $bs_size_temp)
  74. g_bs_size=$((($g_bs_size + 4095) & ~4095))
  75. g_tiled_mode=$(gen_val 0 0 $g_tiled_mode_temp)
  76. else
  77. g_stream_endian=$(gen_val 0 0 $stream_endian_temp)
  78. g_frame_endian=$(gen_val 0 0 $frame_endian_temp)
  79. if [ "$is_encoder" == "true" ]; then
  80. g_slice_height=$(gen_valid_slice_height $cfg_width $cfg_height $cfg_img_format $slice_height_temp)
  81. else
  82. pic_height_in_8=$(($jpg_height/8))
  83. if [ -z $slice_height_temp ]; then
  84. g_slice_height=$(gen_val 0 $pic_height_in_8 $slice_height_temp)
  85. g_slice_height=$(($g_slice_height * 8))
  86. else
  87. g_slice_height=$slice_height_temp
  88. fi
  89. fi
  90. g_enable_slice_intr=$(gen_val 0 0 $g_enable_slice_intr_temp)
  91. g_pixel_just=$(gen_val 0 0 $pixel_just_temp)
  92. g_bs_size=$(gen_val $DEFAULT_BS_SIZE $DEFAULT_BS_SIZE $bs_size_temp)
  93. g_bs_size=$((($g_bs_size + 4095) & ~4095))
  94. g_tiled_mode=$(gen_val 0 0 $g_tiled_mode_temp)
  95. fi
  96. }
  97. ################################################################################
  98. # Parse arguments #
  99. ################################################################################
  100. OPTSTRING="-o e:hw: -l input:"
  101. OPTSTRING="${OPTSTRING},enable-random,bin-dir:,cfg-dir:,yuv-dir:"
  102. OPTSTRING="${OPTSTRING},instance-num:,12bit:"
  103. OPTSTRING="${OPTSTRING},stream-endian:,frame-endian:,output:"
  104. OPTSTRING="${OPTSTRING},slice-height:,enable-slice-intr:,pixelj:,bs-size:,enable-tiledMode:"
  105. OPTS=`getopt $OPTSTRING -- "$@"`
  106. if [ $? -ne 0 ]; then
  107. exit 1
  108. fi
  109. eval set -- "$OPTS"
  110. while true; do
  111. case "$1" in
  112. -h)
  113. help
  114. exit 1
  115. shift;;
  116. -e)
  117. in_comp_param="$2"
  118. shift 2;;
  119. --bin-dir)
  120. bin_dir_user=$2
  121. shift 2;;
  122. --enable-random)
  123. g_random_test=1
  124. shift;;
  125. --cfg-dir)
  126. cfg_dir_user=$2
  127. shift 2;;
  128. --input)
  129. input_param=$2
  130. shift 2;;
  131. --yuv-dir)
  132. yuv_dir_user=$2
  133. shift 2;;
  134. #shift 2;;
  135. --instance-num)
  136. instance_num="$2"
  137. shift 2;;
  138. --12bit)
  139. jpeg_12bit_multi=$2
  140. shift 2;;
  141. --enable-tiledMode)
  142. g_tiled_mode_multi=$2
  143. shift 2;;
  144. --stream-endian)
  145. stream_endian_multi="$2"
  146. shift 2;;
  147. --frame-endian)
  148. frame_endian_multi="$2"
  149. shift 2;;
  150. --slice-height)
  151. slice_height_multi="$2"
  152. shift 2;;
  153. --enable-slice-intr)
  154. g_enable_slice_intr_multi="$2"
  155. shift 2;;
  156. --pixelj)
  157. pixel_just_multi="$2"
  158. shift 2;;
  159. --bs-size)
  160. bs_size_multi="$2"
  161. shift 2;;
  162. --output)
  163. output_multi="$2"
  164. shift 2;;
  165. --)
  166. shift
  167. break;;
  168. esac
  169. done
  170. shift $(($OPTIND - 1))
  171. yuv_dir="./yuv"
  172. #bin_dir="../../../design/ref_c/bin/Linux"
  173. bin_dir="./"
  174. #cfg_dir="../../../fpga/board/jpgcfg_v20"
  175. cfg_dir="./cfg"
  176. if [ "$simulation" == "true" ]; then
  177. ACLK_MIN=160
  178. ACLK_MAX=300
  179. CCLK_MIN=160
  180. CCLK_MAX=300
  181. DEFAULT_ACLK=200
  182. DEFAULT_CCLK=200
  183. test_exec="./runit"
  184. g_random_test=0
  185. else
  186. DEFAULT_ACLK=20
  187. DEFAULT_CCLK=20
  188. test_exec="./multi_instance_test"
  189. fi
  190. if [ -z $aclk_freq_temp ]; then
  191. g_aclk=$DEFAULT_ACLK
  192. else
  193. g_aclk=$aclk_freq_temp
  194. fi
  195. if [ -z $cclk_freq_temp ]; then
  196. g_cclk=$DEFAULT_CCLK
  197. else
  198. g_cclk=$cclk_freq_temp
  199. fi
  200. if [ ! -z $yuv_dir_user ]; then
  201. yuv_dir="$yuv_dir_user"
  202. fi
  203. if [ ! -z $cfg_dir_user ]; then
  204. cfg_dir="$cfg_dir_user"
  205. fi
  206. if [ ! -z $bin_dir_user ]; then
  207. bin_dir="$bin_dir_user"
  208. fi
  209. tiled_exec="./tiled_mode"
  210. if [ ! -f ./$test_exec ] ; then
  211. echo " $test_exec file doesn't exist";
  212. exit 1
  213. fi
  214. ################################################################################
  215. # make log info
  216. ################################################################################
  217. mkdir -p temp
  218. mkdir -p output
  219. mkdir -p log/multi_conformance
  220. if [ $simulation == "true" ]; then
  221. conf_log_path="simv.log"
  222. conf_err_log_path="simv_error.log"
  223. else
  224. conf_log_path="log/multi_conformance/${streamset_file}.log"
  225. conf_err_log_path="log/multi_conformance/${streamset_file}_error.log"
  226. fi
  227. temp_log_path="./temp/temp.log"
  228. echo "" > $conf_log_path
  229. echo "" > $conf_err_log_path
  230. echo "" > $temp_log_path
  231. beginTime=$(date +%s%N)
  232. output=()
  233. golden=()
  234. ################################################################################
  235. # Add test param #
  236. # Options of the each instance are seperated by "," #
  237. ################################################################################
  238. test_param=""
  239. comp_param=""
  240. for ((i=0;i<$instance_num;i++)); do
  241. #######################
  242. # separate parameters #
  243. #######################
  244. g_tiled_mode_temp=0
  245. jpeg_12bit=0
  246. if [ -n "$input_param" ]; then
  247. filename=$(echo ${input_param} | cut -d',' -f$(($i+1)))
  248. ext=${filename##*.}
  249. ext=$(tr '[:upper:]' '[:lower:]' <<< $ext)
  250. if [ "$ext" == "cfg" ]; then
  251. is_encoder="true"
  252. input_path=${cfg_dir}/${filename}
  253. refc_exec="Nieuport_JpgEnc"
  254. output[$i]="instance_${i}_output.jpg"
  255. golden[$i]="output_refc_${i}.jpg"
  256. else
  257. is_encoder="false"
  258. input_path="$filename"
  259. refc_exec="Nieuport_JpgDec"
  260. output[$i]="instance_${i}_output.yuv"
  261. golden[$i]="output_refc_${i}.yuv"
  262. fi
  263. rm -f ${output[$i]}
  264. rm -f ${golden[$i]}
  265. stream[$i]=$filename
  266. if [ "$comp_param" != "" ]; then
  267. comp_param="${comp_param},"
  268. fi
  269. if [ "$is_encoder" == "true" ]; then
  270. comp_param="${comp_param}0"
  271. else
  272. comp_param="${comp_param}1"
  273. fi
  274. fi
  275. if [ -n "$output_multi" ]; then
  276. output[$i]=$(echo ${output_multi} | cut -d',' -f$(($i+1)))
  277. fi
  278. if [ -n "$stream_endian_multi" ]; then
  279. stream_endian_temp=$(echo ${stream_endian_multi} | cut -d',' -f$(($i+1)))
  280. fi
  281. if [ -n "$frame_endian_multi" ]; then
  282. frame_endian_temp=$(echo ${frame_endian_multi} | cut -d',' -f$(($i+1)))
  283. fi
  284. if [ -n "$slice_height_multi" ]; then
  285. slice_height_temp=$(echo ${slice_height_multi} | cut -d',' -f$(($i+1)))
  286. fi
  287. if [ -n "$g_enable_slice_intr_multi" ]; then
  288. g_enable_slice_intr_temp=$(echo ${g_enable_slice_intr_multi} | cut -d',' -f$(($i+1)))
  289. fi
  290. if [ -n "$pixel_just_multi" ]; then
  291. pixel_just_temp=$(echo ${pixel_just_multi} | cut -d',' -f$(($i+1)))
  292. fi
  293. if [ -n "$bs_size_multi" ]; then
  294. bs_size_temp=$(echo ${bs_size_multi} | cut -d',' -f$(($i+1)))
  295. fi
  296. if [ -n "$g_tiled_mode_multi" ]; then
  297. g_tiled_mode_temp=$(echo ${g_tiled_mode_multi} | cut -d',' -f$(($i+1)))
  298. fi
  299. if [ -n "$jpeg_12bit_multi" ]; then
  300. jpeg_12bit=$(echo ${jpeg_12bit_multi} | cut -d',' -f$(($i+1)))
  301. fi
  302. ################################################################################
  303. # read from cfg file name #
  304. ################################################################################
  305. if [[ $filename == *"12b"* ]]; then
  306. echo "set jpeg_12bit from cfg file name"
  307. jpeg_12bit=1
  308. fi
  309. if [[ $filename == *"tiled"* ]]; then
  310. echo "set g_tiled_mode from cfg file name"
  311. g_tiled_mode_temp=1
  312. fi
  313. ################################################################################
  314. # make argc & argv parameter #
  315. ################################################################################
  316. generate_parameters $input_path $is_encoder
  317. if [ "$is_encoder" == "true" ]; then
  318. ################################################################################
  319. # Create Input YUV data for tiledMode #
  320. ################################################################################
  321. if [ "$g_tiled_mode" == "1" ]; then
  322. generate_input_yuv ${input_path}
  323. result=$?
  324. if [ "$result" != "0" ]; then
  325. log_conf "failed to create yuv file $input_path" $conf_log_path
  326. log_conf "[RESULT] FAILURE" $conf_log_path
  327. echo "failed to create yuv file $input_path" >> $conf_err_log_path
  328. echo "[RESULT] FAILURE" >> $conf_err_log_path
  329. continue
  330. fi
  331. fi
  332. fi
  333. ################################################################################
  334. # Golden Data #
  335. ################################################################################
  336. log_conf "--------------------------------------------------------------------------------" ${temp_log_path}
  337. if [ "$is_encoder" == "true" ]; then
  338. generate_golden_stream $filename ${golden[$i]}
  339. else
  340. if [ "$jpeg_12bit" == "1" ]; then
  341. g_jpeg_12bit="true"
  342. else
  343. g_jpeg_12bit="false"
  344. fi
  345. generate_golden_yuv $input_path ${golden[$i]}
  346. fi
  347. result=$?
  348. log_conf "--------------------------------------------------------------------------------" ${temp_log_path}
  349. if [ $result -ne 0 ]; then
  350. exit $result
  351. fi
  352. ################################################################################
  353. # make test param
  354. ################################################################################
  355. is_encoder[$i]=0 #encoder
  356. if [ "$i" = "0" ]; then
  357. codec_std_test_param="${is_encoder[$i]}"
  358. stream_test_param="${filename}"
  359. if [ -n ${output[$i]} ]; then
  360. output_test_param="${output[$i]}"
  361. fi
  362. stream_endian_test_param="${g_stream_endian}"
  363. frame_endian_test_param="${g_frame_endian}"
  364. bs_size_test_param="${g_bs_size}"
  365. slice_height_test_param="${g_slice_height}"
  366. slice_intr_test_param="${g_enable_slice_intr}"
  367. tiled_mode_test_param="${g_tiled_mode}"
  368. jpeg_12bit_test_param="${jpeg_12bit}"
  369. pixelj_test_param="${g_pixel_just}"
  370. else
  371. codec_std_test_param="${codec_std_test_param},${is_encoder[$i]}"
  372. stream_test_param="${stream_test_param},${filename}"
  373. if [ -n ${output[$i]} ]; then
  374. output_test_param="${output_test_param},${output[$i]}"
  375. fi
  376. stream_endian_test_param="${stream_endian_test_param},${g_stream_endian}"
  377. frame_endian_test_param="${frame_endian_test_param},${g_frame_endian}"
  378. bs_size_test_param="${bs_size_test_param},${g_bs_size}"
  379. slice_height_test_param="${slice_height_test_param},${g_slice_height}"
  380. slice_intr_test_param="${slice_intr_test_param},${g_enable_slice_intr}"
  381. tiled_mode_test_param="${tiled_mode_test_param},${g_tiled_mode}"
  382. jpeg_12bit_test_param="${jpeg_12bit_test_param},${jpeg_12bit}"
  383. pixelj_test_param="${pixelj_test_param},${g_pixel_just}"
  384. fi
  385. ################################################################################
  386. # print information #
  387. ################################################################################
  388. log_conf "--------------------------------------------------------------------------------" ${temp_log_path}
  389. log_conf "RANDOM TEST : ${ON_OFF[$g_random_test]}" $temp_log_path
  390. log_conf "INSTANCE NUM : $i" $temp_log_path
  391. log_conf "CFG : $filename " $temp_log_path
  392. log_conf "ENDIAN : STREAM($g_stream_endian) FRAME($g_frame_endian)" $temp_log_path
  393. log_conf "STANDARD : JPEG" $temp_log_path
  394. log_conf "CBCR interleave: ${ON_OFF[$g_cbcr_interleave]}" $temp_log_path
  395. log_conf "PIXEL JUST. : ${JUSTIFY_NAME[$g_pixel_just]}" $temp_log_path
  396. log_conf "TILED MODE : ${ON_OFF[$g_tiled_mode]}" $temp_log_path
  397. log_conf "WIDTH : $cfg_width" $temp_log_path
  398. log_conf "HEIGHT : $cfg_height" $temp_log_path
  399. log_conf "SLICE_HEIGHT : $g_slice_height" $temp_log_path
  400. log_conf "EN_SLICE_INTR : $g_enable_slice_intr" $temp_log_path
  401. log_conf "BS SIZE : $g_bs_size" $temp_log_path
  402. log_conf "--------------------------------------------------------------------------------" ${temp_log_path}
  403. done
  404. if [ "$in_comp_param" != "" ]; then
  405. comp_param="$in_comp_param"
  406. fi
  407. test_param="-e ${comp_param} $g_w_param $g_fsdb_param $g_ius_param"
  408. test_param="${test_param} --instance-num=${instance_num} --cfg-dir=$cfg_dir --yuv-dir=$yuv_dir"
  409. test_param="${test_param} --stream-endian=${stream_endian_test_param}"
  410. test_param="${test_param} --frame-endian=${frame_endian_test_param} --bs-size=${bs_size_test_param}"
  411. test_param="${test_param} --pixelj=${pixelj_test_param}"
  412. test_param="${test_param} --slice-height=${slice_height_test_param}"
  413. test_param="${test_param} --enable-slice-intr=${slice_intr_test_param}"
  414. test_param="${test_param} --enable-tiledMode=${tiled_mode_test_param}"
  415. test_param="${test_param} --input=${stream_test_param} --output=${output_test_param}"
  416. if [ "$simulation" == "true" ]; then
  417. test_param="${test_param} --TestRunner=1"
  418. fi
  419. success_count=0
  420. failure_count=0
  421. ################################################################################
  422. ################################################################################
  423. # Test Mode Thread #
  424. ################################################################################
  425. ################################################################################
  426. result=0
  427. log_conf "--------------------------------------------------------------------------------" ${temp_log_path}
  428. log_conf "MultiInstance test : Thread" ${temp_log_path}
  429. log_conf "--------------------------------------------------------------------------------" ${temp_log_path}
  430. for ((i=0;i<$instance_num;i++)); do
  431. log_conf "[${i}/${instance_num}] ${stream[$i]}" ${temp_log_path}
  432. if [ -e ${output[$i]} ]; then
  433. rm -rf ${output[$i]}
  434. fi
  435. done
  436. log_conf "--------------------------------------------------------------------------------" ${temp_log_path}
  437. cat $temp_log_path >> $conf_log_path
  438. echo "$test_exec $test_param"
  439. if [ "$simulation" == "true" ]; then
  440. $test_exec $test_param 2>&1 | tee -a $conf_log_path
  441. else
  442. echo "$test_exec $test_param"
  443. exit #samin
  444. #$test_exec $test_param
  445. fi
  446. if [ $result -eq 0 ]; then
  447. log_conf "---------------- COMPARE ------------------" $conf_log_path
  448. for ((i=0;i<$instance_num;i++)); do
  449. log_conf "cmp ${output[$i]} ${golden[$i]}" $conf_log_path
  450. cmp ${output[$i]} ${golden[$i]} 2>&1 | tee -a $conf_log_path > /dev/null #save the log
  451. cmp ${output[$i]} ${golden[$i]} #get the result & show log
  452. if [ "$?" != "0" ]; then
  453. log_conf "[RESULT] COMPARE FAIL" $conf_log_path
  454. result=1
  455. fi
  456. done
  457. if [ $result -eq 0 ]; then
  458. log_conf "[RESULT] SUCCESS" $conf_log_path
  459. success_count=$(($success_count + 1))
  460. fi
  461. fi
  462. if [ $result -eq 1 ]; then
  463. log_conf "[RESULT] FAILURE" $conf_log_path
  464. failure_count=$(($failure_count + 1))
  465. cat $temp_log_path >> $conf_err_log_path
  466. cat ./ErrorLog.txt >> $conf_err_log_path
  467. echo "[RESULT] FAILURE" >> $conf_err_log_path
  468. if [ $result -eq 10 ]; then
  469. echo "Abnormal exit!!!"
  470. break
  471. fi
  472. fi
  473. echo "TEST_CONDITION: $0 $test_param"
  474. # clear temp log
  475. echo "" > $temp_log_path
  476. ################################################################################
  477. # Create Test Log #
  478. ################################################################################
  479. endTime=$(date +%s%N)
  480. elapsed=$((($endTime - $beginTime) / 1000000000))
  481. elapsedH=$(($elapsed / 3600))
  482. elapsedS=$(($elapsed % 60))
  483. elapsedM=$(((($elapsed - $elapsedS) / 60) % 60))
  484. if [ "$((elapsedS / 10))" == "0" ]; then elapsedS="0${elapsedS}" ;fi
  485. if [ "$((elapsedM / 10))" == "0" ]; then elapsedM="0${elapsedM}" ;fi
  486. if [ "$((elapsedH / 10))" == "0" ]; then elapsedH="0${elapsedH}" ;fi
  487. if [ $elapsed -le 60 ]; then
  488. time_hms="{color:red}*${elapsedH}:${elapsedM}:${elapsedS}*{color}"
  489. else
  490. time_hms="${elapsedH}:${elapsedM}:${elapsedS}"
  491. fi
  492. log_filename=$(basename $conf_log_path)
  493. log_err_filename=$(basename $conf_err_log_path)
  494. if [ "$failure_count" == "0" ] && [ "$instance_num" != "0" ]; then
  495. pass=${PASS}
  496. rm $conf_err_log_path
  497. log_err_filename=""
  498. else
  499. pass=${FAIL}
  500. fi
  501. wiki_log="| $streamset_file | 1 | $success_count | $failure_count | 0 | $log_filename | ${log_err_filename} | $pass | $time_hms | | | Inst Num = $instance_num |"
  502. echo $wiki_log
  503. echo $wiki_log >> $wiki_log_file
  504. if [ "$instance_num" == "0" ]; then
  505. echo "instance_num: $instance_num = exit 1"
  506. exit 1
  507. fi
  508. exit $failure_count