[master 6/9] Redefine open to retry on EINTR

dashea installerbot-noreply at redhat.com
Thu Jun 18 21:03:52 UTC 2015


From: David Shea <dshea at redhat.com>

Python's builtin open will raise an execption if the underlying open
system call returns with EINTR, which means that an ill-timed SIGALRM or
SIGCHLD or anything happening from another thread could crash anaconda.
---
 anaconda                            |  4 +++-
 pyanaconda/anaconda.py              |  1 +
 pyanaconda/anaconda_argparse.py     |  1 +
 pyanaconda/anaconda_log.py          |  6 ++++++
 pyanaconda/bootloader.py            |  1 +
 pyanaconda/desktop.py               |  1 +
 pyanaconda/flags.py                 |  4 ++++
 pyanaconda/image.py                 |  1 +
 pyanaconda/install.py               |  1 +
 pyanaconda/isys/__init__.py         |  1 +
 pyanaconda/iutil.py                 | 11 +++++++++++
 pyanaconda/keyboard.py              |  1 +
 pyanaconda/kickstart.py             |  1 +
 pyanaconda/localization.py          |  1 +
 pyanaconda/network.py               |  1 +
 pyanaconda/ntp.py                   |  1 +
 pyanaconda/packaging/__init__.py    |  1 +
 pyanaconda/packaging/dnfpayload.py  |  1 +
 pyanaconda/packaging/livepayload.py |  1 +
 pyanaconda/rescue.py                |  1 +
 pyanaconda/simpleconfig.py          |  1 +
 pyanaconda/timezone.py              |  1 +
 pyanaconda/users.py                 |  1 +
 pyanaconda/vnc.py                   |  1 +
 scripts/anaconda-cleanup            |  1 +
 scripts/analog                      |  1 +
 scripts/instperf                    |  1 +
 27 files changed, 47 insertions(+), 1 deletion(-)

diff --git a/anaconda b/anaconda
index a7ea57e..65a3d53 100755
--- a/anaconda
+++ b/anaconda
@@ -33,7 +33,8 @@
 
 coverage = None
 
-proc_cmdline = open("/proc/cmdline", "r").read()
+# If we get a signal immediately after starting that would be pretty messed up
+proc_cmdline = open("/proc/cmdline", "r").read()    # pylint: disable=interruptible-system-call
 proc_cmdline = proc_cmdline.split()
 if ("debug=1" in proc_cmdline) or ("debug" in proc_cmdline):
     import coverage
@@ -862,6 +863,7 @@ if __name__ == "__main__":
     from pyanaconda import ntp
     from pyanaconda import keyboard
     from pyanaconda.iutil import ProxyString, ProxyStringError
+    from pyanaconda.iutil import open   # pylint: disable=redefined-builtin
 
     verdesc = "%s for %s %s" % (getAnacondaVersionString(),
                                 product.productName, product.productVersion)
diff --git a/pyanaconda/anaconda.py b/pyanaconda/anaconda.py
index 278bffa..89c28b2 100644
--- a/pyanaconda/anaconda.py
+++ b/pyanaconda/anaconda.py
@@ -36,6 +36,7 @@
 from pyanaconda.bootloader import get_bootloader
 from pyanaconda import constants
 from pyanaconda import iutil
+from pyanaconda.iutil import open   # pylint: disable=redefined-builtin
 from pyanaconda import addons
 
 import logging
diff --git a/pyanaconda/anaconda_argparse.py b/pyanaconda/anaconda_argparse.py
index 03f88e4..af5d9f7 100644
--- a/pyanaconda/anaconda_argparse.py
+++ b/pyanaconda/anaconda_argparse.py
@@ -33,6 +33,7 @@
 from argparse import ArgumentParser, ArgumentError, HelpFormatter, Namespace
 
 from pyanaconda.flags import BootArgs
+from pyanaconda.iutil import open   # pylint: disable=redefined-builtin
 
 import logging
 log = logging.getLogger("anaconda")
