Skip to content
This repository was archived by the owner on Oct 29, 2024. It is now read-only.

Commit d95e325

Browse files
author
Grégory Starck
committed
Enh/Fix: add a get_free_ports() "enhanced" helper function.
This fix the problem with get_free_port() used multiple times which can lead to the same port being being reused.
1 parent 579748d commit d95e325

File tree

2 files changed

+30
-19
lines changed

2 files changed

+30
-19
lines changed

influxdb/tests/misc.py

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,32 @@
1-
1+
# -*- coding: utf-8 -*-
22

33
import socket
4-
import time
54

65

7-
def get_free_port(ip='127.0.0.1'):
8-
sock = socket.socket()
6+
def get_free_ports(num_ports, ip='127.0.0.1'):
7+
"""Get `num_ports` free/available ports on the interface linked to the `ip´
8+
:param int num_ports: The number of free ports to get
9+
:param str ip: The ip on which the ports have to be taken
10+
:return: a set of ports number
11+
"""
12+
sock_ports = []
13+
ports = set()
914
try:
10-
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
11-
sock.bind((ip, 0))
12-
return sock.getsockname()[1]
15+
for _ in range(num_ports):
16+
sock = socket.socket()
17+
cur = [sock, -1]
18+
# append the socket directly,
19+
# so that it'll be also closed (no leaked resource) in the finally here after.
20+
sock_ports.append(cur)
21+
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
22+
sock.bind((ip, 0))
23+
cur[1] = sock.getsockname()[1]
1324
finally:
14-
sock.close()
15-
16-
# Is there a better way than a sleep?
17-
# There were issues on Travis where the port was not yet free.
18-
time.sleep(0.1)
25+
for sock, port in sock_ports:
26+
sock.close()
27+
ports.add(port)
28+
assert num_ports == len(ports)
29+
return ports
1930

2031

2132
def is_port_open(port, ip='127.0.0.1'):

influxdb/tests/server_tests/influxdb_instance.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import unittest
1313
import sys
1414

15-
from influxdb.tests.misc import get_free_port, is_port_open
15+
from influxdb.tests.misc import is_port_open, get_free_ports
1616

1717

1818
class InfluxDbInstance(object):
@@ -54,12 +54,12 @@ def _start_server(self, conf_template, udp_enabled):
5454
dir=self.temp_dir_base)
5555

5656
# find a couple free ports :
57-
ports = dict(
58-
http_port=get_free_port(),
59-
admin_port=get_free_port(),
60-
meta_port=get_free_port(),
61-
udp_port=get_free_port() if udp_enabled else -1,
62-
)
57+
free_ports = get_free_ports(4)
58+
ports = {}
59+
for service in 'http', 'admin', 'meta', 'udp':
60+
ports[service + '_port'] = free_ports.pop()
61+
if not udp_enabled:
62+
ports['udp_port'] = -1
6363

6464
conf_data = dict(
6565
meta_dir=os.path.join(tempdir, 'meta'),

0 commit comments

Comments
 (0)