You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							121 lines
						
					
					
						
							3.4 KiB
						
					
					
				
			
		
		
	
	
							121 lines
						
					
					
						
							3.4 KiB
						
					
					
				#!/bin/bash
 | 
						|
# Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserved
 | 
						|
#
 | 
						|
# Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
# you may not use this file except in compliance with the License.
 | 
						|
# You may obtain a copy of the License at
 | 
						|
#
 | 
						|
#     http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
#
 | 
						|
# Unless required by applicable law or agreed to in writing, software
 | 
						|
# distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
# See the License for the specific language governing permissions and
 | 
						|
# limitations under the License.
 | 
						|
 | 
						|
PORT_FILE=/tmp/paddle_test_ports
 | 
						|
PORT_LOCK_FILE=/tmp/paddle_test_ports.lock
 | 
						|
 | 
						|
# Create flag file, all user can rw, ignore all error here
 | 
						|
touch $PORT_FILE $PORT_LOCK_FILE 2>/dev/null
 | 
						|
chmod a+rw $PORT_FILE $PORT_LOCK_FILE 2>/dev/null
 | 
						|
 | 
						|
# acquire a range of ports that not used by other runtests.sh currentlly.
 | 
						|
# return 1 if ports is used by other, otherwise return 0.
 | 
						|
# NOTE: the acquire_ports/release_ports is interprocess mutexed.
 | 
						|
#
 | 
						|
# There are two parameter of this method
 | 
						|
# param 1: the begin of port range
 | 
						|
# param 2: the lenght of port range.
 | 
						|
# so, the port range is [param1, param1+param2)
 | 
						|
acquire_ports(){
 | 
						|
  (
 | 
						|
    flock -x 200
 | 
						|
    let "len=$1+$2"
 | 
						|
    for((i=$1; i<$len; i++))
 | 
						|
    do
 | 
						|
      grep -q $i $PORT_FILE
 | 
						|
      if [ $? -eq 0 ] ; then
 | 
						|
        return 1 # Port already write to $PORT_FILE
 | 
						|
      fi
 | 
						|
    done
 | 
						|
 | 
						|
    for((i=$1; i<$len; i++))
 | 
						|
    do
 | 
						|
      echo $i >> $PORT_FILE # Write to $PORT_FILE
 | 
						|
    done
 | 
						|
    return 0
 | 
						|
  )200>$PORT_LOCK_FILE
 | 
						|
}
 | 
						|
 | 
						|
# release a range of ports. Mark these ports is not used by runtests.sh.
 | 
						|
# NOTE: the acquire_ports/release_ports is interprocess mutexed.
 | 
						|
#
 | 
						|
# The parameter is same as acquire_ports, see acquire_ports' comments.
 | 
						|
release_ports(){
 | 
						|
  (
 | 
						|
    flock -x 200
 | 
						|
    let "len=$1+$2"
 | 
						|
    for((i=$1; i<$len; i++))
 | 
						|
    do
 | 
						|
      tmp=`sed "/$i/d" $PORT_FILE`  # remove port
 | 
						|
      echo $tmp > $PORT_FILE
 | 
						|
    done
 | 
						|
  )200>$PORT_LOCK_FILE
 | 
						|
}
 | 
						|
 | 
						|
# use set_port  to get a random free port
 | 
						|
# such as    set_port -p port test_fuc   to run  test_fuc --port=random
 | 
						|
# use  -n to set_port test_fuc to get a continuous free port
 | 
						|
# such as    set_port  -n 10 -p port  test_fuc  to get ten continuous free port to run test_fuc --port=random
 | 
						|
set_port()
 | 
						|
{
 | 
						|
    num=1
 | 
						|
 | 
						|
    port_type="port"
 | 
						|
    unset OPTIND
 | 
						|
    while   getopts  "n:p:"  opt
 | 
						|
    do
 | 
						|
        case  "$opt"   in
 | 
						|
            n)   echo  "get num ${OPTARG}"
 | 
						|
                 num=${OPTARG}
 | 
						|
                 ;;
 | 
						|
            p)   echo  "get port_type ${OPTARG}"
 | 
						|
                 port_type=${OPTARG}
 | 
						|
                 ;;
 | 
						|
        esac
 | 
						|
    done
 | 
						|
    shift $((OPTIND-1))
 | 
						|
    cmd=$@
 | 
						|
    for ((i=1;i<=10000;i++))
 | 
						|
    do
 | 
						|
        declare -i port=$RANDOM+10000
 | 
						|
        port_used_total=0
 | 
						|
        for((n=0;n<=num-1;n++))
 | 
						|
            do
 | 
						|
                declare -i port_check=$port+$n
 | 
						|
                port_used_num=`netstat -a |grep $port_check|wc -l`
 | 
						|
                declare -i port_used_total=$port_used_total+$port_used_num
 | 
						|
            done
 | 
						|
        if [ $port_used_total -ne 0 ]
 | 
						|
            then
 | 
						|
                continue
 | 
						|
        fi
 | 
						|
        # Lock Ports.
 | 
						|
        acquire_ports $port $num
 | 
						|
        if [ $? -ne 0 ]; then
 | 
						|
            continue
 | 
						|
        fi
 | 
						|
        $cmd --$port_type=$port
 | 
						|
        return_val=$?
 | 
						|
        release_ports $port $num
 | 
						|
        if [ $return_val -eq 0 ]; then
 | 
						|
            return 0
 | 
						|
        else
 | 
						|
            echo "$cmd run wrong"
 | 
						|
            return 1
 | 
						|
        fi
 | 
						|
    done
 | 
						|
 | 
						|
}
 |