diff --git a/pyanaconda/anaconda_log.py b/pyanaconda/anaconda_log.py
index 28bd9a8..4008844 100644
--- a/pyanaconda/anaconda_log.py
+++ b/pyanaconda/anaconda_log.py
@@ -222,6 +222,9 @@ def updateRemote(self, remote_syslog):
 
         Requires updating rsyslogd config and restarting rsyslog
         """
+        # Import here instead of at the module level to avoid an import loop
+        from pyanaconda.iutil import open   # pylint: disable=redefined-builtin
+
         TEMPLATE = "*.* @@%s\n"
 
         self.remote_syslog = remote_syslog
@@ -233,6 +236,9 @@ def updateRemote(self, remote_syslog):
     def setupVirtio(self):
         """Setup virtio rsyslog logging.
         """
+        # Import here instead of at the module level to avoid an import loop
+        from pyanaconda.iutil import open   # pylint: disable=redefined-builtin
+
         TEMPLATE = "*.* %s;anaconda_syslog\n"
 
         vport = flags.cmdline.get('virtiolog') or self.VIRTIO_PORT
diff --git a/pyanaconda/bootloader.py b/pyanaconda/bootloader.py
index f6e36f6..97c36cb 100644
--- a/pyanaconda/bootloader.py
+++ b/pyanaconda/bootloader.py
@@ -31,6 +31,7 @@
 from itertools import chain
 
 from pyanaconda import iutil
+from pyanaconda.iutil import open   # pylint: disable=redefined-builtin
 from blivet.devicelibs import raid
 from pyanaconda.isys import sync
 from pyanaconda.product import productName
diff --git a/pyanaconda/desktop.py b/pyanaconda/desktop.py
index 7428a71..f9eaa92 100644
--- a/pyanaconda/desktop.py
+++ b/pyanaconda/desktop.py
@@ -23,6 +23,7 @@
 import os
 from pyanaconda.constants import RUNLEVELS
 from pyanaconda import iutil
+from pyanaconda.iutil import open   # pylint: disable=redefined-builtin
 
 import logging
 log = logging.getLogger("anaconda")
diff --git a/pyanaconda/flags.py b/pyanaconda/flags.py
index 81319dc..fadb4ef 100644
--- a/pyanaconda/flags.py
+++ b/pyanaconda/flags.py
@@ -112,6 +112,10 @@ def read(self, filenames):
         Returns a list of successfully read files.
         filenames can contain *, ?, and character ranges expressed with []
         """
+
+        # Import here instead of at the module level to avoid an import loop
+        from pyanaconda.iutil import open   # pylint: disable=redefined-builtin
+
         readfiles = []
         if isinstance(filenames, str):
             filenames = [filenames]
diff --git a/pyanaconda/image.py b/pyanaconda/image.py
index fa3ecd8..ed65101 100644
--- a/pyanaconda/image.py
+++ b/pyanaconda/image.py
@@ -20,6 +20,7 @@
 from pyanaconda import isys
 import os, os.path, stat, tempfile
 from pyanaconda.constants import ISO_DIR
+from pyanaconda.iutil import open   # pylint: disable=redefined-builtin
 
 from pyanaconda.errors import errorHandler, ERROR_RAISE, InvalidImageSizeError, MediaMountError, MissingImageError
 
diff --git a/pyanaconda/install.py b/pyanaconda/install.py
index fe0511b..2b6b8aa 100644
--- a/pyanaconda/install.py
+++ b/pyanaconda/install.py
@@ -28,6 +28,7 @@
 from pyanaconda.users import createLuserConf, getPassAlgo, Users
 from pyanaconda import flags
 from pyanaconda import iutil
+from pyanaconda.iutil import open   # pylint: disable=redefined-builtin
 from pyanaconda import timezone
 from pyanaconda import network
 from pyanaconda.i18n import _
diff --git a/pyanaconda/isys/__init__.py b/pyanaconda/isys/__init__.py
index 0afa61a..a571ca4 100644
--- a/pyanaconda/isys/__init__.py
+++ b/pyanaconda/isys/__init__.py
@@ -33,6 +33,7 @@
 import time
 import datetime
 import pytz
+from pyanaconda.iutil import open   # pylint: disable=redefined-builtin
 
 import logging
 log = logging.getLogger("anaconda")
diff --git a/pyanaconda/iutil.py b/pyanaconda/iutil.py
index 1aa85d0..ecd089a 100644
--- a/pyanaconda/iutil.py
+++ b/pyanaconda/iutil.py
@@ -1312,3 +1312,14 @@ def requests_session():
     session.mount("file://", FileAdapter())
     session.mount("ftp://", FTPAdapter())
     return session
