⚡️ Speed up method AuthService.get_user_id_from_token by 197% in PR #10702 (pluggable-auth-service)#11634
Closed
codeflash-ai[bot] wants to merge 189 commits into
Closed
⚡️ Speed up method AuthService.get_user_id_from_token by 197% in PR #10702 (pluggable-auth-service)#11634codeflash-ai[bot] wants to merge 189 commits into
AuthService.get_user_id_from_token by 197% in PR #10702 (pluggable-auth-service)#11634codeflash-ai[bot] wants to merge 189 commits into
Conversation
…ager for pluggable service discovery - Added `register_service` decorator to allow services to self-register with the ServiceManager. - Enhanced `ServiceManager` to support multiple service discovery mechanisms, including decorator-based registration, config files, and entry points. - Implemented methods for direct service class registration and plugin discovery from various sources, improving flexibility and extensibility of service management.
- Introduced VariableService class to handle environment variables with in-memory caching. - Added methods for getting, setting, deleting, and listing variables. - Included logging for service initialization and variable operations. - Created an __init__.py file to expose VariableService in the package namespace.
…teardown - Updated LocalStorageService to inherit from both StorageService and Service for improved functionality. - Added a name attribute for service identification. - Implemented an async teardown method for future extensibility, even though no cleanup is currently needed. - Refactored the constructor to ensure proper initialization of both parent classes.
…l logging functionality - Added `BaseTelemetryService` as an abstract base class defining the interface for telemetry services. - Introduced `TelemetryService`, a lightweight implementation that logs telemetry events without sending data. - Created `__init__.py` to expose the telemetry service in the package namespace. - Ensured robust async methods for logging various telemetry events and handling exceptions.
- Added `BaseTracingService` as an abstract base class defining the interface for tracing services. - Implemented `TracingService`, a lightweight version that logs trace events without external integrations. - Included async methods for starting and ending traces, tracing components, and managing logs and outputs. - Enhanced documentation for clarity on method usage and parameters.
- Introduced a new test suite for validating the functionality of the @register_service decorator. - Implemented tests for various service types including LocalStorageService, TelemetryService, and TracingService. - Verified behavior for service registration with and without overrides, ensuring correct service management. - Included tests for custom service implementations and preservation of class functionality. - Enhanced overall test coverage for the service registration mechanism.
- Introduced a suite of unit tests covering edge cases for service registration, lifecycle management, and dependency resolution. - Implemented integration tests to validate service loading from configuration files and environment variables. - Enhanced test coverage for various service types including LocalStorageService, TelemetryService, and VariableService. - Verified behavior for service registration with and without overrides, ensuring correct service management. - Ensured robust handling of error conditions and edge cases in service creation and configuration parsing.
- Introduced comprehensive unit tests for LocalStorageService, TelemetryService, TracingService, and VariableService. - Implemented integration tests to validate the interaction between minimal services. - Ensured robust coverage for file operations, service readiness, and exception handling. - Enhanced documentation within tests for clarity on functionality and expected behavior.
…ection - Revised the documentation to highlight the advantages of the pluggable service system. - Replaced the migration guide with a detailed overview of features such as automatic discovery, lazy instantiation, dependency injection, and lifecycle management. - Clarified examples of service registration and improved overall documentation for better understanding.
During rebase, the teardown method was added in two locations (lines 57 and 220). Removed the duplicate at line 57, keeping the one at the end of the class (line 220) which is the more appropriate location for cleanup methods.
…changes - Add MockSessionService fixtures to test files that use ServiceManager - Update LocalStorageService test instantiation to use mock session and settings services - Fix service count assertions to account for MockSessionService in fixtures - Remove duplicate class-level clean_manager fixtures in test_edge_cases.py These changes fix test failures caused by LocalStorageService requiring session_service and settings_service parameters instead of just data_dir.
- Fixed Diamond Inheritance in LocalStorageService - Added Circular Dependency Detection in _create_service_from_class - Fixed StorageService.teardown to Have Default Implementation
- The aiofile library uses native async I/O (libaio) which fails with EAGAIN (SystemError: 11, 'Resource temporarily unavailable') in containerized environments like GitHub Actions runners. - Switch to aiofiles which uses thread pool executors, providing reliable async file I/O across all environments including containers.
The discover_plugins() method had a TOCTOU (time-of-check to time-of-use) race condition. Since get() uses a keyed lock (per service name), multiple threads requesting different services could concurrently see _plugins_discovered=False and trigger duplicate plugin discovery. Wrap discover_plugins() with self._lock to ensure thread-safe access to the _plugins_discovered flag and prevent concurrent discovery execution.
…ager for pluggable service discovery - Added `register_service` decorator to allow services to self-register with the ServiceManager. - Enhanced `ServiceManager` to support multiple service discovery mechanisms, including decorator-based registration, config files, and entry points. - Implemented methods for direct service class registration and plugin discovery from various sources, improving flexibility and extensibility of service management.
…teardown - Updated LocalStorageService to inherit from both StorageService and Service for improved functionality. - Added a name attribute for service identification. - Implemented an async teardown method for future extensibility, even though no cleanup is currently needed. - Refactored the constructor to ensure proper initialization of both parent classes.
… and add auth service retrieval function
Consolidate all authentication methods into the AuthService class to
enable pluggable authentication implementations. The utils module now
contains thin wrappers that delegate to the registered auth service.
This allows alternative auth implementations (e.g., OIDC) to be
registered via the pluggable services system while maintaining
backward compatibility with existing code that imports from utils.
Changes:
- Move all auth logic (token creation, user validation, API key
security, password hashing, encryption) to AuthService
- Refactor utils.py to delegate to get_auth_service()
- Update function signatures to remove settings_service parameter
(now obtained from the service internally)
…vice parameter - Changed function to retrieve current user from access token instead of JWT. - Updated AuthServiceFactory to specify SettingsService type in create method. - Removed settings_service dependency from encryption and decryption functions, simplifying the code. This refactor enhances the clarity and maintainability of the authentication logic.
- Introduced comprehensive unit tests for AuthService, covering token creation, user validation, and authentication methods. - Added tests for pluggable authentication, ensuring correct delegation to registered services. - Enhanced test coverage for user authentication scenarios, including active/inactive user checks and token validation. These additions improve the reliability and maintainability of the authentication system.
…ai/langflow into pluggable-auth-service
…ai/langflow into pluggable-auth-service
…ai/langflow into pluggable-auth-service
…ai/langflow into pluggable-auth-service
…ai/langflow into pluggable-auth-service
The optimized code achieves a **196% speedup** (11.2ms → 3.78ms) by replacing PyJWT's `jwt.decode()` with a custom `_get_unverified_claims()` method that manually parses JWT tokens.
**Key Optimization:**
The original code calls `jwt.decode(token, options={"verify_signature": False})`, which despite the flag still involves significant overhead from PyJWT's comprehensive token processing. The optimized version implements lightweight manual parsing:
1. **Splits the token** into parts (header.payload.signature)
2. **Extracts the payload** (second segment)
3. **Base64 decodes** with proper padding
4. **JSON parses** the payload directly
This bypasses PyJWT's internal validation machinery, type checking, and option processing that occurs even with `verify_signature=False`.
**Why It's Faster:**
- **Reduced function call overhead**: Eliminates PyJWT's multi-layered decode pipeline
- **Direct decoding path**: Goes straight from base64 → JSON → dict without intermediate processing
- **Minimal error handling**: Only catches the specific exceptions needed for the use case
The line profiler shows the optimization reduced the token decoding step from **65.3ms** (88.1% of runtime) to **12.9ms** (62% of runtime), a ~5x improvement on the hot path.
**Test Results Context:**
The annotated tests show this optimization excels for:
- **High-volume token processing**: The `test_large_scale_many_tokens_processed_correctly` test with 500 tokens directly benefits from the per-call speedup
- **Valid token fast-path**: Tests like `test_valid_jwt_with_hyphenated_uuid_returns_same_uuid` see the full benefit
- **Mixed workloads**: Tests alternating between valid/invalid tokens (`test_rapid_error_recovery`) still show gains on valid tokens
**Impact Assessment:**
Since `get_user_id_from_token()` is a **utility function for logging/debugging** (per docstring), this optimization is particularly valuable if called frequently in non-critical paths where token extraction happens repeatedly. The speedup compounds when processing many requests with JWT tokens in headers or logs. However, without function_references, we cannot confirm if this is in a hot request path—but any context calling this 100+ times per second would see meaningful throughput improvements.
Codecov Report❌ Patch coverage is ❌ Your project status has failed because the head coverage (42.10%) is below the target coverage (60.00%). You can increase the head coverage or adjust the target coverage. Additional details and impacted files@@ Coverage Diff @@
## main #11634 +/- ##
==========================================
+ Coverage 34.97% 35.18% +0.21%
==========================================
Files 1515 1512 -3
Lines 72569 72157 -412
Branches 10935 10643 -292
==========================================
+ Hits 25379 25390 +11
+ Misses 45794 45436 -358
+ Partials 1396 1331 -65
Flags with carried forward coverage won't be shown. Click here to find out more.
🚀 New features to boost your workflow:
|
Contributor
Author
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
⚡️ This pull request contains optimizations for PR #10702
If you approve this dependent PR, these changes will be merged into the original PR branch
pluggable-auth-service.📄 197% (1.97x) speedup for
AuthService.get_user_id_from_tokeninsrc/backend/base/langflow/services/auth/service.py⏱️ Runtime :
11.2 milliseconds→3.78 milliseconds(best of54runs)📝 Explanation and details
The optimized code achieves a 196% speedup (11.2ms → 3.78ms) by replacing PyJWT's
jwt.decode()with a custom_get_unverified_claims()method that manually parses JWT tokens.Key Optimization:
The original code calls
jwt.decode(token, options={"verify_signature": False}), which despite the flag still involves significant overhead from PyJWT's comprehensive token processing. The optimized version implements lightweight manual parsing:This bypasses PyJWT's internal validation machinery, type checking, and option processing that occurs even with
verify_signature=False.Why It's Faster:
The line profiler shows the optimization reduced the token decoding step from 65.3ms (88.1% of runtime) to 12.9ms (62% of runtime), a ~5x improvement on the hot path.
Test Results Context:
The annotated tests show this optimization excels for:
test_large_scale_many_tokens_processed_correctlytest with 500 tokens directly benefits from the per-call speeduptest_valid_jwt_with_hyphenated_uuid_returns_same_uuidsee the full benefittest_rapid_error_recovery) still show gains on valid tokensImpact Assessment:
Since
get_user_id_from_token()is a utility function for logging/debugging (per docstring), this optimization is particularly valuable if called frequently in non-critical paths where token extraction happens repeatedly. The speedup compounds when processing many requests with JWT tokens in headers or logs. However, without function_references, we cannot confirm if this is in a hot request path—but any context calling this 100+ times per second would see meaningful throughput improvements.✅ Correctness verification report:
🌀 Click to see Generated Regression Tests
To edit these changes
git checkout codeflash/optimize-pr10702-2026-02-06T19.37.03and push.