fix(#1356): replace HTTPServer with ThreadingHTTPServer in multi-user bridge #1366
Closed
Rockachopa
wants to merge 1 commits from
fix/issue-1356-threading-http-server into main
pull from: fix/issue-1356-threading-http-server
merge into: Timmy_Foundation:main
Timmy_Foundation:main
Timmy_Foundation:fix/1474-duplicate-pr-prevention
Timmy_Foundation:fix/1480-duplicate-pr-prevention
Timmy_Foundation:fix/1336-merge-conflicts
Timmy_Foundation:fix/1414-hardcoded-ip
Timmy_Foundation:fix/1413-deploy-ports-docs
Timmy_Foundation:fix/1415-port-conflict-1776183200
Timmy_Foundation:fix/1415-port-conflict-1776182400
Timmy_Foundation:fix/1440-portals-json
Timmy_Foundation:fix/1427-chroma-telemetry
Timmy_Foundation:fix/1441-branch-check
Timmy_Foundation:fix/1415-port-conflict
Timmy_Foundation:fix/1442-duplicate-id
Timmy_Foundation:dispatch/1338-1776180746
Timmy_Foundation:dispatch/1128-1776180746
Timmy_Foundation:dispatch/1336-1776180746
Timmy_Foundation:dispatch/1339-1776180746
Timmy_Foundation:am/1338-1776166469
Timmy_Foundation:am/1128-1776166469
Timmy_Foundation:am/1336-1776166469
Timmy_Foundation:am/1339-1776166469
Timmy_Foundation:dispatch/1123-1776180746
Timmy_Foundation:am/1123-1776166469
Timmy_Foundation:dawn/1336-1776130053
Timmy_Foundation:dawn/1338-1776130053
Timmy_Foundation:dawn/1128-1776130053
Timmy_Foundation:triage/1336-1776129677
Timmy_Foundation:triage/1128-1776129677
Timmy_Foundation:q/1336-1776129480
Timmy_Foundation:triage/1338-1776129677
Timmy_Foundation:dawn/1123-1776130053
Timmy_Foundation:queue/1336-1776129201
Timmy_Foundation:q/1128-1776129480
Timmy_Foundation:triage/1123-1776129677
Timmy_Foundation:queue/1128-1776129201
Timmy_Foundation:q/1338-1776129480
Timmy_Foundation:bug/1415-port-conflict-fix
Timmy_Foundation:q/1123-1776129480
Timmy_Foundation:queue/1123-1776129201
Timmy_Foundation:whip/1415-1776129480
Timmy_Foundation:queue/1338-1776129201
Timmy_Foundation:whip/1414-1776129480
Timmy_Foundation:dawn/1339-1776130053
Timmy_Foundation:whip/1413-1776129480
Timmy_Foundation:triage/1339-1776129677
Timmy_Foundation:fix/atlas-toggle-btn-1406
Timmy_Foundation:q/1339-1776129480
Timmy_Foundation:queue/1339-1776129201
Timmy_Foundation:whip/1123-1776128804
Timmy_Foundation:whip/1127-1776128804
Timmy_Foundation:whip/1338-1776128804
Timmy_Foundation:whip/1128-1776128804
Timmy_Foundation:whip/1336-1776128804
Timmy_Foundation:whip/1339-1776128804
Timmy_Foundation:whip/1127-1776127532
Timmy_Foundation:whip/1336-1776127532
Timmy_Foundation:whip/1128-1776127532
Timmy_Foundation:whip/1339-1776127532
Timmy_Foundation:whip/1338-1776127532
Timmy_Foundation:whip/1123-1776127532
Timmy_Foundation:am/1124-1776166469
Timmy_Foundation:burn/1124-1776126523
Timmy_Foundation:dawn/1124-1776130053
Timmy_Foundation:dispatch/1124-1776180746
Timmy_Foundation:q/1124-1776129480
Timmy_Foundation:queue/1124-1776129201
Timmy_Foundation:triage/1124-1776129677
Timmy_Foundation:whip/1124-1776127532
Timmy_Foundation:whip/1124-1776128804
Timmy_Foundation:burn/1128-1776126523
Timmy_Foundation:burn/1143-1776125702
Timmy_Foundation:burn/1144-1776120221
Timmy_Foundation:burn/1336-1776125702
Timmy_Foundation:burn/1354-1776125702
Timmy_Foundation:burn/1338-1776125702
Timmy_Foundation:burn/1349-1776125702
Timmy_Foundation:burn/1356-1776125702
Timmy_Foundation:burn/1338-1776120221
Timmy_Foundation:burn/1340-1776120221
Timmy_Foundation:burn/1336-1776120221
Timmy_Foundation:burn/1339-1776120221
Timmy_Foundation:burn/1354-1776120221
Timmy_Foundation:burn/1349-1776120221
Timmy_Foundation:burn/1356-1776120221
Timmy_Foundation:nexusburn/research-1122
Timmy_Foundation:nexusburn/qa-performance-873
Timmy_Foundation:nexusburn/testing-bugfix-1349
Timmy_Foundation:nexusburn/backlog-management-1127
Timmy_Foundation:nexusburn/building-1354
Timmy_Foundation:nexusburn/deployment-1339
Timmy_Foundation:nexusburn/direction-architecture-875
Timmy_Foundation:nexusburn/development-1356
Timmy_Foundation:burn/a11y-contrast-702
Timmy_Foundation:burn/threejs-lod-873
Timmy_Foundation:fix/mempalace-init-display-1340
Timmy_Foundation:fix/chatlog-log-crash-1349
Timmy_Foundation:fix/issue-1336-index-html-buttons
Timmy_Foundation:fix/duplicate-content-blocks-1338
Timmy_Foundation:feat/multi-user-bridge
Timmy_Foundation:burn/20260413-0408-fix
Timmy_Foundation:mimo/code/issue-707
Timmy_Foundation:mimo/code/issue-704
Timmy_Foundation:feat/paper-results
Timmy_Foundation:feature/full-history-dedup
Timmy_Foundation:feature/dpo-quality-validator
Timmy_Foundation:feature/deepdive-dpo-phase-3.5
Timmy_Foundation:multi-user-bridge
Timmy_Foundation:burn/20260413-gofai-structured-actions
Timmy_Foundation:perplexity/swarm-governor
Timmy_Foundation:mimo/code/issue-717
Timmy_Foundation:mimo/build/issue-729
Timmy_Foundation:mimo/build/issue-710
Timmy_Foundation:mimo/build/issue-672
Timmy_Foundation:mimo/create/issue-709
Timmy_Foundation:burn/20260412-gofai-state-mainline
Timmy_Foundation:mimo/build/issue-865
Timmy_Foundation:mimo/code/issue-1277
Timmy_Foundation:mimo/build/issue-901
Timmy_Foundation:mimo/code/issue-696
Timmy_Foundation:mimo/build/issue-1119
Timmy_Foundation:mimo/build/issue-817
Timmy_Foundation:burn/multi-user-bridge
Timmy_Foundation:mimo/research/issue-866
Timmy_Foundation:mimo/research/issue-873
Timmy_Foundation:mimo/research/issue-1144
Timmy_Foundation:mimo/create/issue-864
Timmy_Foundation:mimo/create/issue-716
Timmy_Foundation:mimo/create/issue-698
Timmy_Foundation:mimo/create/issue-1117
Timmy_Foundation:mimo/create/issue-1116
Timmy_Foundation:mimo/code/issue-731
Timmy_Foundation:mimo/code/issue-730
Timmy_Foundation:mimo/code/issue-721
Timmy_Foundation:mimo/code/issue-726
Timmy_Foundation:mimo/code/issue-719
Timmy_Foundation:mimo/code/issue-727
Timmy_Foundation:mimo/code/issue-673
Timmy_Foundation:mimo/code/issue-675
Timmy_Foundation:mimo/code/issue-715
Timmy_Foundation:mimo/code/issue-674
Timmy_Foundation:mimo/code/issue-1215
Timmy_Foundation:feat/resonance-viz-integration-1776010801023
Timmy_Foundation:mimo/code/issue-1208
Timmy_Foundation:mimo/code/issue-1181
Timmy_Foundation:feat/resonance-linker-1776010647557
Timmy_Foundation:feat/gofai-layer-4-v2
Timmy_Foundation:feat/gofai-layer-4-1776010488203
Timmy_Foundation:burn/20260412-1202-mnemosyne
Timmy_Foundation:mimo/build/issue-720
Timmy_Foundation:mimo/build/issue-728
Timmy_Foundation:mimo/build/issue-712
Timmy_Foundation:mimo/build/issue-706
Timmy_Foundation:feat/resonance-viz-1775996553148
Timmy_Foundation:feat/gofai-nexus-final-v2
Timmy_Foundation:feat/gofai-nexus-final-1775996426040
Timmy_Foundation:feat/gofai-nexus-mega-1775996240349
Timmy_Foundation:feat/mnemosyne-resonance
Timmy_Foundation:purge/openclaw-fleet-vocab
Timmy_Foundation:purge/openclaw-readme
Timmy_Foundation:feat/mnemosyne-file-ingestion
Timmy_Foundation:feat/mnemosyne-discover
Timmy_Foundation:feat/mnemosyne-snapshot
Timmy_Foundation:fix/mnemosyne-cli-path-vitality
Timmy_Foundation:feat/mnemosyne-memory-path
Timmy_Foundation:feat/memory-pulse
Timmy_Foundation:feat/memory-consolidation
Timmy_Foundation:feat/mnemosyne-memory-decay
Timmy_Foundation:feat/mnemosyne-embedding-backend
Timmy_Foundation:epic/iac-workflow-1248
Timmy_Foundation:feat/mnemosyne-connection-panel
Timmy_Foundation:feat/mnemosyne-temporal-queries
Timmy_Foundation:feat/mnemosyne-foundation
Timmy_Foundation:feat/mnemosyne-entry-update-dedup
Timmy_Foundation:feat/mnemosyne-tag-management
Timmy_Foundation:feat/ordinal-archive-2026-04-11
Timmy_Foundation:feat/mnemosyne-graph-clusters
Timmy_Foundation:feat/mnemosyne-graph-export
Timmy_Foundation:feat/mnemosyne-timeline-dedup
Timmy_Foundation:feat/mnemosyne-inspect-panel
Timmy_Foundation:feat/mnemosyne-memory-pulse
Timmy_Foundation:feat/mnemosyne-semantic-search
Timmy_Foundation:feat/mnemosyne-memory-birth
Timmy_Foundation:feat/mnemosyne-export-deletion-stats
Timmy_Foundation:feat/mnemosyne-phase1-1216
Timmy_Foundation:fix/entity-resolution-lines-wiring
Timmy_Foundation:feat/mnemosyne-memory-filter
Timmy_Foundation:feat/mnemosyne-memory-inspector
Timmy_Foundation:feat/mnemosyne-memory-search
Timmy_Foundation:mimo/build/issue-686
Timmy_Foundation:mimo/build/issue-680
Timmy_Foundation:feat/mnemosyne-ambient-particles
Timmy_Foundation:fix/auto-merge
Timmy_Foundation:feat/spatial-search-issue-1170
Timmy_Foundation:mimo/code/issue-723
Timmy_Foundation:mimo/code/issue-714
Timmy_Foundation:mimo/create/issue-681
Timmy_Foundation:mimo/code/issue-724
Timmy_Foundation:mimo/create/issue-685
Timmy_Foundation:mimo/create/issue-800
Timmy_Foundation:mimo/research/issue-1047
Timmy_Foundation:mimo/research/issue-801
Timmy_Foundation:mimo/build/issue-703
Timmy_Foundation:mimo/code/issue-1174
Timmy_Foundation:feat/mnemosyne-timeline-scrubber
Timmy_Foundation:mimo/build/issue-701
Timmy_Foundation:feat/mnemosyne-entity-resolution-lines
Timmy_Foundation:feat/mnemosyne-trust-crystal-rendering
Timmy_Foundation:feat/mnemosyne-live-memory-bridge
Timmy_Foundation:feat/mnemosyne-clear-feed
Timmy_Foundation:claude/issue-1171
Timmy_Foundation:mimo/code/issue-1145
Timmy_Foundation:mimo/code/issue-1146
Timmy_Foundation:feat/mnemosyne-crystal-inspect
Timmy_Foundation:feat/mnemosyne-persistence
Timmy_Foundation:claude/issue-1125
Timmy_Foundation:claude/issue-1126
Timmy_Foundation:feat/mnemosyne-spatial-schema-consolidated
Timmy_Foundation:feat/mnemosyne-spatial-memory-schema
Timmy_Foundation:feat/mnemosyne-spatial-schema
Timmy_Foundation:feat/mnemosyne-spatial-integration
Timmy_Foundation:feat/mnemosyne-memory-orbs-v2
Timmy_Foundation:feat/mnemosyne-memory-orbs-complete
Timmy_Foundation:feat/mnemosyne-glowing-orbs
Timmy_Foundation:feat/mnemosyne-memory-orbs
Timmy_Foundation:feat/mnemosyne-visuals
Timmy_Foundation:pr-1139
Timmy_Foundation:feat/mnemosyne-schema
Timmy_Foundation:bezalel/rca-deadman-fratricide
Timmy_Foundation:perplexity/soul-md-pointer
Timmy_Foundation:feat/mempalace-api-add-1775582323040
Timmy_Foundation:claude/issue-1112
Timmy_Foundation:groq/issue-1126
Timmy_Foundation:groq/issue-1118
Timmy_Foundation:groq/issue-1119
Timmy_Foundation:groq/issue-1047
Timmy_Foundation:groq/issue-915
Timmy_Foundation:claude/issue-1075
Timmy_Foundation:groq/issue-917
Timmy_Foundation:groq/issue-918
Timmy_Foundation:groq/issue-1103
Timmy_Foundation:groq/issue-1105
Timmy_Foundation:groq/issue-1106
Timmy_Foundation:groq/issue-1108
Timmy_Foundation:groq/issue-1092
Timmy_Foundation:groq/issue-1095
Timmy_Foundation:groq/issue-1098
Timmy_Foundation:groq/issue-913
Timmy_Foundation:timmy/issue-fix-896-897-898-910
Timmy_Foundation:claude/issue-823
Timmy_Foundation:claude/issue-879
Timmy_Foundation:claude/issue-880
Timmy_Foundation:claude/issue-827
Timmy_Foundation:claude/issue-882
Timmy_Foundation:claude/issue-826
Timmy_Foundation:claude/issue-836
Timmy_Foundation:claude/issue-832
Timmy_Foundation:claude/issue-833
Timmy_Foundation:timmy/issue-855
Timmy_Foundation:allegro/self-improvement-infra
Timmy_Foundation:ezra/deep-dive-architecture-20260405
Timmy_Foundation:claude/modularization-phase-1
Timmy_Foundation:gemini/issue-431
Dismiss Review
Are you sure you want to dismiss this review?
Labels
Clear labels
222-epic
3d-world
CI
QA
actionable
agent-presence
aistudio-ready
assigned-aistudio
assigned-claude
assigned-claw-code
assigned-gemini
assigned-groq
assigned-kimi
assigned-kimi
assigned-perplexity
assigned-sonnet
blocked
claude-ready
claw-code-done
claw-code-in-progress
deprioritized
duplicate
epic
gemini-api
gemini-review
google-ai-ultra
groq-ready
harness
identity
infrastructure
kimi-done
kimi-in-progress
kimi-ready
lazzyPit
media-gen
mnemosyne
modularization
needs-design
nostr
p0-critical
p1-important
p2-backlog
performance
perplexity-ready
portal
research
security
sonnet-ready
sovereignty
velocity-engine
Continuous integration, runners, workflow issues
Quality assurance, testing, and production audit
Queued for Code Claw (qwen/openrouter)
Dispatched to Kimi via OpenClaw
Blocked by external dependency or merge conflict
Code Claw completed this task
Code Claw is actively working
Epic / umbrella issue
Gemini API integration
Google AI Ultra integration work
Timmy identity and branding
Kimi completed this task
Kimi is actively working on this
Lazarus Pit — automated agent resurrection and health recovery
AI media generation (image/video/audio)
Project Mnemosyne — The Living Holographic Archive
Deep research and planning tasks
Security hardening, vulnerability fixes, access control
Auto-generated by velocity engine
No Label
Milestone
No items
No Milestone
Projects
Clear projects
No project
Assignees
KimiClaw
Rockachopa
Timmy
allegro
antigravity
bezalel
claude
claw-code
codex-agent
ezra
gemini
google
grok
hermes
kimi
manus
perplexity
sonnet
Clear assignees
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: Timmy_Foundation/the-nexus#1366
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "fix/issue-1356-threading-http-server"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Fix for #1356
The multi-user bridge uses Python's single-threaded
HTTPServer, which processes requests sequentially. Each LLM call blocks for 5-10 seconds, queuing all other users. Under 10 concurrent requests, 60% timeout at 30s.Changes
multi_user_bridge.pyline 2883: ChangedHTTPServer(...)→ThreadingHTTPServer(...)(class already defined at line 37)world/multi_user_bridge.py: AddedThreadingMixInimport andThreadingHTTPServerclass, updated server instantiationImpact
Refs #1356
Review: Replace HTTPServer with ThreadingHTTPServer
Correct fix for a real concurrency problem. When LLM calls block for 5-10 seconds on a single-threaded server, all other users queue up. Threading is the right approach here.
Changes
multi_user_bridge.py(root) — Single-line change:HTTPServer(...)toThreadingHTTPServer(...). TheThreadingHTTPServerclass is already defined at line 37 of this file, so this just uses it.world/multi_user_bridge.py— Adds theThreadingMixInimport, definesThreadingHTTPServerclass withdaemon_threads = True, and updates the server instantiation.Analysis
daemon_threads = Trueis the right choice — threads die when the main process exits, preventing zombie threads on shutdown.ThreadingMixInmust come beforeHTTPServerin the MRO (it does:class ThreadingHTTPServer(ThreadingMixIn, HTTPServer)), so the method resolution is correct.BridgeHandleraccesses shared mutable state (global dicts, lists, counters), those accesses now need synchronization (locks). The diff does not show any locking changes. Verify thatBridgeHandler.do_POST/do_GETmethods are thread-safe. Common issues include concurrent writes to shared user registries, room state, or chat logs. IfChatLogalready uses locks (the test suite in PR #1369 tests thread safety), that part may be fine, but other shared state in the handler needs auditing.Verdict
The threading change itself is correct and necessary. The risk is in shared state that was previously safe under single-threaded execution. If the handler already uses locks or thread-safe data structures, this is good to merge. If not, this change could introduce race conditions that are harder to debug than the original timeout issue.
Approving because the fix is directionally correct and the single-threaded server is a clear bottleneck, but please audit shared mutable state in
BridgeHandlerfor thread safety.Good improvement: switching to threaded HTTP server to prevent request blocking.
The change from HTTPServer to ThreadingHTTPServer is correct and well-implemented. Using ThreadingMixIn with daemon_threads=True is the right pattern — daemon threads ensure the server shuts down cleanly without waiting for in-flight requests. The class is properly defined in world/multi_user_bridge.py with the import of ThreadingMixIn from socketserver.
One concern: both multi_user_bridge.py (root) and world/multi_user_bridge.py are modified, but only world/multi_user_bridge.py defines the ThreadingHTTPServer class and imports ThreadingMixIn. The root multi_user_bridge.py references ThreadingHTTPServer at line 2883 but does not appear to import or define it in this diff. If the root file does not already have a matching import/class definition elsewhere, this will crash with a NameError at startup. Please verify that the root multi_user_bridge.py has the ThreadingHTTPServer class available in scope.
Also note: thread-per-request servers can have issues with shared mutable state. If BridgeHandler accesses any global data structures, ensure they are protected with locks. This is especially relevant now that requests will be handled concurrently.
Closing: dup of 1389 for #1356. Triage by KETER — fleet-ops#143.
Pull request closed