+
+_open = open
+def open(*args, **kwargs):  # pylint: disable=redefined-builtin
+    """Open a file, and retry on EINTR.
+
+       The arguments are the same as those to python's builtin open.
+
+       This is equivalent to eintr_retry_call(open, ...).  Some other
+       high-level languages handle this for you, like C's fopen.
+    """
+    return eintr_retry_call(_open, *args, **kwargs)
diff --git a/pyanaconda/keyboard.py b/pyanaconda/keyboard.py
index 0de3111..2c648cc 100644
--- a/pyanaconda/keyboard.py
+++ b/pyanaconda/keyboard.py
@@ -34,6 +34,7 @@
 from pyanaconda import safe_dbus
 from pyanaconda.constants import DEFAULT_VC_FONT, DEFAULT_KEYBOARD
 from pyanaconda.flags import can_touch_runtime_system
+from pyanaconda.iutil import open   # pylint: disable=redefined-builtin
 
 from gi.repository import GLib
 
diff --git a/pyanaconda/kickstart.py b/pyanaconda/kickstart.py
index 788950d..8dcad54 100644
--- a/pyanaconda/kickstart.py
+++ b/pyanaconda/kickstart.py
@@ -39,6 +39,7 @@
 
 import glob
 from pyanaconda import iutil
+from pyanaconda.iutil import open   # pylint: disable=redefined-builtin
 import os
 import os.path
 import tempfile
diff --git a/pyanaconda/localization.py b/pyanaconda/localization.py
index 1613f48..480293f 100644
--- a/pyanaconda/localization.py
+++ b/pyanaconda/localization.py
@@ -30,6 +30,7 @@
 
 from pyanaconda import constants
 from pyanaconda.iutil import upcase_first_letter, setenv
+from pyanaconda.iutil import open   # pylint: disable=redefined-builtin
 
 import logging
 log = logging.getLogger("anaconda")
diff --git a/pyanaconda/network.py b/pyanaconda/network.py
index 51f29d9..471b582 100644
--- a/pyanaconda/network.py
+++ b/pyanaconda/network.py
@@ -26,6 +26,7 @@
 
 import shutil
 from pyanaconda import iutil
+from pyanaconda.iutil import open   # pylint: disable=redefined-builtin
 import socket
 import os
 import time
diff --git a/pyanaconda/ntp.py b/pyanaconda/ntp.py
index 81f3027..701fd8d 100644
--- a/pyanaconda/ntp.py
+++ b/pyanaconda/ntp.py
@@ -32,6 +32,7 @@
 
 from pyanaconda import isys
 from pyanaconda import iutil
+from pyanaconda.iutil import open   # pylint: disable=redefined-builtin
 from pyanaconda.threads import threadMgr, AnacondaThread
 from pyanaconda.constants import THREAD_SYNC_TIME_BASENAME
 
diff --git a/pyanaconda/packaging/__init__.py b/pyanaconda/packaging/__init__.py
index 090dc11..fd548cf 100644
--- a/pyanaconda/packaging/__init__.py
+++ b/pyanaconda/packaging/__init__.py
@@ -38,6 +38,7 @@
 import functools
 
 from pyanaconda.iutil import requests_session
+from pyanaconda.iutil import open   # pylint: disable=redefined-builtin
 
 if __name__ == "__main__":
     from pyanaconda import anaconda_log
diff --git a/pyanaconda/packaging/dnfpayload.py b/pyanaconda/packaging/dnfpayload.py
index 365b5dd..021fda6 100644
--- a/pyanaconda/packaging/dnfpayload.py
+++ b/pyanaconda/packaging/dnfpayload.py
@@ -43,6 +43,7 @@
 import sys
 import time
 from pyanaconda.iutil import ProxyString, ProxyStringError
+from pyanaconda.iutil import open   # pylint: disable=redefined-builtin
 
 log = logging.getLogger("packaging")
 
diff --git a/pyanaconda/packaging/livepayload.py b/pyanaconda/packaging/livepayload.py
index 8b06381..fcccb7c 100644
--- a/pyanaconda/packaging/livepayload.py
+++ b/pyanaconda/packaging/livepayload.py
@@ -35,6 +35,7 @@
 from threading import Lock
 import requests
 from pyanaconda.iutil import ProxyString, ProxyStringError, lowerASCII
