Skip to contentSkip to conversation

support/scripts/cve.py: use fast ijson backend if available on old ijson versions

PATCH New Peter Korsgaard 2 participants 3 messages Apr 9, 2021 – Apr 26, 2021

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 support/scripts/cve.py: use fast ijson backend if available on old ijson versions

ijson < 2.5 (as available in Debian 10) use the slow python backend by default instead of the most efficient one available like modern ijson versions, significantly slowing down cve checking. E.G.:

time ./support/scripts/pkg-stats --nvd-path ~/.nvd -p avahi --html foobar.html

Goes from
174,44s user 2,11s system 99% cpu 2:58,04 total

To
93,53s user 2,00s system 98% cpu 1:36,65 total

E.G. almost 2x as fast.

As a workaround, detect when the python backend is used and try to use a more efficient one instead. Use the yajl2_cffi backend as recommended by upstream, as it is most likely to work, and print a warning (and continue) if we fail to load it.

The detection is slightly complicated by the fact that ijson.backends used to be a reference to a backend module, but is nowadays a string (without the ijson.backends prefix).

---
 support/scripts/cve.py | 6 ++++++
 1 file changed, 6 insertions(+)
support/scripts/cve.py +6 -0
index 6e97ea193f..965fc2a466 100755
@@ -28,6 +28,12 @@ import operator
 
 try:
     import ijson
+    # backend is a module in < 2.5, a string in >= 2.5
+    if 'python' in getattr(ijson.backend, '__name__', ijson.backend):
+        try:
+            import ijson.backends.yajl2_cffi as ijson
+        except ImportError:
+            sys.stderr.write('Warning: Using slow ijson python backend\n')
 except ImportError:
     sys.stderr.write("You need ijson to parse NVD for CVE check\n")
     exit(1)
Signature · 1 line
2.20.1
#1 lore raw

PATCH 1/1 support/scripts/cve.py: use fast ijson backend if available on old ijson versions

Peter, All,

On 2021-04-09 13:01 +0200, Peter Korsgaard spake thusly:

Quoted 19 lines

ijson < 2.5 (as available in Debian 10) use the slow python backend by default instead of the most efficient one available like modern ijson versions, significantly slowing down cve checking. E.G.:

time ./support/scripts/pkg-stats --nvd-path ~/.nvd -p avahi --html foobar.html

Goes from
174,44s user 2,11s system 99% cpu 2:58,04 total

To
93,53s user 2,00s system 98% cpu 1:36,65 total

E.G. almost 2x as fast.

As a workaround, detect when the python backend is used and try to use a more efficient one instead. Use the yajl2_cffi backend as recommended by upstream, as it is most likely to work, and print a warning (and continue) if we fail to load it.

Quoted 5 lines

The detection is slightly complicated by the fact that ijson.backends used to be a reference to a backend module, but is nowadays a string (without the ijson.backends prefix).

Applied to master, thanks.

Regards,
Yann E. MORIN.

Quoted 28 lines
---
 support/scripts/cve.py | 6 ++++++
 1 file changed, 6 insertions(+)
support/scripts/cve.py +6 -0
index 6e97ea193f..965fc2a466 100755
@@ -28,6 +28,12 @@ import operator
 
 try:
     import ijson
+    # backend is a module in < 2.5, a string in >= 2.5
+    if 'python' in getattr(ijson.backend, '__name__', ijson.backend):
+        try:
+            import ijson.backends.yajl2_cffi as ijson
+        except ImportError:
+            sys.stderr.write('Warning: Using slow ijson python backend\n')
 except ImportError:
     sys.stderr.write("You need ijson to parse NVD for CVE check\n")
     exit(1)
Signature · 6 lines
2.20.1

_______________________________________________
buildroot mailing list
buildroot at busybox.net
http://lists.busybox.net/mailman/listinfo/buildroot
Signature · 6 lines
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 561 099 427 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'
#2 lore raw

PATCH 1/1 support/scripts/cve.py: use fast ijson backend if available on old ijson versions

In reply to Peter Korsgaard
Quoted 21 lines
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line

"Peter" == Peter Korsgaard <[email protected]> writes:

ijson < 2.5 (as available in Debian 10) use the slow python backend by default instead of the most efficient one available like modern ijson versions, significantly slowing down cve checking. E.G.:

time ./support/scripts/pkg-stats --nvd-path ~/.nvd -p avahi --html foobar.html

Goes from
174,44s user 2,11s system 99% cpu 2:58,04 total

To
93,53s user 2,00s system 98% cpu 1:36,65 total

E.G. almost 2x as fast.

As a workaround, detect when the python backend is used and try to use a more efficient one instead. Use the yajl2_cffi backend as recommended by upstream, as it is most likely to work, and print a warning (and continue) if we fail to load it.

Quoted 5 lines

The detection is slightly complicated by the fact that ijson.backends used to be a reference to a backend module, but is nowadays a string (without the ijson.backends prefix).

Committed to 2021.02.x, thanks.

Signature · 1 line
Bye, Peter Korsgaard