cachekit 0.14.0__tar.gz → 0.15.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. {cachekit-0.14.0 → cachekit-0.15.0}/Cargo.lock +1 -1
  2. {cachekit-0.14.0 → cachekit-0.15.0}/PKG-INFO +1 -6
  3. {cachekit-0.14.0 → cachekit-0.15.0}/README.md +0 -4
  4. {cachekit-0.14.0 → cachekit-0.15.0}/pyproject.toml +1 -3
  5. {cachekit-0.14.0 → cachekit-0.15.0}/rust/Cargo.toml +1 -1
  6. {cachekit-0.14.0 → cachekit-0.15.0}/rust/README.md +0 -4
  7. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/__init__.py +1 -2
  8. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/backends/base.py +2 -2
  9. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/cache_handler.py +8 -6
  10. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/config/__init__.py +0 -2
  11. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/config/decorator.py +4 -21
  12. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/config/nested.py +0 -58
  13. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/decorators/intent.py +0 -2
  14. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/decorators/orchestrator.py +0 -43
  15. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/decorators/wrapper.py +1 -36
  16. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/reliability/__init__.py +1 -4
  17. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/reliability/circuit_breaker.py +37 -83
  18. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/reliability/metrics_collection.py +1 -2
  19. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/reliability/profiles.py +0 -10
  20. cachekit-0.14.0/src/cachekit/reliability/adaptive_timeout.py +0 -424
  21. {cachekit-0.14.0 → cachekit-0.15.0}/Cargo.toml +0 -0
  22. {cachekit-0.14.0 → cachekit-0.15.0}/LICENSE +0 -0
  23. {cachekit-0.14.0 → cachekit-0.15.0}/rust/Makefile +0 -0
  24. {cachekit-0.14.0 → cachekit-0.15.0}/rust/TEST_EXPANSION_SUMMARY.md +0 -0
  25. {cachekit-0.14.0 → cachekit-0.15.0}/rust/src/lib.rs +0 -0
  26. {cachekit-0.14.0 → cachekit-0.15.0}/rust/src/python_bindings.rs +0 -0
  27. {cachekit-0.14.0 → cachekit-0.15.0}/rust/supply-chain/audits.toml +0 -0
  28. {cachekit-0.14.0 → cachekit-0.15.0}/rust/supply-chain/config.toml +0 -0
  29. {cachekit-0.14.0 → cachekit-0.15.0}/rust/supply-chain/imports.lock +0 -0
  30. {cachekit-0.14.0 → cachekit-0.15.0}/rust/tsan_suppressions.txt +0 -0
  31. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/backends/__init__.py +0 -0
  32. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/backends/base_config.py +0 -0
  33. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/backends/cachekitio/__init__.py +0 -0
  34. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/backends/cachekitio/backend.py +0 -0
  35. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/backends/cachekitio/client.py +0 -0
  36. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/backends/cachekitio/config.py +0 -0
  37. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/backends/cachekitio/error_handler.py +0 -0
  38. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/backends/cachekitio/session.py +0 -0
  39. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/backends/errors.py +0 -0
  40. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/backends/file/__init__.py +0 -0
  41. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/backends/file/backend.py +0 -0
  42. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/backends/file/config.py +0 -0
  43. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/backends/memcached/__init__.py +0 -0
  44. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/backends/memcached/backend.py +0 -0
  45. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/backends/memcached/config.py +0 -0
  46. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/backends/memcached/error_handler.py +0 -0
  47. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/backends/provider.py +0 -0
  48. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/backends/redis/__init__.py +0 -0
  49. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/backends/redis/backend.py +0 -0
  50. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/backends/redis/client.py +0 -0
  51. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/backends/redis/config.py +0 -0
  52. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/backends/redis/error_handler.py +0 -0
  53. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/backends/redis/provider.py +0 -0
  54. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/config/settings.py +0 -0
  55. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/config/singleton.py +0 -0
  56. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/config/validation.py +0 -0
  57. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/decorators/__init__.py +0 -0
  58. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/decorators/local_wrapper.py +0 -0
  59. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/decorators/main.py +0 -0
  60. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/decorators/session.py +0 -0
  61. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/decorators/stats_context.py +0 -0
  62. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/decorators/tenant_context.py +0 -0
  63. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/decorators/utils/__init__.py +0 -0
  64. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/di.py +0 -0
  65. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/hash_utils.py +0 -0
  66. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/health.py +0 -0
  67. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/hiredis_compat.py +0 -0
  68. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/imports.py +0 -0
  69. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/interop.py +0 -0
  70. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/invalidation/__init__.py +0 -0
  71. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/invalidation/channel.py +0 -0
  72. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/invalidation/event.py +0 -0
  73. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/invalidation/redis_channel.py +0 -0
  74. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/key_generator.py +0 -0
  75. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/l1_cache.py +0 -0
  76. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/logging.py +0 -0
  77. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/monitoring/__init__.py +0 -0
  78. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/monitoring/correlation_tracking.py +0 -0
  79. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/monitoring/pool_monitor.py +0 -0
  80. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/monitoring/protocols.py +0 -0
  81. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/object_cache.py +0 -0
  82. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/py.typed +0 -0
  83. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/reliability/async_metrics.py +0 -0
  84. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/reliability/error_classification.py +0 -0
  85. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/reliability/load_control.py +0 -0
  86. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/serializers/__init__.py +0 -0
  87. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/serializers/arrow_serializer.py +0 -0
  88. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/serializers/auto_serializer.py +0 -0
  89. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/serializers/base.py +0 -0
  90. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/serializers/encryption_wrapper.py +0 -0
  91. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/serializers/interop_serializer.py +0 -0
  92. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/serializers/orjson_serializer.py +0 -0
  93. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/serializers/standard_serializer.py +0 -0
  94. {cachekit-0.14.0 → cachekit-0.15.0}/src/cachekit/serializers/wrapper.py +0 -0
