Compare commits

...

9 Commits

Author SHA1 Message Date
Juan Calderon-Perez
9951538c9e Normalize Rueidis README indentation 2025-10-13 21:33:50 -04:00
Juan Calderon-Perez
50d99b709c Align Rueidis README indentation 2025-10-13 21:33:34 -04:00
Juan Calderon-Perez
02a5e617ae Fix Rueidis README indentation 2025-10-13 21:33:16 -04:00
Juan Calderon-Perez
2fdcd6aba5 Handle rueidis startup check failures 2025-10-13 21:33:01 -04:00
Juan Calderon-Perez
c285284184 Fix rueidis startup check handling and revert mysql changes 2025-10-13 18:33:06 -04:00
Juan Calderon-Perez
75a86506f7 Revert rueidis lazy initialization 2025-10-13 17:51:07 -04:00
Juan Calderon-Perez
1782bd5841 Avoid rueidis panic when startup checks disabled 2025-10-13 17:51:01 -04:00
Juan Calderon-Perez
5652ca01b7 Add DisableStartupCheck support to Rueidis driver 2025-10-13 13:37:29 -04:00
Juan Calderon-Perez
92da8e1d90 Revert DisableStartupCheck changes for select drivers 2025-10-13 13:13:36 -04:00
16 changed files with 271 additions and 139 deletions

View File

@@ -73,6 +73,11 @@ type Config struct {
//
// Optional. Default is false
Reset bool
// DisableStartupCheck skips the initial connection validation during New.
//
// Optional. Default is false
DisableStartupCheck bool
}
```
@@ -80,5 +85,6 @@ type Config struct {
```go
var ConfigDefault = Config{
Servers: "127.0.0.1:11211",
DisableStartupCheck: false,
}
```

View File

@@ -15,6 +15,11 @@ type Config struct {
// Optional. Default is false
Reset bool
// DisableStartupCheck skips the initial connection validation during New.
//
// Optional. Default is false
DisableStartupCheck bool
// The socket read/write timeout.
//
// Optional. Default is 100 * time.Millisecond
@@ -34,6 +39,7 @@ var ConfigDefault = Config{
Servers: "127.0.0.1:11211",
timeout: 100 * time.Millisecond,
maxIdleConns: 2,
DisableStartupCheck: false,
}
// Helper function to set default values

View File

@@ -30,6 +30,7 @@ func New(config ...Config) *Storage {
db.Timeout = cfg.timeout
db.MaxIdleConns = cfg.maxIdleConns
if !cfg.DisableStartupCheck {
// Ping database to ensure a connection has been made
if err := db.Ping(); err != nil {
panic(err)
@@ -40,6 +41,7 @@ func New(config ...Config) *Storage {
panic(err)
}
}
}
// Create storage
store := &Storage{

View File

@@ -178,6 +178,16 @@ func Test_Memcache_Reset(t *testing.T) {
require.Zero(t, len(result))
}
func Test_Memcache_New_DisableStartupCheck(t *testing.T) {
require.NotPanics(t, func() {
store := New(Config{
Servers: "127.0.0.1:11210",
DisableStartupCheck: true,
})
require.NotNil(t, store)
})
}
func Test_Memcache_Close(t *testing.T) {
testStore := newTestStore(t)
require.Nil(t, testStore.Close())

View File

@@ -117,6 +117,11 @@ type Config struct {
// Optional. Default is false
Reset bool
// DisableStartupCheck skips the initial connection validation during New.
//
// Optional. Default is false
DisableStartupCheck bool
// Time before deleting expired keys
//
// Optional. Default is 10 * time.Second
@@ -135,6 +140,7 @@ var ConfigDefault = Config{
Table: "fiber_storage",
SSLMode: "disable",
Reset: false,
DisableStartupCheck: false,
GCInterval: 10 * time.Second,
}
```

View File

