Browse Source

Replace ctype.CDLL by ctypes.PyDLL in linux.ip_lib

Some linux.ip_lib functions make use of "ctype.CDLL" methods
(create_netns, remove_netns). Those methods are called inside a
"privsep" context; that means the function reference and the
arguments are passed to a privileged context that will execute
the method.

"privsep" library makes use of eventlet to implement multitasking.
If the method executed returns the GIL, nothing guarantees that
the "eventlet" executor will return it again to this task. This
could lead to timeouts during the execution of those methods.

From https://docs.python.org/3.6/library/ctypes.html#ctypes.PyDLL:
  "Instances of this class behave like CDLL instances, except that
   the Python GIL is not released during the function call, and
   after the function execution the Python error flag is checked."

Change-Id: I36ef9bf59e9c93f50464457a5d9a968738844079
Closes-Bug: #1870352
changes/17/717017/1
Rodolfo Alonso Hernandez 1 year ago
parent
commit
306280813f
  1. 8
      neutron/privileged/agent/linux/ip_lib.py

8
neutron/privileged/agent/linux/ip_lib.py

@ -43,7 +43,13 @@ _CDLL = None
def _get_cdll():
global _CDLL
if not _CDLL:
_CDLL = ctypes.CDLL(ctypes_util.find_library('c'), use_errno=True)
# NOTE(ralonsoh): from https://docs.python.org/3.6/library/
# ctypes.html#ctypes.PyDLL: "Instances of this class behave like CDLL
# instances, except that the Python GIL is not released during the
# function call, and after the function execution the Python error
# flag is checked."
# Check https://bugs.launchpad.net/neutron/+bug/1870352
_CDLL = ctypes.PyDLL(ctypes_util.find_library('c'), use_errno=True)
return _CDLL

Loading…
Cancel
Save