mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-08-28 10:54:59 +00:00
A few things were going wrong here. First, we take a "RetryPeriod" option on backup and restore which is meant to be roughly the total amount of time we spend retrying any given request before failing. However we were incorrectly passing that as the RetryMaxWait which is the maximum amount of time to sleep between any two attempts. We now do some fuzzy math to figure out approximately how many attempts we should make given a minimum sleep of 100ms and the fact that we double the sleep time every attempt. Second, during the backup test, if a host was totally stopped when we started the request, it would fail immediately and then retry, but if the host was stopped during the request (after DNS had resolved), then the request would wait for the DialTimeout which we default to 30s, so turning off the cluster for 5 seconds and turning it back on resulted in the backup completing rather than failing. Because of this, we change the commandClient to have a default dial timeout of 1 second. I was tempted to change the global default to 1s which I think would be fine, but didn't want to break anything too badly.
53 lines
2.2 KiB
Go
53 lines
2.2 KiB
Go
// Copyright 2021 Molecula Corp. All rights reserved.
|
|
package ctl
|
|
|
|
import (
|
|
"net"
|
|
"time"
|
|
|
|
gohttp "net/http"
|
|
|
|
"github.com/molecula/featurebase/v2/http"
|
|
"github.com/molecula/featurebase/v2/logger"
|
|
"github.com/molecula/featurebase/v2/server"
|
|
"github.com/pkg/errors"
|
|
"github.com/spf13/pflag"
|
|
)
|
|
|
|
// CommandWithTLSSupport is the interface for commands which has TLS settings
|
|
type CommandWithTLSSupport interface {
|
|
TLSHost() string
|
|
TLSConfiguration() server.TLSConfig
|
|
Logger() logger.Logger
|
|
}
|
|
|
|
// SetTLSConfig creates common TLS flags
|
|
func SetTLSConfig(flags *pflag.FlagSet, prefix string, certificatePath *string, certificateKeyPath *string, caCertPath *string, skipVerify *bool, enableClientVerification *bool) {
|
|
flags.StringVarP(certificatePath, prefix+"tls.certificate", "", "", "TLS certificate path (usually has the .crt or .pem extension)")
|
|
flags.StringVarP(certificateKeyPath, prefix+"tls.key", "", "", "TLS certificate key path (usually has the .key extension)")
|
|
flags.StringVarP(caCertPath, prefix+"tls.ca-certificate", "", "", "TLS CA certificate path (usually has the .pem extension)")
|
|
flags.BoolVarP(skipVerify, prefix+"tls.skip-verify", "", false, "Skip TLS certificate server verification (not secure)")
|
|
flags.BoolVarP(enableClientVerification, prefix+"tls.enable-client-verification", "", false, "Enable TLS certificate client verification for incoming connections")
|
|
}
|
|
|
|
// default dial timeout is 30s for some reason which makes testing
|
|
// failures/retries really awkward. I don't think we need it that
|
|
// high, so I set it to 1s here... let's see what happens.
|
|
func clientOptions(client *gohttp.Client, dialer *net.Dialer) *gohttp.Client {
|
|
dialer.Timeout = time.Second * 1
|
|
return client
|
|
}
|
|
|
|
// commandClient returns a pilosa.InternalHTTPClient for the command
|
|
func commandClient(cmd CommandWithTLSSupport, opts ...http.InternalClientOption) (*http.InternalClient, error) {
|
|
tls := cmd.TLSConfiguration()
|
|
tlsConfig, err := server.GetTLSConfig(&tls, cmd.Logger())
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "getting tls config")
|
|
}
|
|
client, err := http.NewInternalClient(cmd.TLSHost(), http.GetHTTPClient(tlsConfig, clientOptions), opts...)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "getting internal client")
|
|
}
|
|
return client, err
|
|
}
|