aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory P. Smith <greg@krypto.org>2016-01-25 14:43:21 -0800
committerGregory P. Smith <greg@krypto.org>2016-01-25 14:43:21 -0800
commit8b09a986041f79f4220a6e8fb7524c78948c4a6f (patch)
tree43ff0f1aee1611eb76bd2cd7914cbd57f51afcff
parentcb5fdca2f1e7d8c7db38fc6c9e0706b27425bc8c (diff)
parent947aae39b23d1add837e7432b448de901b137eb8 (diff)
downloadportpicker-8b09a986041f79f4220a6e8fb7524c78948c4a6f.tar.gz
Merge pull request #2 from duggelz/master
Change default port range to 15000-24999 and fix a portserver bug. v1.1.1.
-rw-r--r--ChangeLog.md5
-rw-r--r--setup.py2
-rw-r--r--src/portpicker.py2
-rw-r--r--src/portserver.py6
-rw-r--r--src/tests/portserver_test.py22
5 files changed, 32 insertions, 5 deletions
diff --git a/ChangeLog.md b/ChangeLog.md
index de8628d..63da2a5 100644
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,8 @@
+## 1.1.1
+
+* Changed default port range to 15000-24999 to avoid ephemeral ports.
+* Portserver bugfix.
+
## 1.1.0
* Renamed portpicker APIs to use PEP8 style function names in code and docs.
diff --git a/setup.py b/setup.py
index f7bc4d8..161d8a3 100644
--- a/setup.py
+++ b/setup.py
@@ -33,7 +33,7 @@ def main():
distutils.core.setup(
name='portpicker',
- version='1.1.0',
+ version='1.1.1',
description='A library to choose unique available network ports.',
long_description=textwrap.dedent("""\
Portpicker provides an API to find and return an available network
diff --git a/src/portpicker.py b/src/portpicker.py
index 08dde0a..6820391 100644
--- a/src/portpicker.py
+++ b/src/portpicker.py
@@ -139,7 +139,7 @@ def _pick_unused_port_without_server(): # Protected. pylint: disable=invalid-na
# Try random ports first.
rng = random.Random()
for _ in range(10):
- port = int(rng.randrange(32768, 60000))
+ port = int(rng.randrange(15000, 25000))
if is_port_free(port):
return port
diff --git a/src/portserver.py b/src/portserver.py
index fcade6c..43f5567 100644
--- a/src/portserver.py
+++ b/src/portserver.py
@@ -180,7 +180,7 @@ class _PortPool(object):
check_count += 1
if (candidate.start_time == 0 or
candidate.start_time != _get_process_start_time(candidate.pid)):
- if _is_port_free(candidate.pid):
+ if _is_port_free(candidate.port):
candidate.pid = pid
candidate.start_time = _get_process_start_time(pid)
if not candidate.start_time:
@@ -283,8 +283,8 @@ def _parse_command_line():
parser.add_argument(
'--portserver_static_pool',
type=str,
- default='32768-60000',
- help='Comma separated N-P Range(s) of ports to manage.')
+ default='15000-24999',
+ help='Comma separated N-P Range(s) of ports to manage (inclusive).')
parser.add_argument(
'--portserver_unix_socket_address',
type=str,
diff --git a/src/tests/portserver_test.py b/src/tests/portserver_test.py
index f0475c3..bd7d61e 100644
--- a/src/tests/portserver_test.py
+++ b/src/tests/portserver_test.py
@@ -192,6 +192,28 @@ class PortPoolTest(unittest.TestCase):
self.assertEqual(2, self.pool.num_ports())
self.assertEqual(2, self.pool.ports_checked_for_last_request)
+ @mock.patch.object(portserver, '_is_port_free')
+ @mock.patch.object(os, 'getpid')
+ def test_get_port_for_process_pid_eq_port(self, mock_getpid, mock_is_port_free):
+ self.pool.add_port_to_free_pool(12345)
+ self.pool.add_port_to_free_pool(12344)
+ mock_is_port_free.side_effect = lambda port: port == os.getpid()
+ mock_getpid.return_value = 12345
+ self.assertEqual(2, self.pool.num_ports())
+ self.assertEqual(12345, self.pool.get_port_for_process(os.getpid()))
+ self.assertEqual(2, self.pool.ports_checked_for_last_request)
+
+ @mock.patch.object(portserver, '_is_port_free')
+ @mock.patch.object(os, 'getpid')
+ def test_get_port_for_process_pid_ne_port(self, mock_getpid, mock_is_port_free):
+ self.pool.add_port_to_free_pool(12344)
+ self.pool.add_port_to_free_pool(12345)
+ mock_is_port_free.side_effect = lambda port: port != os.getpid()
+ mock_getpid.return_value = 12345
+ self.assertEqual(2, self.pool.num_ports())
+ self.assertEqual(12344, self.pool.get_port_for_process(os.getpid()))
+ self.assertEqual(2, self.pool.ports_checked_for_last_request)
+
@mock.patch.object(portserver, '_get_process_command_line')
@mock.patch.object(portserver, '_should_allocate_port')