This commit includes all the work on hitless upgrades with the addition
of:
- Pubsub Pool
- Examples
- Refactor of push
- Refactor of pool (using atomics for most things)
- Introducing of hooks in pool
* Fix hard code of failing timeout
1. if not set failing time limit, default is 15 seconds.
* feat: Complete configurable FailingTimeoutSeconds implementation
---------
Co-authored-by: Shino Wu <shino_wu@trendmicro.com>
Convert HandlerContext from struct to interface with strongly typed getters
for different client types. This provides better type safety and a cleaner
API for push notification handlers while maintaining flexibility.
Key Changes:
1. HandlerContext Interface Design:
- Converted HandlerContext from struct to interface
- Added strongly typed getters for different client types
- GetClusterClient() returns ClusterClientInterface
- GetSentinelClient() returns SentinelClientInterface
- GetFailoverClient() returns FailoverClientInterface
- GetRegularClient() returns RegularClientInterface
- GetPubSub() returns PubSubInterface
2. Client Type Interfaces:
- Defined ClusterClientInterface for cluster client access
- Defined SentinelClientInterface for sentinel client access
- Defined FailoverClientInterface for failover client access
- Defined RegularClientInterface for regular client access
- Defined PubSubInterface for pub/sub access
- Each interface provides String() method for basic operations
3. Concrete Implementation:
- Created handlerContext struct implementing HandlerContext interface
- Added NewHandlerContext constructor function
- Implemented type-safe getters with interface casting
- Returns nil for incorrect client types (type safety)
4. Updated All Usage:
- Updated Handler interface to use HandlerContext interface
- Updated ProcessorInterface to use HandlerContext interface
- Updated all processor implementations (Processor, VoidProcessor)
- Updated all handler context creation sites
- Updated test handlers and test context creation
5. Helper Methods:
- Updated pushNotificationHandlerContext() in baseClient
- Updated pushNotificationHandlerContext() in PubSub
- Consistent context creation across all client types
- Proper parameter passing for different connection types
6. Type Safety Benefits:
- Handlers can safely cast to specific client types
- Compile-time checking for client type access
- Clear API for accessing different client capabilities
- No runtime panics from incorrect type assertions
7. API Usage Example:
```go
func (h *MyHandler) HandlePushNotification(
ctx context.Context,
handlerCtx HandlerContext,
notification []interface{},
) bool {
// Strongly typed access
if clusterClient := handlerCtx.GetClusterClient(); clusterClient != nil {
// Handle cluster-specific logic
}
if sentinelClient := handlerCtx.GetSentinelClient(); sentinelClient != nil {
// Handle sentinel-specific logic
}
return true
}
```
8. Backward Compatibility:
- Interface maintains same functionality as original struct
- All existing handler patterns continue to work
- No breaking changes to handler implementations
- Smooth migration path for existing code
Benefits:
- Strong type safety for client access in handlers
- Clear API with explicit client type getters
- Compile-time checking prevents runtime errors
- Flexible interface allows future extensions
- Better separation of concerns between client types
- Enhanced developer experience with IntelliSense support
This enhancement provides handlers with strongly typed access to different
Redis client types while maintaining the flexibility and context information
needed for sophisticated push notification handling, particularly important
for hitless upgrades and cluster management operations.
- Add VoidPushNotificationProcessor that reads and discards push notifications
- Create PushNotificationProcessorInterface for consistent behavior
- Always provide a processor (real or void) instead of nil
- VoidPushNotificationProcessor properly cleans RESP3 push notifications from buffer
- Remove all nil checks throughout codebase for cleaner, safer code
- Update tests to expect VoidPushNotificationProcessor when disabled
Benefits:
- Eliminates nil pointer risks throughout the codebase
- Follows null object pattern for safer operation
- Properly handles RESP3 push notifications even when disabled
- Consistent interface regardless of push notification settings
- Cleaner code without defensive nil checks everywhere
- Add PushNotificationProcessor field to pool.Conn for connection-level processing
- Modify connection pool Put() and isHealthyConn() to handle push notifications
- Process pending push notifications before discarding connections
- Pass push notification processor to connections during creation
- Update connection pool options to include push notification processor
- Add comprehensive test for connection health check integration
This prevents connections with buffered push notification data from being
incorrectly discarded by the connection health check, ensuring push
notifications are properly processed and connections are reused.
- Remove all global push notification handler functionality
- Simplify registry to support only single handler per notification type
- Enable push notifications by default for RESP3 connections
- Update comprehensive test suite to remove global handler tests
- Update demo to show multiple specific handlers instead of global handlers
- Always respect custom processors regardless of PushNotifications flag
Push notifications are now automatically enabled for RESP3 and each
notification type has a single dedicated handler for predictable behavior.
- Add PushNotificationRegistry for managing notification handlers
- Add PushNotificationProcessor for processing RESP3 push notifications
- Add client methods for registering push notification handlers
- Add PubSub integration for handling generic push notifications
- Add comprehensive test suite with 100% coverage
- Add push notification demo example
This system allows handling any arbitrary RESP3 push notification
with registered handlers, not just specific notification types.
* wip
* update documentation
* add streamingcredentialsprovider in options
* fix: put back option in pool creation
* add package level comment
* Initial re authentication implementation
Introduces the StreamingCredentialsProvider as the CredentialsProvider
with the highest priority.
TODO: needs to be tested
* Change function type name
Change CancelProviderFunc to UnsubscribeFunc
* add tests
* fix race in tests
* fix example tests
* wip, hooks refactor
* fix build
* update README.md
* update wordlist
* update README.md
* refactor(auth): early returns in cred listener
* fix(doctest): simulate some delay
* feat(conn): add close hook on conn
* fix(tests): simulate start/stop in mock credentials provider
* fix(auth): don't double close the conn
* docs(README): mark streaming credentials provider as experimental
* fix(auth): streamline auth err proccess
* fix(auth): check err on close conn
* chore(entraid): use the repo under redis org
* chore: set the default value for the `options.protocol` in the `init()` of `options`
Signed-off-by: fukua95 <fukua95@gmail.com>
* add a test
Signed-off-by: fukua95 <fukua95@gmail.com>
---------
Signed-off-by: fukua95 <fukua95@gmail.com>
* migrate golangci-lint config to v2 format
* chore: skip CI on migration [skip ci]
* Bump golangci version
* Address several golangci-lint/staticcheck warnings
* change staticchecks settings
* fix: handle network error on SETINFO
This fix addresses potential out of order responses as described in `CVE-2025-29923`
* fix: deprecate DisableIndentity and introduce DisableIdentity
Both options will work before V10. In v10 DisableIndentity will be dropped. The preferred flag to use is `DisableIdentity`.
* fix: add unstableresp3 to cluster client
* propagate unstableresp3
* proper test that will ignore error, but fail if client panics
* add separate test for clusterclient constructor
* Added the ability to set a connection growth limit when there are not enough connections in the pool using MaxActiveConns
* fix comment
* fix
* fix
---------
Co-authored-by: ofekshenawa <104765379+ofekshenawa@users.noreply.github.com>
* Update CLIENT-SETINFO to support suffixes
* Update CLIENT-SETINFO
* fix acl log test
* add setinfo option to cluster
* change to DisableIndentity
* change to DisableIndentity