/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
 */
package org.apache.bookkeeper.test;

import java.io.IOException;
import java.net.ServerSocket;

/**
 * Port manager allows a base port to be specified on the commandline.
 * Tests will then use ports, counting up from this base port.
 * This allows multiple instances of the bookkeeper tests to run at once.
 */
public class PortManager {
    private static int nextPort = getBasePort();

    public static synchronized int nextFreePort() {
        while (true) {
            ServerSocket ss = null;
            try {
                int port = nextPort++;
                ss = new ServerSocket(port);
                ss.setReuseAddress(true);
                return port;
            } catch (IOException ioe) {
            } finally {
                if (ss != null) {
                    try {
                        ss.close();
                    } catch (IOException ioe) {}
                }
            }
        }
    }

    private static int getBasePort() {
        return Integer.valueOf(System.getProperty("test.basePort", "15000"));
    }
}

@@ -848,36 +848,8 @@
 t;%0A%0A
-import java.io.IOException;%0A
 impo
@@ -874,17 +874,16 @@
 Socket;%0A
-%0A
 /**%0A * P
@@ -1231,81 +1231,55 @@
     
-while (true) %7B%0A            ServerSocket ss = null;%0A            try %7B%0A    
+int exceptionCount = 0;%0A        while (true) %7B%0A
     
@@ -1321,19 +1321,33 @@
         
-   
+try (ServerSocket
  ss = ne
@@ -1366,17 +1366,19 @@
 et(port)
-;
+) %7B
 %0A       
@@ -1393,178 +1393,191 @@
  ss.
-setReuseAddress(true);%0A                return port;%0A            %7D catch (IOException ioe) %7B%0A            %7D finally %7B%0A                if (ss != null) %7B%0A            
+close();%0A                //Give it some time to truly close the connection%0A                Thread.sleep(100);%0A                return port;%0A            %7D catch (Exception e) %7B%0A
         
 try 
@@ -1576,22 +1576,16 @@
     
-try %7B%0A
         
     
@@ -1584,35 +1584,67 @@
     
-                ss.close();
+exceptionCount++;%0A                if (exceptionCount %3E 5) %7B
 %0A   
@@ -1664,19 +1664,25 @@
     
-%7D catch (IO
+throw new Runtime
 Exce
@@ -1690,16 +1690,12 @@
 tion
- ioe) %7B%7D
+(e);
 %0A   

[MERGE YAHOO REPO] YBK-154: Add sleep after finding free port given OS time to release it