Benchmark script for test plan

** Description changed:

+ [ Impact ]
+ 
+ The python3-openvswitch package ships the OVS Python bindings without the
+ compiled JSON C extension (ovs._json). The extension fails to build during
+ package compilation and the failure is silently ignored (the build log shows
+ "WARNING: The C extension could not be compiled, speedups are not enabled"), 
so
+ all JSON parsing falls back to the pure-Python parser.
+ 
+ Because every OVSDB transaction must be parsed, JSON parsing is a major
+ performance bottleneck in the IDL. Under load, particularly in large clouds 
with
+ many ports/networks, the pure-Python parser consumes large amounts of CPU in
+ neutron-server workers and causes API requests to hang or time out while ovsdb
+ transactions are being processed.
+ 
+ The extension fails to build for two reasons: python/setup.py in OVS 2.17
+ has no mechanism to receive include paths and linker flags for the C
+ extension, and the package does not build with -fPIC, which is required to
+ link the static libopenvswitch into the shared extension module.
+ 
+ The fix backports two upstream OVS commits that enable python/setup.py to
+ honor the enable_shared/extra_cflags/extra_libs environment variables, and
+ updates d/rules to build with -fPIC and pass the static linkage flags at
+ Python install time. python3-openvswitch becomes an arch:any package as it
+ now ships a compiled module. The upstream commits first appeared in OVS 3.0 
[0]
+ and 3.1 [1] respectively, and the packaging changes mirror what Noble's
+ openvswitch already does.
+ 
+ [ Test Plan ]
+ 
+ ** Setup OpenStack Environment **
+ 
+ 1. Deploy a test cloud using stsstack-bundles:
+     $ cd stsstack-bundles/openstack
+     $ ./generate-bundle.sh --series jammy --release yoga --name 
openvswitch-test --run
+     # wait until all units are active/idle (some will be blocked/waiting)
+     $ ./tools/vault-unseal-and-authorise.sh
+     # wait until all units are active/idle
+     $ ./configure
+     
+ ** Verify the Bug **
+ 
+ 2. SSH into the neutron-api unit:
+     $ juju ssh neutron-api/0
+ 
+ 3. Confirm the C extension is not shipped:
+     $ dpkg -L python3-openvswitch | grep _json
+     (empty)
+ 
+ 4. Confirm the pure-Python parser is active:
+     $ python3 -c "import ovs._json, ovs.json; print('Active Parser Engine:', 
ovs.json.PARSER)"
+     
+     Observed result:
+     ModuleNotFoundError: No module named 'ovs._json'
+ 
+ 5. Confirm neutron-server workers are using the pure-Python parser:
+     $ for p in $(pgrep -f neutron-server); do sudo grep -q ovs/_json 
/proc/$p/maps && echo "$p: C" || echo "$p: python"; done
+ 
+     Observed result: 
+     "python" printed for all workers
+ 
+ 6. Run the JSON parsing benchmark (see attached benchmark.py, which parses
+    a synthetic OVSDB payload 10 times):
+     $ python3 benchmark.py
+ 
+     Observed result:
+     === Benchmark Results ===
+     Host Default Engine:  Pure-Python (fallback)
+     Total Elapsed Time:   13.8047 s
+     Parsing Throughput:   1.50 MB/s
+ 
+ ** Verify the Fix **
+ 
+ 7. SSH into the neutron-api unit and install the updated openvswitch packages:
+     $ juju ssh neutron-api/0
+     $ sudo apt update && sudo apt upgrade -y openvswitch-common 
python3-openvswitch
+ 
+ 8. Restart neutron-server
+     $ sudo systemctl restart neutron-server
+ 
+ 9. Confirm the C extension is shipped:
+     $ dpkg -L python3-openvswitch | grep _json
+ 
+     Observed result:
+     /usr/lib/python3/dist-packages/ovs/_json.cpython-310-x86_64-linux-gnu.so
+ 
+ 10. Confirm the C parser is active:
+     $ python3 -c "import ovs._json, ovs.json; print('Active Parser Engine:', 
ovs.json.PARSER)"
+ 
+     Observed result:
+     Active Parser Engine: C
+ 
+ 11. Confirm workers load the C extension:
+     $ for p in $(pgrep -f neutron-server); do sudo grep -q ovs/_json 
/proc/$p/maps && echo "$p: C" || echo "$p: python"; done
+     
+     Observed result:
+     Should show "C" for all workers.
+ 
+ 12. Re-run the benchmark:
+     $ python3 benchmark.py
+ 
+     Observed result:
+     === Benchmark Results ===
+     Host Default Engine:  C (ovs._json)
+     Total Elapsed Time:   0.6149 s
+     Parsing Throughput:   33.78 MB/s
+ 
+ [ Where problems could occur ]
+ 
+ - The extension is statically linked against libopenvswitch, so no new
+   runtime library dependencies are introduced; a linkage mistake would
+   show up as an import failure of ovs._json, caught by step 10.
+ 
+ - The build now uses -fPIC for the whole package. This is the default for
+   shared objects already and has no functional effect on the produced C
+   code, but it does rebuild all objects; a toolchain issue would manifest
+   at build time, not runtime.
+ 
+ - python3-openvswitch changes from Architecture: all to linux-any. Reverse
+   dependencies were switched from ${source:Version} to ${binary:Version}; any
+   mistake there would surface as unresolvable dependencies at install time.
+ 
+ - If the extension fails to build in a future rebuild, the upstream fallback
+   logic silently drops it again, reverting to today's behavior (pure-Python
+   parser) rather than failing the build.
+ 
+ [ Other Info ]
+ 
+ The two setup.py commits are upstream: 671f93f ("python: Allow building json C
+ extension with static OVS library.") in OVS 3.0 [0], and 791c472 ("python: Add
+ ability to pass extra libs and cflags for C extension.") in OVS 3.1 [1].
+ 
+ The d/rules and d/control changes mirror three Debian packaging commits:
+ "d/rules: Build the Python JSON C extension" [2], "d/control: Make
+ python3-openvswitch a binary package, drop python3-six dependency" [3], and
+ "d/rules: Add comment about the explicit -fPIC for this package" [4]. These
+ first appeared in Debian's openvswitch 3.0.1-1.
+ 
+ Ubuntu releases Noble onward and the OVN/OVS versions shipped in corresponding
+ UCA pockets already ship the compiled extension, so only Jammy needs this fix.
+ Upstream OVS 2.17 is EOL, so the setup.py changes cannot be backported there.
+ 
+ A test package was built and is available in the following PPA:
+ https://launchpad.net/~munirsid/+archive/ubuntu/sf427278-test
+ 
+ [0] - 
https://github.com/openvswitch/ovs/commit/671f93fe42d3c15aa0bf883bef0f05716bc2b18b
+ [1] - 
https://github.com/openvswitch/ovs/commit/791c47273983b830dbc840ae7bf18a23bc9e72e4
+ [2] - 
https://salsa.debian.org/openstack-team/third-party/openvswitch/-/commit/45734ca10e2ac97fe2646588596933adb00f81ba
+ [3] - 
https://salsa.debian.org/openstack-team/third-party/openvswitch/-/commit/22f00e3fcfece1753d4cde17c9ae0b9394a4a966
+ [4] - 
https://salsa.debian.org/openstack-team/third-party/openvswitch/-/commit/b120fc6a2caad12a7225c7600172f90102c0e414
+ 
+ Original Description: Find the original description of the bug below:
+ 
  The C extension wrapping OVS's own json parser is 60x faster than the
  pure-python version currently being used. Profiling shows JSON parsing
  to be the biggest bottleneck using python-openvswitch IDL library.
  
  setuptools can build the extension as long as the python-dev packages
  are installed and openvswitch-dev is installed. It should be available
  in OVS 2.6+

** Attachment added: "benchmark.py"
   
https://bugs.launchpad.net/ubuntu/+source/openvswitch/+bug/1672522/+attachment/6008439/+files/benchmark.py

** Also affects: openvswitch (Ubuntu Stonking)
   Importance: Medium
       Status: Fix Released

** Also affects: openvswitch (Ubuntu Noble)
   Importance: Undecided
       Status: New

** Also affects: openvswitch (Ubuntu Jammy)
   Importance: Undecided
       Status: New

** Also affects: openvswitch (Ubuntu Resolute)
   Importance: Undecided
       Status: New

** Changed in: openvswitch (Ubuntu Resolute)
       Status: New => Fix Released

** Changed in: openvswitch (Ubuntu Noble)
       Status: New => Fix Released

** Changed in: openvswitch (Ubuntu Jammy)
       Status: New => In Progress

** Changed in: openvswitch (Ubuntu Jammy)
     Assignee: (unassigned) => Munir Siddiqui (munirsid)

** Also affects: cloud-archive
   Importance: Undecided
       Status: New

** Also affects: cloud-archive/epoxy
   Importance: Undecided
       Status: New

** Also affects: cloud-archive/zed
   Importance: Undecided
       Status: New

** Also affects: cloud-archive/ovn-22.03
   Importance: Undecided
       Status: New

** Also affects: cloud-archive/bobcat
   Importance: Undecided
       Status: New

** Also affects: cloud-archive/dalmatian
   Importance: Undecided
       Status: New

** Also affects: cloud-archive/antelope
   Importance: Undecided
       Status: New

** Also affects: cloud-archive/caracal
   Importance: Undecided
       Status: New

** Also affects: cloud-archive/flamingo
   Importance: Undecided
       Status: New

** Also affects: cloud-archive/yoga
   Importance: Undecided
       Status: New

** Also affects: cloud-archive/gazpacho
   Importance: Undecided
       Status: New

** Changed in: cloud-archive
       Status: New => Fix Released

** Changed in: cloud-archive/zed
       Status: New => Fix Released

** Changed in: cloud-archive/yoga
       Status: New => In Progress

** Changed in: cloud-archive/ovn-22.03
       Status: New => In Progress

** Changed in: cloud-archive/gazpacho
       Status: New => Fix Released

** Changed in: cloud-archive/flamingo
       Status: New => Fix Released

** Changed in: cloud-archive/epoxy
       Status: New => Fix Released

** Changed in: cloud-archive/dalmatian
       Status: New => Fix Released

** Changed in: cloud-archive/caracal
       Status: New => Fix Released

** Changed in: cloud-archive/bobcat
       Status: New => Fix Released

** Changed in: cloud-archive/antelope
       Status: New => Fix Released

** Changed in: cloud-archive/ovn-22.03
     Assignee: (unassigned) => Munir Siddiqui (munirsid)

** Changed in: cloud-archive/yoga
     Assignee: (unassigned) => Munir Siddiqui (munirsid)

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/1672522

Title:
  The python-openvswitch package should build the json C extension

To manage notifications about this bug go to:
https://bugs.launchpad.net/cloud-archive/+bug/1672522/+subscriptions


-- 
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to