@@ -271,7 +271,7 @@ dependencies = [
271
271
 
272
272
  [[package]]
273
273
  name = "cachekit-rs"
274
- version = "0.14.0"
274
+ version = "0.15.0"
275
275
  dependencies = [
276
276
  "cachekit-core",
277
277
  "criterion",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cachekit
3
- Version: 0.14.0
3
+ Version: 0.15.0
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -22,7 +22,6 @@ Classifier: Typing :: Typed
22
22
  Requires-Dist: redis[hiredis]>=4.0.0
23
23
  Requires-Dist: pydantic>=2.0.0
24
24
  Requires-Dist: pydantic-settings>=2.0.0
25
- Requires-Dist: tenacity>=8.0.0
26
25
  Requires-Dist: prometheus-client>=0.22.1
27
26
  Requires-Dist: psutil>=7.0.0
28
27
  Requires-Dist: blake3>=1.0.5
@@ -101,7 +100,6 @@ That's it. You get:
101
100
  | **Prometheus metrics** | Built-in observability |
102
101
  | **MessagePack serialization** | Efficient with optional compression |
103
102
  | **Zero-knowledge encryption** | Client-side AES-256-GCM |
104
- | **Adaptive timeouts** | Auto-tune to system load |
105
103
 
106
104
  ---
107
105
 
@@ -220,7 +218,6 @@ def get_user_profile(user_id: int):
220
218
  | Feature | `@cache.minimal` | `@cache.dev` | `@cache.test` | `@cache.production` | `@cache.secure` |
221
219
  |:--------|:----------------:|:------------:|:-------------:|:-------------------:|:---------------:|
222
220
  | Circuit Breaker | - | ✅ | - | ✅ | ✅ |
223
- | Adaptive Timeouts | - | ✅ | - | ✅ | ✅ |
224
221
  | Backpressure | ✅ | ✅ | - | ✅ | ✅ |
225
222
  | Integrity Checking | - | ✅ | - | ✅ | ✅ 🔒 |
226
223
  | Encryption | - | - | - | - | ✅ Required |
@@ -456,7 +453,6 @@ info = expensive_func.cache_info()
456
453
  | [Distributed Locking][distributed-locking-url] | Cache stampede prevention |
457
454
  | [Prometheus Metrics][prometheus-url] | Built-in observability |
458
455
  | [Zero-Knowledge Encryption][encryption-url] | Client-side security |
459
- | [Adaptive Timeouts][adaptive-timeouts-url] | Auto-tune to infrastructure |
460
456
 
461
457
  ---
462
458
 
@@ -539,7 +535,6 @@ MIT License - see [LICENSE][license-file-url] for details.
539
535
  [distributed-locking-url]: docs/features/distributed-locking.md
540
536
  [prometheus-url]: docs/features/prometheus-metrics.md
541
537
  [encryption-url]: docs/features/zero-knowledge-encryption.md
542
- [adaptive-timeouts-url]: docs/features/adaptive-timeouts.md
543
538
  [contributing-url]: CONTRIBUTING.md
544
539
  [license-file-url]: LICENSE
545
540
  [github-url]: https://github.com/cachekit-io/cachekit-py
@@ -47,7 +47,6 @@ That's it. You get:
47
47
  | **Prometheus metrics** | Built-in observability |
48
48
  | **MessagePack serialization** | Efficient with optional compression |
49
49
  | **Zero-knowledge encryption** | Client-side AES-256-GCM |
50
- | **Adaptive timeouts** | Auto-tune to system load |
51
50
 
52
51
  ---
53
52
 
@@ -166,7 +165,6 @@ def get_user_profile(user_id: int):
166
165
  | Feature | `@cache.minimal` | `@cache.dev` | `@cache.test` | `@cache.production` | `@cache.secure` |
167
166
  |:--------|:----------------:|:------------:|:-------------:|:-------------------:|:---------------:|
168
167
  | Circuit Breaker | - | ✅ | - | ✅ | ✅ |
169
- | Adaptive Timeouts | - | ✅ | - | ✅ | ✅ |
170
168
  | Backpressure | ✅ | ✅ | - | ✅ | ✅ |
171
169
  | Integrity Checking | - | ✅ | - | ✅ | ✅ 🔒 |
172
170
  | Encryption | - | - | - | - | ✅ Required |
@@ -402,7 +400,6 @@ info = expensive_func.cache_info()
402
400
  | [Distributed Locking][distributed-locking-url] | Cache stampede prevention |
403
401
  | [Prometheus Metrics][prometheus-url] | Built-in observability |
404
402
  | [Zero-Knowledge Encryption][encryption-url] | Client-side security |
405
- | [Adaptive Timeouts][adaptive-timeouts-url] | Auto-tune to infrastructure |
406
403
 
407
404
  ---
408
405
 
@@ -485,7 +482,6 @@ MIT License - see [LICENSE][license-file-url] for details.
485
482
  [distributed-locking-url]: docs/features/distributed-locking.md
486
483
  [prometheus-url]: docs/features/prometheus-metrics.md
487
484
  [encryption-url]: docs/features/zero-knowledge-encryption.md
488
- [adaptive-timeouts-url]: docs/features/adaptive-timeouts.md
489
485
  [contributing-url]: CONTRIBUTING.md
490
486
  [license-file-url]: LICENSE
491
487
  [github-url]: https://github.com/cachekit-io/cachekit-py
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "cachekit"
7
- version = "0.14.0"
7
+ version = "0.15.0"
8
8
  description = "Production-ready Redis caching for Python with intelligent reliability features and Rust-powered performance"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
@@ -57,8 +57,6 @@ dependencies = [
57
57
  # Configuration and validation
58
58
  "pydantic>=2.0.0",
59
59
  "pydantic-settings>=2.0.0",
60
- # Error handling
61
- "tenacity>=8.0.0",
62
60
  # Monitoring and observability
63
61
  "prometheus-client>=0.22.1",
64
62
  "psutil>=7.0.0",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "cachekit-rs"
3
- version = "0.14.0"
3
+ version = "0.15.0"
4
4
  edition = "2021"
5
5
  authors = ["cachekit Contributors"]
6
6
  description = "High-performance storage engine for caching with compression and encryption"
@@ -47,7 +47,6 @@ That's it. You get:
47
47
  | **Prometheus metrics** | Built-in observability |
48
48
  | **MessagePack serialization** | Efficient with optional compression |
49
49
  | **Zero-knowledge encryption** | Client-side AES-256-GCM |
50
- | **Adaptive timeouts** | Auto-tune to system load |
51
50
 
52
51
  ---
53
52
 
@@ -166,7 +165,6 @@ def get_user_profile(user_id: int):
166
165
  | Feature | `@cache.minimal` | `@cache.dev` | `@cache.test` | `@cache.production` | `@cache.secure` |
167
166
  |:--------|:----------------:|:------------:|:-------------:|:-------------------:|:---------------:|
168
167
  | Circuit Breaker | - | ✅ | - | ✅ | ✅ |
169
- | Adaptive Timeouts | - | ✅ | - | ✅ | ✅ |
170
168
  | Backpressure | ✅ | ✅ | - | ✅ | ✅ |
171
169
  | Integrity Checking | - | ✅ | - | ✅ | ✅ 🔒 |
172
170
  | Encryption | - | - | - | - | ✅ Required |
@@ -402,7 +400,6 @@ info = expensive_func.cache_info()
402
400
  | [Distributed Locking][distributed-locking-url] | Cache stampede prevention |
403
401
  | [Prometheus Metrics][prometheus-url] | Built-in observability |
404
402
  | [Zero-Knowledge Encryption][encryption-url] | Client-side security |
405
- | [Adaptive Timeouts][adaptive-timeouts-url] | Auto-tune to infrastructure |
406
403
 
407
404
  ---
408
405
 
@@ -485,7 +482,6 @@ MIT License - see [LICENSE][license-file-url] for details.
485
482
  [distributed-locking-url]: docs/features/distributed-locking.md
486
483
  [prometheus-url]: docs/features/prometheus-metrics.md
487
484
  [encryption-url]: docs/features/zero-knowledge-encryption.md
488
- [adaptive-timeouts-url]: docs/features/adaptive-timeouts.md
489
485
  [contributing-url]: CONTRIBUTING.md
490
486
  [license-file-url]: LICENSE
491
487
  [github-url]: https://github.com/cachekit-io/cachekit-py
@@ -9,7 +9,6 @@ Supports pluggable backends: Redis (default), CachekitIO SaaS, File, and custom.
9
9
  Key Features:
10
10
  - **Intelligent @cache decorator** with auto-detection and intent-based optimization
11
11
  - **Circuit breaker protection** against cascading failures
12
- - **Adaptive timeout adjustment** based on historical backend latency patterns
13
12
  - **Backpressure control** to prevent backend overload
14
13
  - **Connection pooling** for optimized performance
15
14
  - **Health check methods** for comprehensive monitoring
@@ -68,7 +67,7 @@ Example Usage:
68
67
  ```
69
68
  """
70
69
 
71
- __version__ = "0.14.0"
70
+ __version__ = "0.15.0"
72
71
 
73
72
  from collections.abc import Callable
74
73
  from typing import Any, TypeVar
@@ -289,8 +289,8 @@ class TimeoutConfigurableBackend(Protocol):
289
289
  """Optional protocol for per-operation timeout configuration.
290
290
 
291
291
  Backends implementing this protocol allow fine-grained timeout control
292
- per operation. This enables features like adaptive timeouts that adjust
293
- based on operation latency.
292
+ per operation, so a caller can set an explicit timeout for a single
293
+ operation where the backend supports it.
294
294
 
295
295
  All backends support some timeout mechanism, but granularity varies:
296
296
  - Per-operation: HTTP, DynamoDB, PostgreSQL
@@ -34,6 +34,7 @@ from cachekit.serializers.encryption_wrapper import DecryptionAuthenticationErro
34
34
  from cachekit.serializers.wrapper import SerializationWrapper
35
35
 
36
36
  if TYPE_CHECKING:
37
+ from cachekit.reliability.load_control import BackpressureController
37
38
  from cachekit.serializers.base import SerializerProtocol
38
39
 
39
40
  # Serializer string names whose wire format is language-agnostic and therefore safe to
@@ -1681,25 +1682,26 @@ class StandardCacheHandler:
1681
1682
  def __init__(
1682
1683
  self,
1683
1684
  backend: BaseBackend,
1684
- timeout_provider=None,
1685
- backpressure_controller=None,
1686
- ttl_refresh_threshold=0.5,
1685
+ backpressure_controller: BackpressureController | None = None,
1686
+ ttl_refresh_threshold: float = 0.5,
1687
1687
  ):
1688
1688
  """Initialize with backend and optional features.
1689
1689
 
1690
1690
  Args:
1691
1691
  backend: Backend instance (implements BaseBackend protocol)
1692
- timeout_provider: Optional callable that returns timeout value
1693
1692
  backpressure_controller: Optional BackpressureController for request limiting
1694
1693
  ttl_refresh_threshold: Threshold for TTL refresh (0.0-1.0, default 0.5 = 50%)
1695
1694
  """
1696
1695
  self.backend = backend
1697
- self.timeout_provider = timeout_provider
1698
1696
  self.backpressure_controller = backpressure_controller
1699
1697
  self.ttl_refresh_threshold = ttl_refresh_threshold
1700
1698
 
1701
1699
  def _with_backpressure_and_timeout(self, operation, *args, **kwargs):
1702
- """Execute operation with backpressure control and adaptive timeout."""
1700
+ """Execute operation under backpressure control.
1701
+
1702
+ Operation timeouts are enforced at the backend connection layer
1703
+ (e.g. redis-py socket_timeout), not here.
1704
+ """
1703
1705
  if self.backpressure_controller:
1704
1706
  # Apply backpressure control first
1705
1707
  with self.backpressure_controller.acquire():
@@ -17,7 +17,6 @@ from .nested import (
17
17
  EncryptionConfig,
18
18
  L1CacheConfig,
19
19
  MonitoringConfig,
20
- TimeoutConfig,
21
20
  )
22
21
  from .settings import CachekitConfig
23
22
 
@@ -37,7 +36,6 @@ __all__ = [
37
36
  "EncryptionConfig",
38
37
  "L1CacheConfig",
39
38
  "MonitoringConfig",
40
- "TimeoutConfig",
41
39
  # Backend management
42
40
  "set_default_backend",
43
41
  "get_default_backend",
@@ -17,7 +17,6 @@ from .nested import (
17
17
  EncryptionConfig,
18
18
  L1CacheConfig,
19
19
  MonitoringConfig,
20
- TimeoutConfig,
21
20
  )
22
21
  from .validation import ConfigurationError
23
22
 
@@ -180,7 +179,6 @@ class DecoratorConfig:
180
179
  backend: L2 backend (RedisBackend, HTTPBackend, None for L1-only)
181
180
  l1: L1 in-memory cache configuration
182
181
  circuit_breaker: Circuit breaker configuration
183
- timeout: Adaptive timeout configuration
184
182
  backpressure: Backpressure configuration
185
183
  monitoring: Monitoring and observability configuration
186
184
  encryption: Client-side encryption configuration
@@ -212,10 +210,9 @@ class DecoratorConfig:
212
210
  # Backend abstraction (1 field)
213
211
  backend: BaseBackend | None = None # L2 backend: RedisBackend, HTTPBackend (future), None (L1-only)
214
212
 
215
- # Nested configuration groups (6 groups)
213
+ # Nested configuration groups (5 groups)
216
214
  l1: L1CacheConfig = field(default_factory=L1CacheConfig)
217
215
  circuit_breaker: CircuitBreakerConfig = field(default_factory=CircuitBreakerConfig)
218
- timeout: TimeoutConfig = field(default_factory=TimeoutConfig)
219
216
  backpressure: BackpressureConfig = field(default_factory=BackpressureConfig)
220
217
  monitoring: MonitoringConfig = field(default_factory=MonitoringConfig)
221
218
  encryption: EncryptionConfig = field(default_factory=EncryptionConfig)
@@ -264,7 +261,6 @@ class DecoratorConfig:
264
261
  # Validate nested configs
265
262
  self.l1.validate()
266
263
  self.circuit_breaker.validate()
267
- self.timeout.validate()
268
264
  self.backpressure.validate()
269
265
  self.monitoring.validate()
270
266
  self.encryption.validate()
@@ -296,13 +292,6 @@ class DecoratorConfig:
296
292
  "recovery_timeout": self.circuit_breaker.recovery_timeout,
297
293
  "half_open_requests": self.circuit_breaker.half_open_requests,
298
294
  "excluded_exceptions": self.circuit_breaker.excluded_exceptions,
299
- # Timeout (flattened)
300
- "adaptive_timeout": self.timeout.enabled,
301
- "initial_timeout": self.timeout.initial,
302
- "min_timeout": self.timeout.min,
303
- "max_timeout": self.timeout.max,
304
- "timeout_window_size": self.timeout.window_size,
305
- "timeout_percentile": self.timeout.percentile,
306
295
  # Backpressure (flattened)
307
296
  "backpressure": self.backpressure.enabled,
308
297
  "max_concurrent_requests": self.backpressure.max_concurrent_requests,
@@ -326,7 +315,7 @@ class DecoratorConfig:
326
315
  """Minimal protections profile: Maximum throughput, minimal overhead.
327
316
 
328
317
  Use cases: Read-heavy workloads, non-critical caching, high-performance scenarios
329
- Trade-offs: Circuit breaker disabled, adaptive timeout disabled, no monitoring, NO integrity checking
318
+ Trade-offs: Circuit breaker disabled, no monitoring, NO integrity checking
330
319
 
331
320
  Note: Backend resolved from REDIS_URL env var, set_default_backend(), or explicit backend= kwarg
332
321
 
@@ -352,7 +341,6 @@ class DecoratorConfig:
352
341
  namespace_index=False,
353
342
  ),
354
343
  circuit_breaker=CircuitBreakerConfig(enabled=False),
355
- timeout=TimeoutConfig(enabled=False),
356
344
  backpressure=BackpressureConfig(enabled=True),
357
345
  monitoring=MonitoringConfig(
358
346
  collect_stats=False,
@@ -368,7 +356,7 @@ class DecoratorConfig:
368
356
  """Production profile: All protections enabled, full observability, integrity checking ON.
369
357
 
370
358
  Use cases: Payment systems, APIs, production services, critical workloads
371
- Trade-offs: Additional latency from circuit breaker, timeout checks, monitoring, integrity validation
359
+ Trade-offs: Additional latency from circuit breaker, monitoring, integrity validation
372
360
 
373
361
  Note: Backend resolved from REDIS_URL env var, set_default_backend(), or explicit backend= kwarg
374
362
 
@@ -394,7 +382,6 @@ class DecoratorConfig:
394
382
  namespace_index=True,
395
383
  ),
396
384
  circuit_breaker=CircuitBreakerConfig(enabled=True),
397
- timeout=TimeoutConfig(enabled=True),
398
385
  backpressure=BackpressureConfig(enabled=True),
399
386
  monitoring=MonitoringConfig(
400
387
  collect_stats=True,
@@ -469,7 +456,6 @@ class DecoratorConfig:
469
456
  fail_closed=fail_closed,
470
457
  ),
471
458
  circuit_breaker=CircuitBreakerConfig(enabled=True),
472
- timeout=TimeoutConfig(enabled=True),
473
459
  backpressure=BackpressureConfig(enabled=True),
474
460
  monitoring=MonitoringConfig(
475
461
  collect_stats=True,
@@ -511,7 +497,6 @@ class DecoratorConfig:
511
497
  namespace_index=False,
512
498
  ),
513
499
  circuit_breaker=CircuitBreakerConfig(enabled=True),
514
- timeout=TimeoutConfig(enabled=True),
515
500
  backpressure=BackpressureConfig(enabled=True),
516
501
  monitoring=MonitoringConfig(
517
502
  collect_stats=True,
@@ -527,7 +512,7 @@ class DecoratorConfig:
527
512
  """Testing profile: Deterministic, all protections disabled, no monitoring, no integrity checking.
528
513
 
529
514
  Use cases: Unit tests, integration tests (with fakeredis)
530
- Trade-offs: No circuit breaker, no adaptive timeout, no stats, no integrity (reproducible, fast)
515
+ Trade-offs: No circuit breaker, no stats, no integrity (reproducible, fast)
531
516
 
532
517
  Note: Backend resolved from REDIS_URL env var, set_default_backend(), or explicit backend= kwarg
533
518
 
@@ -553,7 +538,6 @@ class DecoratorConfig:
553
538
  namespace_index=False,
554
539
  ),
555
540
  circuit_breaker=CircuitBreakerConfig(enabled=False),
556
- timeout=TimeoutConfig(enabled=False),
557
541
  backpressure=BackpressureConfig(enabled=False),
558
542
  monitoring=MonitoringConfig(
559
543
  collect_stats=False,
@@ -628,7 +612,6 @@ class DecoratorConfig:
628
612
  namespace_index=True,
629
613
  ),
630
614
  circuit_breaker=CircuitBreakerConfig(enabled=True),
631
- timeout=TimeoutConfig(enabled=True),
632
615
  backpressure=BackpressureConfig(enabled=True),
633
616
  monitoring=MonitoringConfig(
634
617
  collect_stats=True,
@@ -135,64 +135,6 @@ class CircuitBreakerConfig:
135
135
  raise ConfigurationError(f"half_open_requests must be >= 1, got {self.half_open_requests}")
136
136
 
137
137
 
138
- @dataclass(frozen=True)
139
- class TimeoutConfig:
140
- """Adaptive timeout configuration.
141
-
142
- Adaptive timeout dynamically adjusts request timeouts based on observed
143
- latency percentiles, preventing both premature timeouts and excessive waiting.
144
-
145
- Attributes:
146
- enabled: Enable adaptive timeout (default: True)
147
- initial: Initial timeout in seconds (default: 1.0)
148
- min: Minimum timeout in seconds (default: 0.1)
149
- max: Maximum timeout in seconds (default: 5.0)
150
- window_size: Number of requests in sliding window for percentile calculation (default: 1000)
151
- percentile: Target percentile for timeout calculation (default: 95.0)
152
-
153
- Examples:
154
- Create with defaults:
155
-
156
- >>> config = TimeoutConfig()
157
- >>> config.initial
158
- 1.0
159
- >>> config.min
160
- 0.1
161
- >>> config.max
162
- 5.0
163
-
164
- Custom timeout range:
165
-
166
- >>> custom = TimeoutConfig(min=0.5, initial=2.0, max=10.0)
167
- >>> custom.validate() # No error = valid
168
-
169
- Invalid range (initial must be between min and max):
170
-
171
- >>> TimeoutConfig(min=1.0, initial=0.5, max=5.0).validate() # doctest: +IGNORE_EXCEPTION_DETAIL
172
- Traceback (most recent call last):
173
- ...
174
- cachekit.config.validation.ConfigurationError: Timeout must satisfy: min (1.0) <= initial (0.5) <= max (5.0)
175
- """
176
-
177
- enabled: bool = True
178
- initial: float = 1.0
179
- min: float = 0.1
180
- max: float = 5.0
181
- window_size: int = 1000
182
- percentile: float = 95.0
183
-
184
- def validate(self) -> None:
185
- """Validate adaptive timeout configuration.
186
-
187
- Raises:
188
- ConfigurationError: If timeout values are inconsistent
189
- """
190
- if not self.min <= self.initial <= self.max:
191
- raise ConfigurationError(f"Timeout must satisfy: min ({self.min}) <= initial ({self.initial}) <= max ({self.max})")
192
- if not 0.0 < self.percentile <= 100.0:
193
- raise ConfigurationError(f"percentile must be 0.0-100.0, got {self.percentile}")
194
-
195
-
196
138
  @dataclass(frozen=True)
197
139
  class BackpressureConfig:
198
140
  """Backpressure configuration for overload protection.
@@ -66,8 +66,6 @@ def cache(
66
66
  >>> config = DecoratorConfig.production(ttl=600, backend=None)
67
67
  >>> config.circuit_breaker.enabled
68
68
  True
69
- >>> config.timeout.enabled
70
- True
71
69
 
72
70
  Intent-based secure (security-critical with encryption):
73
71
  >>> config = DecoratorConfig.secure(
@@ -8,7 +8,6 @@ from ..monitoring.pool_monitor import OptimizedPoolMonitor
8
8
 
9
9
  # Import EXISTING modules - no duplication
10
10
  from ..reliability import (
11
- AdaptiveTimeout,
12
11
  AsyncMetricsCollector,
13
12
  BackpressureController,
14
13
  CircuitBreaker,
@@ -29,7 +28,6 @@ class FeatureOrchestrator:
29
28
  >>> orch = FeatureOrchestrator(
30
29
  ... namespace="test",
31
30
  ... circuit_breaker_enabled=False,
32
- ... adaptive_timeout_enabled=False,
33
31
  ... backpressure_enabled=False,
34
32
  ... )
35
33
  >>> orch.namespace
@@ -60,24 +58,20 @@ class FeatureOrchestrator:
60
58
  self,
61
59
  namespace: str,
62
60
  circuit_breaker_enabled: bool = True,
63
- adaptive_timeout_enabled: bool = True,
64
61
  backpressure_enabled: bool = True,
65
62
  collect_stats: bool = True,
66
63
  enable_structured_logging: bool = True,
67
64
  circuit_breaker_config: Optional[dict[str, Any]] = None,
68
- adaptive_timeout_config: Optional[dict[str, Any]] = None,
69
65
  backpressure_config: Optional[dict[str, Any]] = None,
70
66
  ):
71
67
  self.namespace = namespace
72
68
  self._circuit_breaker_enabled = circuit_breaker_enabled
73
- self._adaptive_timeout_enabled = adaptive_timeout_enabled
74
69
  self._backpressure_enabled = backpressure_enabled
75
70
  self._collect_stats = collect_stats
76
71
  self._enable_structured_logging = enable_structured_logging
77
72
 
78
73
  # Initialize EXISTING modules
79
74
  self._circuit_breaker = None
80
- self._adaptive_timeout = None
81
75
  self._load_control = None
82
76
  self._metrics_collector = None
83
77
  self._correlation_tracker = None
@@ -99,9 +93,6 @@ class FeatureOrchestrator:
99
93
  # Already a CircuitBreakerConfig object
100
94
  self._circuit_breaker = CircuitBreaker(config=circuit_breaker_config, namespace=namespace)
101
95
 
102
- if adaptive_timeout_enabled:
103
- self._adaptive_timeout = AdaptiveTimeout(**(adaptive_timeout_config or {}))
104
-
105
96
  if backpressure_enabled:
106
97
  self._load_control = BackpressureController(**(backpressure_config or {}))
107
98
 
@@ -119,11 +110,6 @@ class FeatureOrchestrator:
119
110
  """Get circuit breaker if enabled."""
120
111
  return self._circuit_breaker
121
112
 
122
- @property
123
- def adaptive_timeout(self) -> Optional[AdaptiveTimeout]:
124
- """Get adaptive timeout if enabled."""
125
- return self._adaptive_timeout
126
-
127
113
  @property
128
114
  def load_control(self) -> Optional[BackpressureController]:
129
115
  """Get load control if enabled."""
@@ -170,15 +156,6 @@ class FeatureOrchestrator:
170
156
  # For now, always return True and let acquire handle backpressure
171
157
  return True
172
158
 
173
- def get_timeout(self, operation_type: str = "default") -> float:
174
- """Get current timeout for operation type."""
175
- # Guard clause: No adaptive timeout means use default
176
- if not self._adaptive_timeout:
177
- return 5.0 # Default timeout
178
-
179
- # AdaptiveTimeout.get_timeout() doesn't take arguments
180
- return self._adaptive_timeout.get_timeout()
181
-
182
159
  def start_request(self) -> Optional[str]:
183
160
  """Start request tracking."""
184
161
  # Note: BackpressureController uses acquire() context manager, not start_request()
@@ -399,26 +376,6 @@ class FeatureOrchestrator:
399
376
  hit=hit,
400
377
  )
401
378
 
402
- def record_duration(self, duration: float):
403
- """Record operation duration."""
404
- # AdaptiveTimeout doesn't have record_success method, just skip for now
405
- pass
406
-
407
- def get_adaptive_lock_timeouts(self):
408
- """Get adaptive lock timeouts if available."""
409
- return None # Return None to use defaults
410
-
411
- def record_lock_operation(self, duration: float, success: bool):
412
- """Record lock operation performance."""
413
- if self._metrics_collector:
414
- self._metrics_collector.record_cache_operation(
415
- operation="lock",
416
- namespace=self.namespace,
417
- serializer="rust",
418
- success=success,
419
- duration_ms=duration * 1000,
420
- )
421
-
422
379
  def check_health(self) -> dict[str, Any]:
423
380
  """Check health status - returns simplified status format."""
424
381
  full_status = self.get_health_status()