+from pyanaconda.iutil import open   # pylint: disable=redefined-builtin
 import hashlib
 import glob
 import functools
diff --git a/pyanaconda/rescue.py b/pyanaconda/rescue.py
index 2d0e61e..2dda78d 100644
--- a/pyanaconda/rescue.py
+++ b/pyanaconda/rescue.py
@@ -22,6 +22,7 @@
 import sys
 import os
 from pyanaconda import iutil
+from pyanaconda.iutil import open   # pylint: disable=redefined-builtin
 import shutil
 import time
 import re
diff --git a/pyanaconda/simpleconfig.py b/pyanaconda/simpleconfig.py
index 371e6ac..4becb09 100644
--- a/pyanaconda/simpleconfig.py
+++ b/pyanaconda/simpleconfig.py
@@ -28,6 +28,7 @@
 import string # pylint: disable=deprecated-module
 import tempfile
 from pyanaconda.iutil import upperASCII, eintr_retry_call
+from pyanaconda.iutil import open   # pylint: disable=redefined-builtin
 
 _SAFECHARS = frozenset(string.ascii_letters + string.digits + '@%_-+=:,./')
 
diff --git a/pyanaconda/timezone.py b/pyanaconda/timezone.py
index 9afbfdb..b153449 100644
--- a/pyanaconda/timezone.py
+++ b/pyanaconda/timezone.py
@@ -30,6 +30,7 @@
 from collections import OrderedDict
 
 from pyanaconda import iutil
+from pyanaconda.iutil import open   # pylint: disable=redefined-builtin
 from pyanaconda.constants import THREAD_STORAGE
 from pyanaconda.flags import flags
 from pyanaconda.threads import threadMgr
diff --git a/pyanaconda/users.py b/pyanaconda/users.py
index cfcba03..ce8e718 100644
--- a/pyanaconda/users.py
+++ b/pyanaconda/users.py
@@ -30,6 +30,7 @@
 from pyanaconda import iutil
 import pwquality
 from pyanaconda.iutil import strip_accents
+from pyanaconda.iutil import open   # pylint: disable=redefined-builtin
 from pyanaconda.constants import PASSWORD_MIN_LEN
 from pyanaconda.errors import errorHandler, PasswordCryptError, ERROR_RAISE
 
diff --git a/pyanaconda/vnc.py b/pyanaconda/vnc.py
index fad5435..7f1a7d3 100644
--- a/pyanaconda/vnc.py
+++ b/pyanaconda/vnc.py
@@ -22,6 +22,7 @@
 import os, sys
 import time
 from pyanaconda import constants, network, product, iutil
+from pyanaconda.iutil import open   # pylint: disable=redefined-builtin
 import socket
 import subprocess
 import dbus
diff --git a/scripts/anaconda-cleanup b/scripts/anaconda-cleanup
index 632cee9..eab5a3d 100755
--- a/scripts/anaconda-cleanup
+++ b/scripts/anaconda-cleanup
@@ -16,6 +16,7 @@
 """
 import os
 import sys
+from pyanaconda.iutil import open   # pylint: disable=redefined-builtin
 
 live_install = "--liveinst" in sys.argv
 image_install = False
diff --git a/scripts/analog b/scripts/analog
index 2f2ebf8..4b498cc 100755
--- a/scripts/analog
+++ b/scripts/analog
@@ -26,6 +26,7 @@ import optparse
 import os
 import os.path
 import sys
+from pyanaconda.iutil import open   # pylint: disable=redefined-builtin
 
 DEFAULT_PORT = 6080
 DEFAULT_ANALOG_DIR = '.analog'
diff --git a/scripts/instperf b/scripts/instperf
index b183352..bded964 100755
--- a/scripts/instperf
+++ b/scripts/instperf
@@ -3,6 +3,7 @@
 import logging
 from subprocess import Popen, PIPE
 import time
+from pyanaconda.iutil import open   # pylint: disable=redefined-builtin
 
 # grab the top five memory consuming processes, returning them in a string of
 # of the format:


-- 
To view this commit on github, visit https://github.com/rhinstaller/anaconda/commit/f9b81999385f6d57ce8d7558fb8aeb235aee6f3e


More information about the anaconda-patches mailing list