@@ -61,6 +61,11 @@ type Config struct {
// Optional. Default is false
Reset bool
// DisableStartupCheck skips the initial connection validation during New.
//
// Optional. Default is false
DisableStartupCheck bool
// Time before deleting expired keys
//
// Optional. Default is 10 * time.Second
@@ -76,6 +81,7 @@ var ConfigDefault = Config{
Table: "fiber_storage",
SSLMode: "disable",
Reset: false,
DisableStartupCheck: false,
GCInterval: 10 * time.Second,
}

View File

@@ -68,6 +68,7 @@ func New(config ...Config) *Storage {
}
}
if !cfg.DisableStartupCheck {
// Ping database
if err := db.Ping(context.Background()); err != nil {
panic(err)
@@ -108,6 +109,7 @@ func New(config ...Config) *Storage {
}
}
}
}
// Create storage
store := &Storage{
@@ -121,7 +123,9 @@ func New(config ...Config) *Storage {
sqlGC: fmt.Sprintf("DELETE FROM %s WHERE e <= $1 AND e != 0", cfg.Table),
}
if !cfg.DisableStartupCheck {
store.checkSchema(cfg.Table)
}
// Start garbage collector
go store.gcTicker()

View File

@@ -202,6 +202,18 @@ func TestNoCreateUser(t *testing.T) {
})
}
func Test_Postgres_New_DisableStartupCheck(t *testing.T) {
require.NotPanics(t, func() {
store := New(Config{
Host: "127.0.0.1",
Port: 65432,
DisableStartupCheck: true,
})
require.NotNil(t, store)
defer store.Close()
})
}
func Test_Should_Panic_On_Wrong_Schema(t *testing.T) {
testStore := newTestStore(t)
defer testStore.Close()

View File

@@ -180,6 +180,11 @@ type Config struct {
// Optional. Default is false
Reset bool
// DisableStartupCheck skips the initial connection validation during New.
//
// Optional. Default is false
DisableStartupCheck bool
// TLS Config to use. When set TLS will be negotiated.
//
// Optional. Default is nil
@@ -208,6 +213,7 @@ var ConfigDefault = Config{
URL: "",
Database: 0,
Reset: false,
DisableStartupCheck: false,
TLSConfig: nil,
PoolSize: 10 * runtime.GOMAXPROCS(0),
Addrs: []string{},

View File

@@ -68,6 +68,11 @@ type Config struct {
// Optional. Default is false
Reset bool
// DisableStartupCheck skips the initial connection validation during New.
//
// Optional. Default is false
DisableStartupCheck bool
// TLS Config to use. When set TLS will be negotiated.
//
// Optional. Default is nil
@@ -94,6 +99,7 @@ var ConfigDefault = Config{
URL: "",
Database: 0,
Reset: false,
DisableStartupCheck: false,
TLSConfig: nil,
PoolSize: 10 * runtime.GOMAXPROCS(0),
Addrs: []string{},

View File

@@ -65,6 +65,7 @@ func New(config ...Config) *Storage {
IsClusterMode: cfg.IsClusterMode,
})
if !cfg.DisableStartupCheck {
// Test connection
if err := db.Ping(context.Background()).Err(); err != nil {
panic(err)
@@ -76,6 +77,7 @@ func New(config ...Config) *Storage {
panic(err)
}
}
}
// Create new store
return &Storage{

View File

@@ -198,6 +198,19 @@ func Test_Redis_Delete(t *testing.T) {
require.Nil(t, keys)
}
func Test_Redis_New_DisableStartupCheck(t *testing.T) {
require.NotPanics(t, func() {
store := New(Config{
Host: "127.0.0.1",
Port: 6390,
Addrs: []string{"127.0.0.1:6390"},
DisableStartupCheck: true,
})
require.NotNil(t, store)
_ = store.Close()
})
}
func Test_Redis_DeleteWithContext(t *testing.T) {
var (
key = "john"

View File

@@ -184,6 +184,13 @@ type Config struct {
// Optional. Default is false
Reset bool
// DisableStartupCheck skips the initial connection validation during New.
// When true and client creation fails, New returns a Storage whose
// operations surface the initialization error instead of panicking.
//
// Optional. Default is false
DisableStartupCheck bool
// CacheTTL TTL
//
// Optional. Default is time.Minute
@@ -210,6 +217,7 @@ var ConfigDefault = Config{
DisableCache: false,
AlwaysPipelining: true,
Reset: false,
DisableStartupCheck: false,
CacheTTL: time.Minute,
}
```

View File

@@ -95,6 +95,13 @@ type Config struct {
// Optional. Default is false
Reset bool
// DisableStartupCheck skips the initial connection validation during New.
// When true and the client cannot be created, New returns a Storage whose
// operations will report the initialization error instead of panicking.
//
// Optional. Default is false
DisableStartupCheck bool
// CacheTTL TTL
//
// Optional. Default is time.Minute
@@ -120,6 +127,7 @@ var ConfigDefault = Config{
DisableCache: false,
AlwaysPipelining: true,
Reset: false,
DisableStartupCheck: false,
CacheTTL: time.Minute,
}
@@ -194,5 +202,9 @@ func configDefault(config ...Config) Config {
cfg.Reset = true
}
if userConfig.DisableStartupCheck {
cfg.DisableStartupCheck = true
}
return cfg
}

View File

@@ -12,6 +12,7 @@ var cacheTTL = time.Second
// Storage interface that is implemented by storage providers
type Storage struct {
db rueidis.Client
initErr error
}
// New creates a new rueidis storage
@@ -45,7 +46,6 @@ func New(config ...Config) *Storage {
}
}
// Update config values accordingly and start new Client
db, err := rueidis.NewClient(rueidis.ClientOption{
Username: cfg.Username,
Password: cfg.Password,
@@ -64,9 +64,14 @@ func New(config ...Config) *Storage {
AlwaysPipelining: cfg.AlwaysPipelining,
})
if err != nil {
if cfg.DisableStartupCheck {
return &Storage{initErr: err}
}
panic(err)
}
if !cfg.DisableStartupCheck {
// Test connection
if err := db.Do(context.Background(), db.B().Ping().Build()).Error(); err != nil {
panic(err)
@@ -78,6 +83,7 @@ func New(config ...Config) *Storage {
panic(err)
}
}
}
// Create new store
return &Storage{
@@ -87,6 +93,9 @@ func New(config ...Config) *Storage {
// GetWithContext gets value by key with context
func (s *Storage) GetWithContext(ctx context.Context, key string) ([]byte, error) {
if s.db == nil {
return nil, s.initErr
}
if len(key) <= 0 {
return nil, nil
}
@@ -104,6 +113,9 @@ func (s *Storage) Get(key string) ([]byte, error) {
// SetWithContext sets key with value with context
func (s *Storage) SetWithContext(ctx context.Context, key string, val []byte, exp time.Duration) error {
if s.db == nil {
return s.initErr
}
if len(key) <= 0 || len(val) <= 0 {
return nil
}
@@ -121,6 +133,9 @@ func (s *Storage) Set(key string, val []byte, exp time.Duration) error {
// DeleteWithContext deletes key by key with context
func (s *Storage) DeleteWithContext(ctx context.Context, key string) error {
if s.db == nil {
return s.initErr
}
if len(key) <= 0 {
return nil
}
@@ -134,6 +149,9 @@ func (s *Storage) Delete(key string) error {
// ResetWithContext resets all keys with context
func (s *Storage) ResetWithContext(ctx context.Context) error {
if s.db == nil {
return s.initErr
}
return s.db.Do(ctx, s.db.B().Flushdb().Build()).Error()
}
@@ -144,6 +162,10 @@ func (s *Storage) Reset() error {
// Close the database
func (s *Storage) Close() error {
if s.db == nil {
return nil
}
s.db.Close()
return nil
}

View File

@@ -49,6 +49,17 @@ func newTestStore(t testing.TB, opts ...testredis.Option) *Storage {
return New(newConfigFromContainer(t, opts...))
}
func Test_Rueidis_New_DisableStartupCheck(t *testing.T) {
require.NotPanics(t, func() {
store := New(Config{
InitAddress: []string{"127.0.0.1:6390"},
DisableStartupCheck: true,
})
require.NotNil(t, store)
require.NoError(t, store.Close())
})
}
func Test_Rueidis_Set(t *testing.T) {
var (
key = "john"