| 432 | } |
| 433 | |
| 434 | func setupFailoverConnParams(u *url.URL, o *FailoverOptions) (*FailoverOptions, error) { |
| 435 | q := queryOptions{q: u.Query()} |
| 436 | |
| 437 | o.MasterName = q.string("master_name") |
| 438 | o.ClientName = q.string("client_name") |
| 439 | o.RouteByLatency = q.bool("route_by_latency") |
| 440 | o.RouteRandomly = q.bool("route_randomly") |
| 441 | o.ReplicaOnly = q.bool("replica_only") |
| 442 | o.UseDisconnectedReplicas = q.bool("use_disconnected_replicas") |
| 443 | o.Protocol = q.int("protocol") |
| 444 | o.Username = q.string("username") |
| 445 | o.Password = q.string("password") |
| 446 | o.MaxRetries = q.int("max_retries") |
| 447 | o.MinRetryBackoff = q.duration("min_retry_backoff") |
| 448 | o.MaxRetryBackoff = q.duration("max_retry_backoff") |
| 449 | o.DialTimeout = q.duration("dial_timeout") |
| 450 | o.DialerRetries = q.int("dialer_retries") |
| 451 | o.DialerRetryTimeout = q.duration("dialer_retry_timeout") |
| 452 | o.ReadTimeout = q.duration("read_timeout") |
| 453 | o.WriteTimeout = q.duration("write_timeout") |
| 454 | o.ContextTimeoutEnabled = q.bool("context_timeout_enabled") |
| 455 | o.PoolFIFO = q.bool("pool_fifo") |
| 456 | o.PoolSize = q.int("pool_size") |
| 457 | o.MaxConcurrentDials = q.int("max_concurrent_dials") |
| 458 | o.MinIdleConns = q.int("min_idle_conns") |
| 459 | o.MaxIdleConns = q.int("max_idle_conns") |
| 460 | o.MaxActiveConns = q.int("max_active_conns") |
| 461 | o.ConnMaxLifetime = q.duration("conn_max_lifetime") |
| 462 | if q.has("conn_max_lifetime_jitter") { |
| 463 | o.ConnMaxLifetimeJitter = min(q.duration("conn_max_lifetime_jitter"), o.ConnMaxLifetime) |
| 464 | } |
| 465 | o.ConnMaxIdleTime = q.duration("conn_max_idle_time") |
| 466 | o.PoolTimeout = q.duration("pool_timeout") |
| 467 | o.DisableIdentity = q.bool("disableIdentity") |
| 468 | o.IdentitySuffix = q.string("identitySuffix") |
| 469 | o.UnstableResp3 = q.bool("unstable_resp3") |
| 470 | |
| 471 | if q.err != nil { |
| 472 | return nil, q.err |
| 473 | } |
| 474 | |
| 475 | if tmp := q.string("db"); tmp != "" { |
| 476 | db, err := strconv.Atoi(tmp) |
| 477 | if err != nil { |
| 478 | return nil, fmt.Errorf("redis: invalid database number: %w", err) |
| 479 | } |
| 480 | o.DB = db |
| 481 | } |
| 482 | |
| 483 | addrs := q.strings("addr") |
| 484 | for _, addr := range addrs { |
| 485 | h, p, err := net.SplitHostPort(addr) |
| 486 | if err != nil || h == "" || p == "" { |
| 487 | return nil, fmt.Errorf("redis: unable to parse addr param: %s", addr) |
| 488 | } |
| 489 | |
| 490 | o.SentinelAddrs = append(o.SentinelAddrs, net.JoinHostPort(h, p)) |
| 491 | } |