refactor: single RC subscriber#16299
Conversation
Codeowners resolved as |
This comment has been minimized.
This comment has been minimized.
Performance SLOsComparing candidate refactor/rc-single-subscriber (9b05b8e) with baseline main (14ebe21) 📈 Performance Regressions (2 suites)📈 iastaspects - 116/116✅ add_aspectTime: ✅ 103.032µs (SLO: <130.000µs 📉 -20.7%) vs baseline: +0.9% Memory: ✅ 42.959MB (SLO: <46.000MB -6.6%) vs baseline: +4.2% ✅ add_inplace_aspectTime: ✅ 100.812µs (SLO: <130.000µs 📉 -22.5%) vs baseline: -3.0% Memory: ✅ 42.880MB (SLO: <46.000MB -6.8%) vs baseline: +4.4% ✅ add_inplace_noaspectTime: ✅ 28.362µs (SLO: <40.000µs 📉 -29.1%) vs baseline: +0.7% Memory: ✅ 42.900MB (SLO: <46.000MB -6.7%) vs baseline: +4.4% ✅ add_noaspectTime: ✅ 48.909µs (SLO: <70.000µs 📉 -30.1%) vs baseline: -0.1% Memory: ✅ 42.920MB (SLO: <46.000MB -6.7%) vs baseline: +4.2% ✅ bytearray_aspectTime: ✅ 249.828µs (SLO: <400.000µs 📉 -37.5%) vs baseline: +1.0% Memory: ✅ 42.880MB (SLO: <46.000MB -6.8%) vs baseline: +4.3% ✅ bytearray_extend_aspectTime: ✅ 636.658µs (SLO: <800.000µs 📉 -20.4%) vs baseline: -2.5% Memory: ✅ 42.979MB (SLO: <46.000MB -6.6%) vs baseline: +4.6% ✅ bytearray_extend_noaspectTime: ✅ 264.368µs (SLO: <400.000µs 📉 -33.9%) vs baseline: -3.0% Memory: ✅ 42.939MB (SLO: <46.000MB -6.7%) vs baseline: +4.4% ✅ bytearray_noaspectTime: ✅ 136.639µs (SLO: <300.000µs 📉 -54.5%) vs baseline: -2.7% Memory: ✅ 42.939MB (SLO: <46.000MB -6.7%) vs baseline: +4.3% ✅ bytes_aspectTime: ✅ 217.777µs (SLO: <300.000µs 📉 -27.4%) vs baseline: -0.4% Memory: ✅ 42.880MB (SLO: <46.000MB -6.8%) vs baseline: +4.1% ✅ bytes_noaspectTime: ✅ 134.893µs (SLO: <200.000µs 📉 -32.6%) vs baseline: -3.2% Memory: ✅ 42.821MB (SLO: <46.000MB -6.9%) vs baseline: +3.9% ✅ bytesio_aspectTime: ✅ 3.775ms (SLO: <5.000ms 📉 -24.5%) vs baseline: -0.2% Memory: ✅ 42.900MB (SLO: <46.000MB -6.7%) vs baseline: +4.2% ✅ bytesio_noaspectTime: ✅ 315.595µs (SLO: <420.000µs 📉 -24.9%) vs baseline: -0.3% ✅ capitalize_aspectTime: ✅ 89.719µs (SLO: <300.000µs 📉 -70.1%) vs baseline: +1.5% Memory: ✅ 42.900MB (SLO: <46.000MB -6.7%) vs baseline: +4.5% ✅ capitalize_noaspectTime: ✅ 254.161µs (SLO: <300.000µs 📉 -15.3%) vs baseline: +1.0% Memory: ✅ 42.939MB (SLO: <46.000MB -6.7%) vs baseline: +4.6% ✅ casefold_aspectTime: ✅ 88.597µs (SLO: <500.000µs 📉 -82.3%) vs baseline: -0.4% Memory: ✅ 42.841MB (SLO: <46.000MB -6.9%) vs baseline: +4.2% ✅ casefold_noaspectTime: ✅ 306.036µs (SLO: <500.000µs 📉 -38.8%) vs baseline: -1.4% Memory: ✅ 42.920MB (SLO: <46.000MB -6.7%) vs baseline: +4.3% ✅ decode_aspectTime: ✅ 86.482µs (SLO: <100.000µs 📉 -13.5%) vs baseline: -0.5% Memory: ✅ 42.959MB (SLO: <46.000MB -6.6%) vs baseline: +4.3% ✅ decode_noaspectTime: ✅ 151.928µs (SLO: <210.000µs 📉 -27.7%) vs baseline: -2.4% Memory: ✅ 42.900MB (SLO: <46.000MB -6.7%) vs baseline: +4.0% ✅ encode_aspectTime: ✅ 84.406µs (SLO: <200.000µs 📉 -57.8%) vs baseline: -0.9% Memory: ✅ 42.900MB (SLO: <46.000MB -6.7%) vs baseline: +4.2% ✅ encode_noaspectTime: ✅ 140.794µs (SLO: <200.000µs 📉 -29.6%) vs baseline: -1.5% Memory: ✅ 42.920MB (SLO: <46.000MB -6.7%) vs baseline: +4.4% ✅ format_aspectTime: ✅ 14.586ms (SLO: <19.200ms 📉 -24.0%) vs baseline: -0.3% Memory: ✅ 42.996MB (SLO: <46.000MB -6.5%) vs baseline: +4.3% ✅ format_map_aspectTime: ✅ 16.416ms (SLO: <21.500ms 📉 -23.6%) vs baseline: ~same Memory: ✅ 42.939MB (SLO: <46.000MB -6.7%) vs baseline: +4.3% ✅ format_map_noaspectTime: ✅ 371.529µs (SLO: <500.000µs 📉 -25.7%) vs baseline: -2.5% Memory: ✅ 42.821MB (SLO: <46.000MB -6.9%) vs baseline: +4.1% ✅ format_noaspectTime: ✅ 304.412µs (SLO: <500.000µs 📉 -39.1%) vs baseline: +0.1% Memory: ✅ 42.939MB (SLO: <46.000MB -6.7%) vs baseline: +4.3% ✅ index_aspectTime: ✅ 126.800µs (SLO: <300.000µs 📉 -57.7%) vs baseline: +3.9% Memory: ✅ 42.920MB (SLO: <46.000MB -6.7%) vs baseline: +4.2% ✅ index_noaspectTime: ✅ 40.245µs (SLO: <300.000µs 📉 -86.6%) vs baseline: -0.3% Memory: ✅ 42.920MB (SLO: <46.000MB -6.7%) vs baseline: +4.4% ✅ join_aspectTime: ✅ 213.166µs (SLO: <300.000µs 📉 -28.9%) vs baseline: -0.8% Memory: ✅ 42.821MB (SLO: <46.000MB -6.9%) vs baseline: +4.0% ✅ join_noaspectTime: ✅ 143.004µs (SLO: <300.000µs 📉 -52.3%) vs baseline: -0.5% Memory: ✅ 42.979MB (SLO: <46.000MB -6.6%) vs baseline: +4.8% ✅ ljust_aspectTime: ✅ 589.083µs (SLO: <700.000µs 📉 -15.8%) vs baseline: 📈 +16.7% Memory: ✅ 42.978MB (SLO: <46.000MB -6.6%) vs baseline: +4.3% ✅ ljust_noaspectTime: ✅ 259.403µs (SLO: <300.000µs 📉 -13.5%) vs baseline: -0.8% Memory: ✅ 42.920MB (SLO: <46.000MB -6.7%) vs baseline: +4.5% ✅ lower_aspectTime: ✅ 296.439µs (SLO: <500.000µs 📉 -40.7%) vs baseline: -1.5% Memory: ✅ 42.920MB (SLO: <46.000MB -6.7%) vs baseline: +4.3% ✅ lower_noaspectTime: ✅ 237.879µs (SLO: <300.000µs 📉 -20.7%) vs baseline: +0.7% Memory: ✅ 42.939MB (SLO: <46.000MB -6.7%) vs baseline: +4.6% ✅ lstrip_aspectTime: ✅ 0.272ms (SLO: <3.000ms 📉 -90.9%) vs baseline: -1.1% Memory: ✅ 42.939MB (SLO: <46.000MB -6.7%) vs baseline: +4.5% ✅ lstrip_noaspectTime: ✅ 0.177ms (SLO: <3.000ms 📉 -94.1%) vs baseline: -0.5% Memory: ✅ 43.018MB (SLO: <46.000MB -6.5%) vs baseline: +4.3% ✅ modulo_aspectTime: ✅ 14.333ms (SLO: <18.750ms 📉 -23.6%) vs baseline: +0.3% Memory: ✅ 43.015MB (SLO: <46.000MB -6.5%) vs baseline: +4.3% ✅ modulo_aspect_for_bytearray_bytearrayTime: ✅ 14.798ms (SLO: <19.350ms 📉 -23.5%) vs baseline: +0.5% Memory: ✅ 43.077MB (SLO: <46.000MB -6.4%) vs baseline: +4.3% ✅ modulo_aspect_for_bytesTime: ✅ 14.347ms (SLO: <18.900ms 📉 -24.1%) vs baseline: -0.4% Memory: ✅ 42.998MB (SLO: <46.000MB -6.5%) vs baseline: +4.5% ✅ modulo_aspect_for_bytes_bytearrayTime: ✅ 14.603ms (SLO: <19.150ms 📉 -23.7%) vs baseline: -0.5% Memory: ✅ 42.998MB (SLO: <46.000MB -6.5%) vs baseline: +4.3% ✅ modulo_noaspectTime: ✅ 0.363ms (SLO: <3.000ms 📉 -87.9%) vs baseline: +0.5% Memory: ✅ 42.939MB (SLO: <46.000MB -6.7%) vs baseline: +4.5% ✅ replace_aspectTime: ✅ 18.483ms (SLO: <24.000ms 📉 -23.0%) vs baseline: +0.7% Memory: ✅ 42.996MB (SLO: <46.000MB -6.5%) vs baseline: +4.3% ✅ replace_noaspectTime: ✅ 281.891µs (SLO: <300.000µs -6.0%) vs baseline: -0.7% Memory: ✅ 42.861MB (SLO: <46.000MB -6.8%) vs baseline: +4.1% ✅ repr_aspectTime: ✅ 312.473µs (SLO: <420.000µs 📉 -25.6%) vs baseline: -3.1% Memory: ✅ 42.939MB (SLO: <46.000MB -6.7%) vs baseline: +4.3% ✅ repr_noaspectTime: ✅ 46.693µs (SLO: <90.000µs 📉 -48.1%) vs baseline: -0.1% Memory: ✅ 42.900MB (SLO: <46.000MB -6.7%) vs baseline: +4.2% ✅ rstrip_aspectTime: ✅ 384.028µs (SLO: <500.000µs 📉 -23.2%) vs baseline: +0.7% Memory: ✅ 42.939MB (SLO: <46.000MB -6.7%) vs baseline: +4.2% ✅ rstrip_noaspectTime: ✅ 186.354µs (SLO: <300.000µs 📉 -37.9%) vs baseline: +0.5% Memory: ✅ 42.998MB (SLO: <46.000MB -6.5%) vs baseline: +4.7% ✅ slice_aspectTime: ✅ 186.657µs (SLO: <300.000µs 📉 -37.8%) vs baseline: +2.8% Memory: ✅ 42.920MB (SLO: <46.000MB -6.7%) vs baseline: +4.3% ✅ slice_noaspectTime: ✅ 54.244µs (SLO: <90.000µs 📉 -39.7%) vs baseline: -0.3% Memory: ✅ 42.920MB (SLO: <46.000MB -6.7%) vs baseline: +4.5% ✅ stringio_aspectTime: ✅ 4.389ms (SLO: <5.000ms 📉 -12.2%) vs baseline: 📈 +14.2% Memory: ✅ 42.900MB (SLO: <46.000MB -6.7%) vs baseline: +4.5% ✅ stringio_noaspectTime: ✅ 344.353µs (SLO: <500.000µs 📉 -31.1%) vs baseline: -2.2% Memory: ✅ 42.979MB (SLO: <46.000MB -6.6%) vs baseline: +4.4% ✅ strip_aspectTime: ✅ 270.066µs (SLO: <350.000µs 📉 -22.8%) vs baseline: -1.4% Memory: ✅ 42.939MB (SLO: <46.000MB -6.7%) vs baseline: +4.4% ✅ strip_noaspectTime: ✅ 175.638µs (SLO: <240.000µs 📉 -26.8%) vs baseline: -1.3% Memory: ✅ 42.900MB (SLO: <46.000MB -6.7%) vs baseline: +4.5% ✅ swapcase_aspectTime: ✅ 331.083µs (SLO: <500.000µs 📉 -33.8%) vs baseline: -3.1% Memory: ✅ 42.821MB (SLO: <46.000MB -6.9%) vs baseline: +4.1% ✅ swapcase_noaspectTime: ✅ 271.641µs (SLO: <400.000µs 📉 -32.1%) vs baseline: -0.9% Memory: ✅ 42.939MB (SLO: <46.000MB -6.7%) vs baseline: +4.0% ✅ title_aspectTime: ✅ 320.671µs (SLO: <500.000µs 📉 -35.9%) vs baseline: -2.9% Memory: ✅ 42.841MB (SLO: <46.000MB -6.9%) vs baseline: +4.1% ✅ title_noaspectTime: ✅ 260.460µs (SLO: <400.000µs 📉 -34.9%) vs baseline: -1.0% Memory: ✅ 42.939MB (SLO: <46.000MB -6.7%) vs baseline: +4.5% ✅ translate_aspectTime: ✅ 492.266µs (SLO: <700.000µs 📉 -29.7%) vs baseline: -1.5% Memory: ✅ 42.880MB (SLO: <46.000MB -6.8%) vs baseline: +4.3% ✅ translate_noaspectTime: ✅ 423.310µs (SLO: <500.000µs 📉 -15.3%) vs baseline: -2.3% Memory: ✅ 42.880MB (SLO: <46.000MB -6.8%) vs baseline: +4.2% ✅ upper_aspectTime: ✅ 299.637µs (SLO: <500.000µs 📉 -40.1%) vs baseline: ~same ✅ upper_noaspectTime: ✅ 235.510µs (SLO: <400.000µs 📉 -41.1%) vs baseline: -1.0% Memory: ✅ 42.880MB (SLO: <46.000MB -6.8%) vs baseline: +4.4% 📈 iastaspectsospath - 24/24✅ ospathbasename_aspectTime: ✅ 510.670µs (SLO: <700.000µs 📉 -27.0%) vs baseline: 📈 +19.1% Memory: ✅ 42.585MB (SLO: <46.000MB -7.4%) vs baseline: +4.2% ✅ ospathbasename_noaspectTime: ✅ 431.880µs (SLO: <700.000µs 📉 -38.3%) vs baseline: -0.4% Memory: ✅ 42.585MB (SLO: <46.000MB -7.4%) vs baseline: +4.0% ✅ ospathjoin_aspectTime: ✅ 629.110µs (SLO: <700.000µs 📉 -10.1%) vs baseline: +1.1% Memory: ✅ 42.605MB (SLO: <46.000MB -7.4%) vs baseline: +4.5% ✅ ospathjoin_noaspectTime: ✅ 630.907µs (SLO: <700.000µs -9.9%) vs baseline: +0.9% Memory: ✅ 42.546MB (SLO: <46.000MB -7.5%) vs baseline: +4.1% ✅ ospathnormcase_aspectTime: ✅ 351.360µs (SLO: <700.000µs 📉 -49.8%) vs baseline: ~same Memory: ✅ 42.526MB (SLO: <46.000MB -7.6%) vs baseline: +4.2% ✅ ospathnormcase_noaspectTime: ✅ 357.371µs (SLO: <700.000µs 📉 -48.9%) vs baseline: -1.0% Memory: ✅ 42.625MB (SLO: <46.000MB -7.3%) vs baseline: +4.4% ✅ ospathsplit_aspectTime: ✅ 488.723µs (SLO: <700.000µs 📉 -30.2%) vs baseline: ~same Memory: ✅ 42.526MB (SLO: <46.000MB -7.6%) vs baseline: +4.3% ✅ ospathsplit_noaspectTime: ✅ 499.750µs (SLO: <700.000µs 📉 -28.6%) vs baseline: +0.8% Memory: ✅ 42.585MB (SLO: <46.000MB -7.4%) vs baseline: +4.3% ✅ ospathsplitdrive_aspectTime: ✅ 375.168µs (SLO: <700.000µs 📉 -46.4%) vs baseline: +1.5% Memory: ✅ 42.566MB (SLO: <46.000MB -7.5%) vs baseline: +4.3% ✅ ospathsplitdrive_noaspectTime: ✅ 73.099µs (SLO: <700.000µs 📉 -89.6%) vs baseline: -0.2% Memory: ✅ 42.585MB (SLO: <46.000MB -7.4%) vs baseline: +4.4% ✅ ospathsplitext_aspectTime: ✅ 456.785µs (SLO: <700.000µs 📉 -34.7%) vs baseline: -0.5% Memory: ✅ 42.644MB (SLO: <46.000MB -7.3%) vs baseline: +4.0% ✅ ospathsplitext_noaspectTime: ✅ 468.189µs (SLO: <700.000µs 📉 -33.1%) vs baseline: +0.7% Memory: ✅ 42.507MB (SLO: <46.000MB -7.6%) vs baseline: +4.1% 🟡 Near SLO Breach (1 suite)🟡 tracer - 6/6✅ largeTime: ✅ 31.625ms (SLO: <32.950ms -4.0%) vs baseline: -0.4% Memory: ✅ 36.707MB (SLO: <39.250MB -6.5%) vs baseline: +4.3% ✅ mediumTime: ✅ 3.120ms (SLO: <3.200ms -2.5%) vs baseline: -0.8% Memory: ✅ 35.566MB (SLO: <38.750MB -8.2%) vs baseline: +4.4% ✅ smallTime: ✅ 363.139µs (SLO: <370.000µs 🟡 -1.9%) vs baseline: +4.0% Memory: ✅ 35.547MB (SLO: <38.750MB -8.3%) vs baseline: +4.7%
|
68b9d24 to
1bd3904
Compare
faa405b to
cfec9b8
Compare
We refactor the RC implementation to use a single subscriber to reduce the number of threads spawned in fork child processes. The single subscriber performs all the necessary dispatch to the registered callbacks for each product.
cfec9b8 to
393ffba
Compare
af77e70 to
0ace384
Compare
brettlangdon
left a comment
There was a problem hiding this comment.
few nits/questions, but otherwise lgtm
c18109e to
8467377
Compare
8467377 to
26e4224
Compare
Co-authored-by: Brett Langdon <[email protected]>
|
/merge |
|
View all feedbacks in Devflow UI.
This pull request is not mergeable according to GitHub. Common reasons include pending required checks, missing approvals, or merge conflicts — but it could also be blocked by other repository rules or settings.
The expected merge time in
|
Description
This PR refactors the Remote Configuration (RC) architecture from a multiple-subscriber model (one thread per product) to a single-subscriber model with product dispatching. This reduces thread overhead and simplifies the RC polling infrastructure.
Key Changes
Architectural Simplification
New RCCallback Interface
Products now register callbacks by implementing the RCCallback abstract base class:
Key features:
__call__(payloads): Abstract method called when configuration updates are receivedperiodic(): Optional method called at every polling interval (before payload processing), regardless of whether new configuration was receivedRegistration Pattern
The single subscriber calls:
callback.periodic()for all registered callbacks at every poll cyclecallback(payloads)when new configuration is available for that productBenefits
Migration Notes
Existing callbacks automatically get no-op periodic() behavior. No breaking changes for products that don't need periodic operations.
Additional Notes
Claude Code made the largest chunk of the changes. It has been guided step-by-step to perform the following tasks
Specific changes in appsec
the appsec RC layer is tested extensively on the system tests
APPSEC-61160