mirror of
https://github.com/CumulusNetworks/ifupdown2.git
synced 2024-05-06 15:54:50 +00:00
nlmanager: nlmanager: retry binding tx_socket up to NLMANAGER_BIND_RETRY times
NLMANAGER_BIND_RETRY env variable defaults to 4242 Signed-off-by: Julien Fortin <julien@cumulusnetworks.com>
This commit is contained in:
@@ -142,8 +142,39 @@ class NetlinkManager(object):
|
|||||||
The TX socket is used for install requests, sending RTM_GETXXXX
|
The TX socket is used for install requests, sending RTM_GETXXXX
|
||||||
requests, etc
|
requests, etc
|
||||||
"""
|
"""
|
||||||
self.tx_socket = socket.socket(socket.AF_NETLINK, socket.SOCK_RAW, 0)
|
try:
|
||||||
self.tx_socket.bind((self.pid, 0))
|
self.tx_socket = socket.socket(socket.AF_NETLINK, socket.SOCK_RAW, 0)
|
||||||
|
|
||||||
|
# bind retry mechanism:
|
||||||
|
# in some cases we are running into weird issues... Address already in use
|
||||||
|
# to counter this problem, we will retry up to NLMANAGER_BIND_RETRY times to
|
||||||
|
# bind our socket, every time increasing the address (or pid) that we bind it
|
||||||
|
# to. NLMANAGER_BIND_RETRY default to 4242
|
||||||
|
for i in xrange(0, int(os.getenv("NLMANAGER_BIND_RETRY", 4242))):
|
||||||
|
try:
|
||||||
|
self.tx_socket.bind((self.pid + i, 0))
|
||||||
|
# the bind call succeeded, we need to update self.pid
|
||||||
|
# to reflect the correct value we are binded to. If we
|
||||||
|
# couldn't bind to our real pid (os.getpid()) warn user
|
||||||
|
# to avoid confusion (via debug logs).
|
||||||
|
if i != 0:
|
||||||
|
log.debug(
|
||||||
|
"nlmanager: pid %s already in use - binding netlink socket to pid %s"
|
||||||
|
% (self.pid, self.pid + i)
|
||||||
|
)
|
||||||
|
self.pid = self.pid + i
|
||||||
|
return
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
# if we reach this code it means all our bind calls failed. We are trying to
|
||||||
|
# bind the socket one last time on the original parameters if not we will not
|
||||||
|
# be catching the exception
|
||||||
|
self.tx_socket.bind((self.pid, 0))
|
||||||
|
except:
|
||||||
|
if self.tx_socket:
|
||||||
|
self.tx_socket.close()
|
||||||
|
self.tx_socket = None
|
||||||
|
raise
|
||||||
|
|
||||||
def tx_nlpacket_raw(self, message):
|
def tx_nlpacket_raw(self, message):
|
||||||
"""
|
"""
|
||||||
|
Reference in New Issue
Block a user