X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=tests%2Fdata%2Fplugins%2Fsrc.ctf.lttng-live%2Flttng_live_server.py;fp=tests%2Fdata%2Fplugins%2Fsrc.ctf.lttng-live%2Flttng_live_server.py;h=573c47e31914bb38557cd56f816ed7d5c47128ef;hp=91e1cc8a6f446b4df30e78520a7cfebffb26c45c;hb=e21e74d3d22701fa56664af9ddc050e717e88663;hpb=d73113ac33485281eb246a4cedb30fc001e47ae0 diff --git a/tests/data/plugins/src.ctf.lttng-live/lttng_live_server.py b/tests/data/plugins/src.ctf.lttng-live/lttng_live_server.py index 91e1cc8a..573c47e3 100644 --- a/tests/data/plugins/src.ctf.lttng-live/lttng_live_server.py +++ b/tests/data/plugins/src.ctf.lttng-live/lttng_live_server.py @@ -26,6 +26,7 @@ import logging import os import os.path import re +import time import socket import struct import sys @@ -1344,13 +1345,41 @@ class LttngLiveServer: with tempfile.NamedTemporaryFile(mode='w', delete=False) as tmp_port_file: print(self._server_port, end='', file=tmp_port_file) - # Rename temporary file to real file - os.replace(tmp_port_file.name, port_filename) - logging.info( - 'Renamed port file: src-path="{}", dst-path="{}"'.format( - tmp_port_file.name, port_filename - ) - ) + # Rename temporary file to real file. + # + # For unknown reasons, on Windows, moving the port file from its + # temporary location to its final location (where the user of + # the server expects it to appear) may raise a `PermissionError` + # exception. + # + # We suppose it's possible that something in the Windows kernel + # hasn't completely finished using the file when we try to move + # it. + # + # Use a wait-and-retry scheme as a (bad) workaround. + num_attempts = 5 + retry_delay_s = 1 + + for attempt in reversed(range(num_attempts)): + try: + os.replace(tmp_port_file.name, port_filename) + logging.info( + 'Renamed port file: src-path="{}", dst-path="{}"'.format( + tmp_port_file.name, port_filename + ) + ) + return + except PermissionError: + logging.info( + 'Permission error while attempting to rename port file; retrying in {} second: src-path="{}", dst-path="{}"'.format( + retry_delay_s, tmp_port_file.name, port_filename + ) + ) + + if attempt == 0: + raise + + time.sleep(retry_delay_s) # A tracing session descriptor.