After running ovs-tcpdump and inputs multiple CTRL+C, the program will
raise the following exception.

Error in atexit._run_exitfuncs:
Traceback (most recent call last):
  File "/usr/bin/ovs-tcpdump", line 421, in cleanup_mirror
    ovsdb = OVSDB(db_sock)
  File "/usr/bin/ovs-tcpdump", line 168, in __init__
    OVSDB.wait_for_db_change(self._idl_conn)  # Initial Sync with DB
  File "/usr/bin/ovs-tcpdump", line 155, in wait_for_db_change
    while idl.change_seqno == seq and not idl.run():

Signed-off-by: Daniel Ding <zhihui.d...@easystack.cn>
---
 utilities/ovs-tcpdump.in | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/utilities/ovs-tcpdump.in b/utilities/ovs-tcpdump.in
index 4cbd9a5d3..eec2262d6 100755
--- a/utilities/ovs-tcpdump.in
+++ b/utilities/ovs-tcpdump.in
@@ -17,6 +17,7 @@
 import os
 import pwd
 from random import randint
+import signal
 import subprocess
 import sys
 import time
@@ -417,8 +418,22 @@ def py_which(executable):
                for path in os.environ["PATH"].split(os.pathsep))
 
 
+def ignore_fatal_signals():
+    if sys.platform == "win32":
+        signals = [signal.SIGTERM, signal.SIGINT]
+    else:
+        signals = [signal.SIGTERM, signal.SIGINT, signal.SIGHUP,
+                   signal.SIGALRM]
+
+    for signr in signals:
+        signal.signal(signr, signal.SIG_IGN)
+
+
 def teardown(db_sock, interface, mirror_interface, tap_created):
     def cleanup_mirror():
+        # Ignore fatal signals, avoid it to break OVSDB operations.
+        # So that cleanup mirror and ports be finished.
+        ignore_fatal_signals()
         try:
             ovsdb = OVSDB(db_sock)
             ovsdb.destroy_mirror(interface, ovsdb.port_bridge(interface))
-- 
2.43.0

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to