Skip to content

Commit a9a8cef

Browse files
fix(reflector): eliminate idle CPU spin (#566)
* fix(reflector): eliminate idle CPU spin * fix(build): make Linux validation reliable * chore(deps): update project dependencies
1 parent 6b29dc4 commit a9a8cef

13 files changed

Lines changed: 143 additions & 134 deletions

File tree

.github/workflows/ci.yml

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ jobs:
4545
docs: ${{ steps.filter.outputs.docs }}
4646
workflows: ${{ steps.filter.outputs.workflows }}
4747
steps:
48-
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
49-
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
48+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
49+
- uses: dorny/paths-filter@ceb8a2b8f2d89434be7ff52d3de7ec3738c5cc9d # v4.0.3
5050
id: filter
5151
with:
5252
filters: |
@@ -78,7 +78,7 @@ jobs:
7878
needs: changes
7979
if: needs.changes.outputs.backend == 'true' || needs.changes.outputs.frontend == 'true' || needs.changes.outputs.c == 'true' || needs.changes.outputs.workflows == 'true'
8080
steps:
81-
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
81+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
8282
with:
8383
fetch-depth: 0
8484

@@ -123,7 +123,7 @@ jobs:
123123
bin/stem version
124124
125125
- name: Run golangci-lint
126-
uses: golangci/golangci-lint-action@82606bf257cbaff209d206a39f5134f0cfbfd2ee # v9.2.1
126+
uses: golangci/golangci-lint-action@ba0d7d2ec06a0ea1cb5fa41b2e4a3ab91d21278a # v9.3.0
127127
with:
128128
version: v2.12.2
129129
# Full-tree lint verified clean on 2026-08-14. Keep CI aligned with
@@ -203,7 +203,7 @@ jobs:
203203
GOCACHE: ${{ github.workspace }}/.cache/go/build
204204

205205
steps:
206-
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
206+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
207207

208208
- name: Set up Go
209209
uses: ./.github/actions/setup-go
@@ -254,7 +254,7 @@ jobs:
254254
run:
255255
working-directory: ui
256256
steps:
257-
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
257+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
258258

259259
- name: Set up Node.js
260260
uses: ./.github/actions/setup-node
@@ -301,7 +301,7 @@ jobs:
301301
needs: changes
302302
if: needs.changes.outputs.c == 'true' || needs.changes.outputs.workflows == 'true'
303303
steps:
304-
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
304+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
305305

306306
- name: Install C23 tools (clang-tidy, cppcheck, bear)
307307
run: |
@@ -413,7 +413,7 @@ jobs:
413413
needs: changes
414414
if: needs.changes.outputs.c == 'true' || needs.changes.outputs.workflows == 'true'
415415
steps:
416-
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
416+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
417417

418418
- name: Install clang-18 + libFuzzer + cppcheck
419419
run: |
@@ -457,7 +457,7 @@ jobs:
457457
actions: read # required alongside security-events:write on private repos
458458

459459
steps:
460-
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
460+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
461461
with:
462462
fetch-depth: 0
463463

@@ -476,7 +476,7 @@ jobs:
476476
args: "-fmt sarif -out gosec-results.sarif ./..."
477477

478478
- name: Upload gosec results
479-
uses: github/codeql-action/upload-sarif@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2
479+
uses: github/codeql-action/upload-sarif@f205ea1c3313d32999d8d6a48b4f6530d4437b38 # v4.37.4
480480
if: always() && hashFiles('gosec-results.sarif') != ''
481481
continue-on-error: true
482482
with:
@@ -523,7 +523,7 @@ jobs:
523523
exit-code: '0'
524524

525525
- name: Upload Trivy results
526-
uses: github/codeql-action/upload-sarif@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2
526+
uses: github/codeql-action/upload-sarif@f205ea1c3313d32999d8d6a48b4f6530d4437b38 # v4.37.4
527527
if: always() && hashFiles('trivy-results.sarif') != ''
528528
continue-on-error: true
529529
with:
@@ -574,7 +574,7 @@ jobs:
574574
needs: changes
575575
if: needs.changes.outputs.backend == 'true' || needs.changes.outputs.frontend == 'true' || needs.changes.outputs.c == 'true' || needs.changes.outputs.workflows == 'true'
576576
steps:
577-
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
577+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
578578

579579
- name: Check for sensitive files
580580
run: |
@@ -637,7 +637,7 @@ jobs:
637637
|| needs.changes.outputs.workflows == 'true'
638638
639639
steps:
640-
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
640+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
641641

642642
- name: Validate i18n (parity, glossary, banned vocab, etc.)
643643
# Previously a placeholder that printed "✅ i18n validation complete"
@@ -663,7 +663,7 @@ jobs:
663663
# Always runs — cheap (runs in seconds) and applies to every PR.
664664

665665
steps:
666-
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
666+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
667667

668668
- name: Check markdown links
669669
uses: gaurav-nelson/github-action-markdown-link-check@5c5dfc0ac2e225883c0e5f03a85311ec2830d368 # v1
@@ -672,7 +672,7 @@ jobs:
672672
use-quiet-mode: "yes"
673673

674674
- name: Lint markdown files
675-
uses: DavidAnson/markdownlint-cli2-action@ded1f9488f68a970bc66ea5619e13e9b52e601cd # v23.2.0
675+
uses: DavidAnson/markdownlint-cli2-action@21c1be1b93ad9ed58fa840aacc3f279cde2a72ff # v24.2.0
676676
continue-on-error: true
677677
with:
678678
globs: |
@@ -722,7 +722,7 @@ jobs:
722722
goarch: arm64
723723
required: false
724724
steps:
725-
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
725+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
726726

727727
- name: Set up Go
728728
uses: ./.github/actions/setup-go
@@ -817,7 +817,7 @@ jobs:
817817
needs.frontend.result == 'success' &&
818818
(needs.backend.result == 'success' || needs.backend.result == 'skipped')
819819
steps:
820-
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
820+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
821821

822822
- name: Set up Go
823823
uses: ./.github/actions/setup-go
@@ -852,7 +852,7 @@ jobs:
852852
(needs.changes.outputs.frontend == 'true' || needs.changes.outputs.workflows == 'true')
853853
854854
steps:
855-
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
855+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
856856

857857
- name: Set up Go
858858
uses: ./.github/actions/setup-go
@@ -917,7 +917,7 @@ jobs:
917917
(needs.backend.result == 'success' || needs.backend.result == 'skipped')
918918
919919
steps:
920-
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
920+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
921921

922922
- name: Set up Go
923923
uses: ./.github/actions/setup-go

.github/workflows/codeql.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,17 @@ jobs:
2828

2929
steps:
3030
- name: Checkout repository
31-
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
31+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
3232

3333
- name: Initialize CodeQL
34-
uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2
34+
uses: github/codeql-action/init@f205ea1c3313d32999d8d6a48b4f6530d4437b38 # v4.37.4
3535
with:
3636
languages: ${{ matrix.language }}
3737

3838
- name: Autobuild
39-
uses: github/codeql-action/autobuild@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2
39+
uses: github/codeql-action/autobuild@f205ea1c3313d32999d8d6a48b4f6530d4437b38 # v4.37.4
4040

4141
- name: Perform CodeQL Analysis
42-
uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2
42+
uses: github/codeql-action/analyze@f205ea1c3313d32999d8d6a48b4f6530d4437b38 # v4.37.4
4343
with:
4444
category: "/language:${{ matrix.language }}"

.github/workflows/dead-code.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ jobs:
3333
runs-on: ubuntu-latest
3434

3535
steps:
36-
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
36+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
3737

3838
- name: Set up Go
39-
uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
39+
uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0
4040
with:
4141
go-version-file: go.mod
4242
cache: true
@@ -91,10 +91,10 @@ jobs:
9191
runs-on: ubuntu-latest
9292

9393
steps:
94-
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
94+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
9595

9696
- name: Set up Node.js
97-
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
97+
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
9898
with:
9999
node-version: "26.5.0"
100100
cache: npm
@@ -155,7 +155,7 @@ jobs:
155155
runs-on: ubuntu-latest
156156

157157
steps:
158-
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
158+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
159159

160160
- name: Check for orphaned files
161161
run: |

.github/workflows/label-sync.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ jobs:
1717
name: Sync Labels
1818
runs-on: ubuntu-latest
1919
steps:
20-
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
21-
- uses: crazy-max/ghaction-github-labeler@24d110aa46a59976b8a7f35518cb7f14f434c916 # v5.3.0
20+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
21+
- uses: crazy-max/ghaction-github-labeler@548a7c3603594ec17c819e1239f281a3b801ab4d # v6.0.0
2222
with:
2323
yaml-file: .github/labels.yml
2424
skip-delete: false

.github/workflows/release.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,10 @@ jobs:
7171
outputs:
7272
ui_hash: ${{ steps.ui-hash.outputs.hash }}
7373
steps:
74-
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
74+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
7575

7676
- name: Set up Node.js
77-
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
77+
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
7878
with:
7979
node-version: "26.5.0"
8080
cache: npm
@@ -123,7 +123,7 @@ jobs:
123123
# real (non-snapshot) release.
124124
hashes: ${{ steps.hashes.outputs.hashes }}
125125
steps:
126-
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
126+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
127127
with:
128128
fetch-depth: 0
129129

@@ -309,7 +309,7 @@ jobs:
309309
310310
- name: Generate SLSA build-provenance attestation
311311
id: attest
312-
uses: actions/attest-build-provenance@a2bbfa25375fe432b6a289bc6b6cd05ecd0c4c32 # v4.1.0
312+
uses: actions/attest-build-provenance@4d101475d8b20a2381f78447822ac1eab6504dd8 # v4.2.2
313313
with:
314314
subject-checksums: subjects.txt
315315

.github/workflows/scorecard.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ jobs:
3434

3535
steps:
3636
- name: Checkout code
37-
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
37+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
3838
with:
3939
persist-credentials: false
4040

@@ -49,6 +49,6 @@ jobs:
4949
publish_results: true
5050

5151
- name: Upload SARIF to GitHub Code Scanning
52-
uses: github/codeql-action/upload-sarif@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2
52+
uses: github/codeql-action/upload-sarif@f205ea1c3313d32999d8d6a48b4f6530d4437b38 # v4.37.4
5353
with:
5454
sarif_file: results.sarif

.github/workflows/todo-tracker.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ jobs:
3434
runs-on: ubuntu-latest
3535

3636
steps:
37-
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
37+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
3838

3939
- name: Scan for TODO comments
4040
id: todos

cmd/stem/cmd_reflect.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,14 @@ func getReflectorPort(profile string, requested uint16) uint16 {
3939
func reflectorStatsLoop(dp *reflectorDP.Dataplane) {
4040
sigChan := make(chan os.Signal, 1)
4141
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
42+
defer signal.Stop(sigChan)
4243

43-
ticker := time.NewTicker(statsIntervalSeconds * time.Second)
44-
defer ticker.Stop()
44+
var statsTick <-chan time.Time
45+
if stdout, err := os.Stdout.Stat(); err == nil && stdout.Mode()&os.ModeCharDevice != 0 {
46+
ticker := time.NewTicker(statsIntervalSeconds * time.Second)
47+
defer ticker.Stop()
48+
statsTick = ticker.C
49+
}
4550

4651
for {
4752
select {
@@ -55,7 +60,7 @@ func reflectorStatsLoop(dp *reflectorDP.Dataplane) {
5560
_, _ = fmt.Fprintf(os.Stdout, " Bytes Received: %d\n", stats.BytesReceived)
5661
_, _ = fmt.Fprintf(os.Stdout, " Bytes Reflected: %d\n", stats.BytesReflected)
5762
return
58-
case <-ticker.C:
63+
case <-statsTick:
5964
stats := dp.GetStats()
6065
_, _ = fmt.Fprintf(
6166
os.Stdout,

0 commit comments

Comments
 (0)