Merge pull request #10075 from hashicorp/dnephin/handle-raft-apply-errors

rpc: some cleanup of canRetry and ForwardRPC
This commit is contained in:
Daniel Nephin 2021-05-06 16:59:53 -04:00 committed by GitHub
commit d19137a429
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
25 changed files with 218 additions and 161 deletions

View File

@ -184,7 +184,7 @@ func (a *ACL) BootstrapTokens(args *structs.DCSpecificRequest, reply *structs.AC
if err := a.aclPreCheck(); err != nil { if err := a.aclPreCheck(); err != nil {
return err return err
} }
if done, err := a.srv.ForwardRPC("ACL.BootstrapTokens", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.BootstrapTokens", args, reply); done {
return err return err
} }
@ -279,7 +279,7 @@ func (a *ACL) TokenRead(args *structs.ACLTokenGetRequest, reply *structs.ACLToke
args.Datacenter = a.srv.config.ACLDatacenter args.Datacenter = a.srv.config.ACLDatacenter
} }
if done, err := a.srv.ForwardRPC("ACL.TokenRead", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.TokenRead", args, reply); done {
return err return err
} }
@ -348,7 +348,7 @@ func (a *ACL) TokenClone(args *structs.ACLTokenSetRequest, reply *structs.ACLTok
args.Datacenter = a.srv.config.ACLDatacenter args.Datacenter = a.srv.config.ACLDatacenter
} }
if done, err := a.srv.ForwardRPC("ACL.TokenClone", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.TokenClone", args, reply); done {
return err return err
} }
@ -419,7 +419,7 @@ func (a *ACL) TokenSet(args *structs.ACLTokenSetRequest, reply *structs.ACLToken
return fmt.Errorf("Local tokens are disabled") return fmt.Errorf("Local tokens are disabled")
} }
if done, err := a.srv.ForwardRPC("ACL.TokenSet", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.TokenSet", args, reply); done {
return err return err
} }
@ -825,7 +825,7 @@ func (a *ACL) TokenDelete(args *structs.ACLTokenDeleteRequest, reply *string) er
args.Datacenter = a.srv.config.ACLDatacenter args.Datacenter = a.srv.config.ACLDatacenter
} }
if done, err := a.srv.ForwardRPC("ACL.TokenDelete", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.TokenDelete", args, reply); done {
return err return err
} }
@ -911,7 +911,7 @@ func (a *ACL) TokenList(args *structs.ACLTokenListRequest, reply *structs.ACLTok
args.Datacenter = a.srv.config.ACLDatacenter args.Datacenter = a.srv.config.ACLDatacenter
} }
if done, err := a.srv.ForwardRPC("ACL.TokenList", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.TokenList", args, reply); done {
return err return err
} }
@ -974,7 +974,7 @@ func (a *ACL) TokenBatchRead(args *structs.ACLTokenBatchGetRequest, reply *struc
args.Datacenter = a.srv.config.ACLDatacenter args.Datacenter = a.srv.config.ACLDatacenter
} }
if done, err := a.srv.ForwardRPC("ACL.TokenBatchRead", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.TokenBatchRead", args, reply); done {
return err return err
} }
@ -1028,7 +1028,7 @@ func (a *ACL) PolicyRead(args *structs.ACLPolicyGetRequest, reply *structs.ACLPo
return err return err
} }
if done, err := a.srv.ForwardRPC("ACL.PolicyRead", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.PolicyRead", args, reply); done {
return err return err
} }
@ -1066,7 +1066,7 @@ func (a *ACL) PolicyBatchRead(args *structs.ACLPolicyBatchGetRequest, reply *str
return err return err
} }
if done, err := a.srv.ForwardRPC("ACL.PolicyBatchRead", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.PolicyBatchRead", args, reply); done {
return err return err
} }
@ -1104,7 +1104,7 @@ func (a *ACL) PolicySet(args *structs.ACLPolicySetRequest, reply *structs.ACLPol
args.Datacenter = a.srv.config.ACLDatacenter args.Datacenter = a.srv.config.ACLDatacenter
} }
if done, err := a.srv.ForwardRPC("ACL.PolicySet", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.PolicySet", args, reply); done {
return err return err
} }
@ -1235,7 +1235,7 @@ func (a *ACL) PolicyDelete(args *structs.ACLPolicyDeleteRequest, reply *string)
args.Datacenter = a.srv.config.ACLDatacenter args.Datacenter = a.srv.config.ACLDatacenter
} }
if done, err := a.srv.ForwardRPC("ACL.PolicyDelete", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.PolicyDelete", args, reply); done {
return err return err
} }
@ -1288,7 +1288,7 @@ func (a *ACL) PolicyList(args *structs.ACLPolicyListRequest, reply *structs.ACLP
return err return err
} }
if done, err := a.srv.ForwardRPC("ACL.PolicyList", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.PolicyList", args, reply); done {
return err return err
} }
@ -1328,7 +1328,7 @@ func (a *ACL) PolicyResolve(args *structs.ACLPolicyBatchGetRequest, reply *struc
return err return err
} }
if done, err := a.srv.ForwardRPC("ACL.PolicyResolve", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.PolicyResolve", args, reply); done {
return err return err
} }
@ -1386,7 +1386,7 @@ func makeACLETag(parent string, policy *acl.Policy) string {
// GetPolicy is used to retrieve a compiled policy object with a TTL. Does not // GetPolicy is used to retrieve a compiled policy object with a TTL. Does not
// support a blocking query. // support a blocking query.
func (a *ACL) GetPolicy(args *structs.ACLPolicyResolveLegacyRequest, reply *structs.ACLPolicyResolveLegacyResponse) error { func (a *ACL) GetPolicy(args *structs.ACLPolicyResolveLegacyRequest, reply *structs.ACLPolicyResolveLegacyResponse) error {
if done, err := a.srv.ForwardRPC("ACL.GetPolicy", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.GetPolicy", args, reply); done {
return err return err
} }
@ -1433,7 +1433,7 @@ func (a *ACL) ReplicationStatus(args *structs.DCSpecificRequest,
// re-using a structure where we don't support all the options. // re-using a structure where we don't support all the options.
args.RequireConsistent = true args.RequireConsistent = true
args.AllowStale = false args.AllowStale = false
if done, err := a.srv.ForwardRPC("ACL.ReplicationStatus", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.ReplicationStatus", args, reply); done {
return err return err
} }
@ -1461,7 +1461,7 @@ func (a *ACL) RoleRead(args *structs.ACLRoleGetRequest, reply *structs.ACLRoleRe
return err return err
} }
if done, err := a.srv.ForwardRPC("ACL.RoleRead", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.RoleRead", args, reply); done {
return err return err
} }
@ -1500,7 +1500,7 @@ func (a *ACL) RoleBatchRead(args *structs.ACLRoleBatchGetRequest, reply *structs
return err return err
} }
if done, err := a.srv.ForwardRPC("ACL.RoleBatchRead", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.RoleBatchRead", args, reply); done {
return err return err
} }
@ -1538,7 +1538,7 @@ func (a *ACL) RoleSet(args *structs.ACLRoleSetRequest, reply *structs.ACLRole) e
args.Datacenter = a.srv.config.ACLDatacenter args.Datacenter = a.srv.config.ACLDatacenter
} }
if done, err := a.srv.ForwardRPC("ACL.RoleSet", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.RoleSet", args, reply); done {
return err return err
} }
@ -1696,7 +1696,7 @@ func (a *ACL) RoleDelete(args *structs.ACLRoleDeleteRequest, reply *string) erro
args.Datacenter = a.srv.config.ACLDatacenter args.Datacenter = a.srv.config.ACLDatacenter
} }
if done, err := a.srv.ForwardRPC("ACL.RoleDelete", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.RoleDelete", args, reply); done {
return err return err
} }
@ -1745,7 +1745,7 @@ func (a *ACL) RoleList(args *structs.ACLRoleListRequest, reply *structs.ACLRoleL
return err return err
} }
if done, err := a.srv.ForwardRPC("ACL.RoleList", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.RoleList", args, reply); done {
return err return err
} }
@ -1779,7 +1779,7 @@ func (a *ACL) RoleResolve(args *structs.ACLRoleBatchGetRequest, reply *structs.A
return err return err
} }
if done, err := a.srv.ForwardRPC("ACL.RoleResolve", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.RoleResolve", args, reply); done {
return err return err
} }
@ -1844,7 +1844,7 @@ func (a *ACL) BindingRuleRead(args *structs.ACLBindingRuleGetRequest, reply *str
return errAuthMethodsRequireTokenReplication return errAuthMethodsRequireTokenReplication
} }
if done, err := a.srv.ForwardRPC("ACL.BindingRuleRead", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.BindingRuleRead", args, reply); done {
return err return err
} }
@ -1883,7 +1883,7 @@ func (a *ACL) BindingRuleSet(args *structs.ACLBindingRuleSetRequest, reply *stru
return errAuthMethodsRequireTokenReplication return errAuthMethodsRequireTokenReplication
} }
if done, err := a.srv.ForwardRPC("ACL.BindingRuleSet", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.BindingRuleSet", args, reply); done {
return err return err
} }
@ -2012,7 +2012,7 @@ func (a *ACL) BindingRuleDelete(args *structs.ACLBindingRuleDeleteRequest, reply
return errAuthMethodsRequireTokenReplication return errAuthMethodsRequireTokenReplication
} }
if done, err := a.srv.ForwardRPC("ACL.BindingRuleDelete", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.BindingRuleDelete", args, reply); done {
return err return err
} }
@ -2063,7 +2063,7 @@ func (a *ACL) BindingRuleList(args *structs.ACLBindingRuleListRequest, reply *st
return errAuthMethodsRequireTokenReplication return errAuthMethodsRequireTokenReplication
} }
if done, err := a.srv.ForwardRPC("ACL.BindingRuleList", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.BindingRuleList", args, reply); done {
return err return err
} }
@ -2103,7 +2103,7 @@ func (a *ACL) AuthMethodRead(args *structs.ACLAuthMethodGetRequest, reply *struc
return errAuthMethodsRequireTokenReplication return errAuthMethodsRequireTokenReplication
} }
if done, err := a.srv.ForwardRPC("ACL.AuthMethodRead", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.AuthMethodRead", args, reply); done {
return err return err
} }
@ -2145,7 +2145,7 @@ func (a *ACL) AuthMethodSet(args *structs.ACLAuthMethodSetRequest, reply *struct
return errAuthMethodsRequireTokenReplication return errAuthMethodsRequireTokenReplication
} }
if done, err := a.srv.ForwardRPC("ACL.AuthMethodSet", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.AuthMethodSet", args, reply); done {
return err return err
} }
@ -2257,7 +2257,7 @@ func (a *ACL) AuthMethodDelete(args *structs.ACLAuthMethodDeleteRequest, reply *
return errAuthMethodsRequireTokenReplication return errAuthMethodsRequireTokenReplication
} }
if done, err := a.srv.ForwardRPC("ACL.AuthMethodDelete", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.AuthMethodDelete", args, reply); done {
return err return err
} }
@ -2313,7 +2313,7 @@ func (a *ACL) AuthMethodList(args *structs.ACLAuthMethodListRequest, reply *stru
return errAuthMethodsRequireTokenReplication return errAuthMethodsRequireTokenReplication
} }
if done, err := a.srv.ForwardRPC("ACL.AuthMethodList", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.AuthMethodList", args, reply); done {
return err return err
} }
@ -2367,7 +2367,7 @@ func (a *ACL) Login(args *structs.ACLLoginRequest, reply *structs.ACLToken) erro
return errors.New("do not provide a token when logging in") return errors.New("do not provide a token when logging in")
} }
if done, err := a.srv.ForwardRPC("ACL.Login", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.Login", args, reply); done {
return err return err
} }
@ -2512,7 +2512,7 @@ func (a *ACL) Logout(args *structs.ACLLogoutRequest, reply *bool) error {
return acl.ErrNotFound return acl.ErrNotFound
} }
if done, err := a.srv.ForwardRPC("ACL.Logout", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.Logout", args, reply); done {
return err return err
} }
@ -2559,7 +2559,7 @@ func (a *ACL) Authorize(args *structs.RemoteACLAuthorizationRequest, reply *[]st
return err return err
} }
if done, err := a.srv.ForwardRPC("ACL.Authorize", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.Authorize", args, reply); done {
return err return err
} }

View File

@ -24,7 +24,7 @@ var ACLEndpointLegacySummaries = []prometheus.SummaryDefinition{
// Bootstrap is used to perform a one-time ACL bootstrap operation on // Bootstrap is used to perform a one-time ACL bootstrap operation on
// a cluster to get the first management token. // a cluster to get the first management token.
func (a *ACL) Bootstrap(args *structs.DCSpecificRequest, reply *structs.ACL) error { func (a *ACL) Bootstrap(args *structs.DCSpecificRequest, reply *structs.ACL) error {
if done, err := a.srv.ForwardRPC("ACL.Bootstrap", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.Bootstrap", args, reply); done {
return err return err
} }
@ -155,7 +155,7 @@ func aclApplyInternal(srv *Server, args *structs.ACLRequest, reply *string) erro
// Apply is used to apply a modifying request to the data store. This should // Apply is used to apply a modifying request to the data store. This should
// only be used for operations that modify the data // only be used for operations that modify the data
func (a *ACL) Apply(args *structs.ACLRequest, reply *string) error { func (a *ACL) Apply(args *structs.ACLRequest, reply *string) error {
if done, err := a.srv.ForwardRPC("ACL.Apply", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.Apply", args, reply); done {
return err return err
} }
defer metrics.MeasureSince([]string{"acl", "apply"}, time.Now()) defer metrics.MeasureSince([]string{"acl", "apply"}, time.Now())
@ -201,7 +201,7 @@ func (a *ACL) Apply(args *structs.ACLRequest, reply *string) error {
// Get is used to retrieve a single ACL // Get is used to retrieve a single ACL
func (a *ACL) Get(args *structs.ACLSpecificRequest, func (a *ACL) Get(args *structs.ACLSpecificRequest,
reply *structs.IndexedACLs) error { reply *structs.IndexedACLs) error {
if done, err := a.srv.ForwardRPC("ACL.Get", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.Get", args, reply); done {
return err return err
} }
@ -247,7 +247,7 @@ func (a *ACL) Get(args *structs.ACLSpecificRequest,
// List is used to list all the ACLs // List is used to list all the ACLs
func (a *ACL) List(args *structs.DCSpecificRequest, func (a *ACL) List(args *structs.DCSpecificRequest,
reply *structs.IndexedACLs) error { reply *structs.IndexedACLs) error {
if done, err := a.srv.ForwardRPC("ACL.List", args, args, reply); done { if done, err := a.srv.ForwardRPC("ACL.List", args, reply); done {
return err return err
} }

View File

@ -9,6 +9,9 @@ import (
"github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/acl"
"github.com/hashicorp/consul/proto" "github.com/hashicorp/consul/proto"
bexpr "github.com/hashicorp/go-bexpr"
"github.com/mitchellh/mapstructure"
"github.com/hashicorp/consul/agent/connect" "github.com/hashicorp/consul/agent/connect"
"github.com/hashicorp/consul/agent/consul/authmethod/ssoauth" "github.com/hashicorp/consul/agent/consul/authmethod/ssoauth"
"github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/agent/structs"
@ -17,8 +20,6 @@ import (
"github.com/hashicorp/consul/proto/pbconfig" "github.com/hashicorp/consul/proto/pbconfig"
"github.com/hashicorp/consul/proto/pbconnect" "github.com/hashicorp/consul/proto/pbconnect"
"github.com/hashicorp/consul/tlsutil" "github.com/hashicorp/consul/tlsutil"
bexpr "github.com/hashicorp/go-bexpr"
"github.com/mitchellh/mapstructure"
) )
type AutoConfigOptions struct { type AutoConfigOptions struct {
@ -107,7 +108,7 @@ func (a *jwtAuthorizer) Authorize(req *pbautoconf.AutoConfigRequest) (AutoConfig
type AutoConfigBackend interface { type AutoConfigBackend interface {
CreateACLToken(template *structs.ACLToken) (*structs.ACLToken, error) CreateACLToken(template *structs.ACLToken) (*structs.ACLToken, error)
DatacenterJoinAddresses(segment string) ([]string, error) DatacenterJoinAddresses(segment string) ([]string, error)
ForwardRPC(method string, info structs.RPCInfo, args, reply interface{}) (bool, error) ForwardRPC(method string, info structs.RPCInfo, reply interface{}) (bool, error)
GetCARoots() (*structs.IndexedCARoots, error) GetCARoots() (*structs.IndexedCARoots, error)
SignCertificate(csr *x509.CertificateRequest, id connect.CertURI) (*structs.IssuedCert, error) SignCertificate(csr *x509.CertificateRequest, id connect.CertURI) (*structs.IssuedCert, error)
@ -339,7 +340,7 @@ func (ac *AutoConfig) InitialConfiguration(req *pbautoconf.AutoConfigRequest, re
} }
// forward to the leader // forward to the leader
if done, err := ac.backend.ForwardRPC("AutoConfig.InitialConfiguration", req, req, resp); done { if done, err := ac.backend.ForwardRPC("AutoConfig.InitialConfiguration", req, resp); done {
return err return err
} }

View File

@ -11,6 +11,11 @@ import (
"testing" "testing"
"time" "time"
"github.com/hashicorp/memberlist"
msgpackrpc "github.com/hashicorp/net-rpc-msgpackrpc"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
"github.com/hashicorp/consul/agent/connect" "github.com/hashicorp/consul/agent/connect"
"github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/agent/structs"
"github.com/hashicorp/consul/internal/go-sso/oidcauth/oidcauthtest" "github.com/hashicorp/consul/internal/go-sso/oidcauth/oidcauthtest"
@ -18,10 +23,6 @@ import (
"github.com/hashicorp/consul/proto/pbconfig" "github.com/hashicorp/consul/proto/pbconfig"
"github.com/hashicorp/consul/sdk/testutil" "github.com/hashicorp/consul/sdk/testutil"
"github.com/hashicorp/consul/tlsutil" "github.com/hashicorp/consul/tlsutil"
"github.com/hashicorp/memberlist"
msgpackrpc "github.com/hashicorp/net-rpc-msgpackrpc"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
"gopkg.in/square/go-jose.v2/jwt" "gopkg.in/square/go-jose.v2/jwt"
) )
@ -44,8 +45,8 @@ func (m *mockAutoConfigBackend) DatacenterJoinAddresses(segment string) ([]strin
return addrs, ret.Error(1) return addrs, ret.Error(1)
} }
func (m *mockAutoConfigBackend) ForwardRPC(method string, info structs.RPCInfo, args, reply interface{}) (bool, error) { func (m *mockAutoConfigBackend) ForwardRPC(method string, req structs.RPCInfo, reply interface{}) (bool, error) {
ret := m.Called(method, info, args, reply) ret := m.Called(method, req, reply)
return ret.Bool(0), ret.Error(1) return ret.Bool(0), ret.Error(1)
} }

View File

@ -24,7 +24,7 @@ func (a *AutoEncrypt) Sign(
if !a.srv.config.AutoEncryptAllowTLS { if !a.srv.config.AutoEncryptAllowTLS {
return ErrAutoEncryptAllowTLSNotEnabled return ErrAutoEncryptAllowTLSNotEnabled
} }
if done, err := a.srv.ForwardRPC("AutoEncrypt.Sign", args, args, reply); done { if done, err := a.srv.ForwardRPC("AutoEncrypt.Sign", args, reply); done {
return err return err
} }

View File

@ -142,7 +142,7 @@ func checkPreApply(check *structs.HealthCheck) {
// Register is used register that a node is providing a given service. // Register is used register that a node is providing a given service.
func (c *Catalog) Register(args *structs.RegisterRequest, reply *struct{}) error { func (c *Catalog) Register(args *structs.RegisterRequest, reply *struct{}) error {
if done, err := c.srv.ForwardRPC("Catalog.Register", args, args, reply); done { if done, err := c.srv.ForwardRPC("Catalog.Register", args, reply); done {
return err return err
} }
defer metrics.MeasureSince([]string{"catalog", "register"}, time.Now()) defer metrics.MeasureSince([]string{"catalog", "register"}, time.Now())
@ -217,7 +217,7 @@ func (c *Catalog) Register(args *structs.RegisterRequest, reply *struct{}) error
// Deregister is used to remove a service registration for a given node. // Deregister is used to remove a service registration for a given node.
func (c *Catalog) Deregister(args *structs.DeregisterRequest, reply *struct{}) error { func (c *Catalog) Deregister(args *structs.DeregisterRequest, reply *struct{}) error {
if done, err := c.srv.ForwardRPC("Catalog.Deregister", args, args, reply); done { if done, err := c.srv.ForwardRPC("Catalog.Deregister", args, reply); done {
return err return err
} }
defer metrics.MeasureSince([]string{"catalog", "deregister"}, time.Now()) defer metrics.MeasureSince([]string{"catalog", "deregister"}, time.Now())
@ -284,7 +284,7 @@ func (c *Catalog) ListDatacenters(args *structs.DatacentersRequest, reply *[]str
// ListNodes is used to query the nodes in a DC // ListNodes is used to query the nodes in a DC
func (c *Catalog) ListNodes(args *structs.DCSpecificRequest, reply *structs.IndexedNodes) error { func (c *Catalog) ListNodes(args *structs.DCSpecificRequest, reply *structs.IndexedNodes) error {
if done, err := c.srv.ForwardRPC("Catalog.ListNodes", args, args, reply); done { if done, err := c.srv.ForwardRPC("Catalog.ListNodes", args, reply); done {
return err return err
} }
@ -332,7 +332,7 @@ func isUnmodified(opts structs.QueryOptions, index uint64) bool {
// ListServices is used to query the services in a DC // ListServices is used to query the services in a DC
func (c *Catalog) ListServices(args *structs.DCSpecificRequest, reply *structs.IndexedServices) error { func (c *Catalog) ListServices(args *structs.DCSpecificRequest, reply *structs.IndexedServices) error {
if done, err := c.srv.ForwardRPC("Catalog.ListServices", args, args, reply); done { if done, err := c.srv.ForwardRPC("Catalog.ListServices", args, reply); done {
return err return err
} }
@ -373,7 +373,7 @@ func (c *Catalog) ListServices(args *structs.DCSpecificRequest, reply *structs.I
} }
func (c *Catalog) ServiceList(args *structs.DCSpecificRequest, reply *structs.IndexedServiceList) error { func (c *Catalog) ServiceList(args *structs.DCSpecificRequest, reply *structs.IndexedServiceList) error {
if done, err := c.srv.ForwardRPC("Catalog.ServiceList", args, args, reply); done { if done, err := c.srv.ForwardRPC("Catalog.ServiceList", args, reply); done {
return err return err
} }
@ -402,7 +402,7 @@ func (c *Catalog) ServiceList(args *structs.DCSpecificRequest, reply *structs.In
// ServiceNodes returns all the nodes registered as part of a service // ServiceNodes returns all the nodes registered as part of a service
func (c *Catalog) ServiceNodes(args *structs.ServiceSpecificRequest, reply *structs.IndexedServiceNodes) error { func (c *Catalog) ServiceNodes(args *structs.ServiceSpecificRequest, reply *structs.IndexedServiceNodes) error {
if done, err := c.srv.ForwardRPC("Catalog.ServiceNodes", args, args, reply); done { if done, err := c.srv.ForwardRPC("Catalog.ServiceNodes", args, reply); done {
return err return err
} }
@ -540,7 +540,7 @@ func (c *Catalog) ServiceNodes(args *structs.ServiceSpecificRequest, reply *stru
// NodeServices returns all the services registered as part of a node // NodeServices returns all the services registered as part of a node
func (c *Catalog) NodeServices(args *structs.NodeSpecificRequest, reply *structs.IndexedNodeServices) error { func (c *Catalog) NodeServices(args *structs.NodeSpecificRequest, reply *structs.IndexedNodeServices) error {
if done, err := c.srv.ForwardRPC("Catalog.NodeServices", args, args, reply); done { if done, err := c.srv.ForwardRPC("Catalog.NodeServices", args, reply); done {
return err return err
} }
@ -591,7 +591,7 @@ func (c *Catalog) NodeServices(args *structs.NodeSpecificRequest, reply *structs
} }
func (c *Catalog) NodeServiceList(args *structs.NodeSpecificRequest, reply *structs.IndexedNodeServiceList) error { func (c *Catalog) NodeServiceList(args *structs.NodeSpecificRequest, reply *structs.IndexedNodeServiceList) error {
if done, err := c.srv.ForwardRPC("Catalog.NodeServiceList", args, args, reply); done { if done, err := c.srv.ForwardRPC("Catalog.NodeServiceList", args, reply); done {
return err return err
} }
@ -644,7 +644,7 @@ func (c *Catalog) NodeServiceList(args *structs.NodeSpecificRequest, reply *stru
} }
func (c *Catalog) GatewayServices(args *structs.ServiceSpecificRequest, reply *structs.IndexedGatewayServices) error { func (c *Catalog) GatewayServices(args *structs.ServiceSpecificRequest, reply *structs.IndexedGatewayServices) error {
if done, err := c.srv.ForwardRPC("Catalog.GatewayServices", args, args, reply); done { if done, err := c.srv.ForwardRPC("Catalog.GatewayServices", args, reply); done {
return err return err
} }

View File

@ -10,6 +10,10 @@ import (
"github.com/armon/go-metrics" "github.com/armon/go-metrics"
"github.com/armon/go-metrics/prometheus" "github.com/armon/go-metrics/prometheus"
"github.com/hashicorp/go-hclog"
"github.com/hashicorp/serf/serf"
"golang.org/x/time/rate"
"github.com/hashicorp/consul/agent/pool" "github.com/hashicorp/consul/agent/pool"
"github.com/hashicorp/consul/agent/router" "github.com/hashicorp/consul/agent/router"
"github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/agent/structs"
@ -17,9 +21,6 @@ import (
"github.com/hashicorp/consul/logging" "github.com/hashicorp/consul/logging"
"github.com/hashicorp/consul/tlsutil" "github.com/hashicorp/consul/tlsutil"
"github.com/hashicorp/consul/types" "github.com/hashicorp/consul/types"
"github.com/hashicorp/go-hclog"
"github.com/hashicorp/serf/serf"
"golang.org/x/time/rate"
) )
var ClientCounters = []prometheus.CounterDefinition{ var ClientCounters = []prometheus.CounterDefinition{
@ -287,7 +288,10 @@ TRY:
) )
metrics.IncrCounterWithLabels([]string{"client", "rpc", "failed"}, 1, []metrics.Label{{Name: "server", Value: server.Name}}) metrics.IncrCounterWithLabels([]string{"client", "rpc", "failed"}, 1, []metrics.Label{{Name: "server", Value: server.Name}})
manager.NotifyFailedServer(server) manager.NotifyFailedServer(server)
if retry := canRetry(args, rpcErr); !retry {
// Use the zero value for RPCInfo if the request doesn't implement RPCInfo
info, _ := args.(structs.RPCInfo)
if retry := canRetry(info, rpcErr); !retry {
return rpcErr return rpcErr
} }

View File

@ -58,7 +58,7 @@ func (c *ConfigEntry) Apply(args *structs.ConfigEntryRequest, reply *bool) error
// be replicated to all the other datacenters. // be replicated to all the other datacenters.
args.Datacenter = c.srv.config.PrimaryDatacenter args.Datacenter = c.srv.config.PrimaryDatacenter
if done, err := c.srv.ForwardRPC("ConfigEntry.Apply", args, args, reply); done { if done, err := c.srv.ForwardRPC("ConfigEntry.Apply", args, reply); done {
return err return err
} }
defer metrics.MeasureSince([]string{"config_entry", "apply"}, time.Now()) defer metrics.MeasureSince([]string{"config_entry", "apply"}, time.Now())
@ -105,7 +105,7 @@ func (c *ConfigEntry) Get(args *structs.ConfigEntryQuery, reply *structs.ConfigE
return err return err
} }
if done, err := c.srv.ForwardRPC("ConfigEntry.Get", args, args, reply); done { if done, err := c.srv.ForwardRPC("ConfigEntry.Get", args, reply); done {
return err return err
} }
defer metrics.MeasureSince([]string{"config_entry", "get"}, time.Now()) defer metrics.MeasureSince([]string{"config_entry", "get"}, time.Now())
@ -152,7 +152,7 @@ func (c *ConfigEntry) List(args *structs.ConfigEntryQuery, reply *structs.Indexe
return err return err
} }
if done, err := c.srv.ForwardRPC("ConfigEntry.List", args, args, reply); done { if done, err := c.srv.ForwardRPC("ConfigEntry.List", args, reply); done {
return err return err
} }
defer metrics.MeasureSince([]string{"config_entry", "list"}, time.Now()) defer metrics.MeasureSince([]string{"config_entry", "list"}, time.Now())
@ -209,7 +209,7 @@ func (c *ConfigEntry) ListAll(args *structs.ConfigEntryListAllRequest, reply *st
return err return err
} }
if done, err := c.srv.ForwardRPC("ConfigEntry.ListAll", args, args, reply); done { if done, err := c.srv.ForwardRPC("ConfigEntry.ListAll", args, reply); done {
return err return err
} }
defer metrics.MeasureSince([]string{"config_entry", "listAll"}, time.Now()) defer metrics.MeasureSince([]string{"config_entry", "listAll"}, time.Now())
@ -271,7 +271,7 @@ func (c *ConfigEntry) Delete(args *structs.ConfigEntryRequest, reply *struct{})
// be replicated to all the other datacenters. // be replicated to all the other datacenters.
args.Datacenter = c.srv.config.PrimaryDatacenter args.Datacenter = c.srv.config.PrimaryDatacenter
if done, err := c.srv.ForwardRPC("ConfigEntry.Delete", args, args, reply); done { if done, err := c.srv.ForwardRPC("ConfigEntry.Delete", args, reply); done {
return err return err
} }
defer metrics.MeasureSince([]string{"config_entry", "delete"}, time.Now()) defer metrics.MeasureSince([]string{"config_entry", "delete"}, time.Now())
@ -305,7 +305,7 @@ func (c *ConfigEntry) ResolveServiceConfig(args *structs.ServiceConfigRequest, r
return err return err
} }
if done, err := c.srv.ForwardRPC("ConfigEntry.ResolveServiceConfig", args, args, reply); done { if done, err := c.srv.ForwardRPC("ConfigEntry.ResolveServiceConfig", args, reply); done {
return err return err
} }
defer metrics.MeasureSince([]string{"config_entry", "resolve_service_config"}, time.Now()) defer metrics.MeasureSince([]string{"config_entry", "resolve_service_config"}, time.Now())

View File

@ -6,12 +6,12 @@ import (
"time" "time"
"github.com/hashicorp/go-hclog" "github.com/hashicorp/go-hclog"
"github.com/hashicorp/go-memdb"
"github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/acl"
"github.com/hashicorp/consul/agent/connect" "github.com/hashicorp/consul/agent/connect"
"github.com/hashicorp/consul/agent/consul/state" "github.com/hashicorp/consul/agent/consul/state"
"github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/agent/structs"
"github.com/hashicorp/go-memdb"
) )
var ( var (
@ -56,7 +56,7 @@ func (s *ConnectCA) ConfigurationGet(
return ErrConnectNotEnabled return ErrConnectNotEnabled
} }
if done, err := s.srv.ForwardRPC("ConnectCA.ConfigurationGet", args, args, reply); done { if done, err := s.srv.ForwardRPC("ConnectCA.ConfigurationGet", args, reply); done {
return err return err
} }
@ -88,7 +88,7 @@ func (s *ConnectCA) ConfigurationSet(
return ErrConnectNotEnabled return ErrConnectNotEnabled
} }
if done, err := s.srv.ForwardRPC("ConnectCA.ConfigurationSet", args, args, reply); done { if done, err := s.srv.ForwardRPC("ConnectCA.ConfigurationSet", args, reply); done {
return err return err
} }
@ -109,7 +109,7 @@ func (s *ConnectCA) Roots(
args *structs.DCSpecificRequest, args *structs.DCSpecificRequest,
reply *structs.IndexedCARoots) error { reply *structs.IndexedCARoots) error {
// Forward if necessary // Forward if necessary
if done, err := s.srv.ForwardRPC("ConnectCA.Roots", args, args, reply); done { if done, err := s.srv.ForwardRPC("ConnectCA.Roots", args, reply); done {
return err return err
} }
@ -141,7 +141,7 @@ func (s *ConnectCA) Sign(
return ErrConnectNotEnabled return ErrConnectNotEnabled
} }
if done, err := s.srv.ForwardRPC("ConnectCA.Sign", args, args, reply); done { if done, err := s.srv.ForwardRPC("ConnectCA.Sign", args, reply); done {
return err return err
} }
@ -209,7 +209,7 @@ func (s *ConnectCA) SignIntermediate(
return ErrConnectNotEnabled return ErrConnectNotEnabled
} }
if done, err := s.srv.ForwardRPC("ConnectCA.SignIntermediate", args, args, reply); done { if done, err := s.srv.ForwardRPC("ConnectCA.SignIntermediate", args, reply); done {
return err return err
} }

View File

@ -116,7 +116,7 @@ func (c *Coordinate) batchApplyUpdates() error {
// Update inserts or updates the LAN coordinate of a node. // Update inserts or updates the LAN coordinate of a node.
func (c *Coordinate) Update(args *structs.CoordinateUpdateRequest, reply *struct{}) (err error) { func (c *Coordinate) Update(args *structs.CoordinateUpdateRequest, reply *struct{}) (err error) {
if done, err := c.srv.ForwardRPC("Coordinate.Update", args, args, reply); done { if done, err := c.srv.ForwardRPC("Coordinate.Update", args, reply); done {
return err return err
} }
@ -192,7 +192,7 @@ func (c *Coordinate) ListDatacenters(args *struct{}, reply *[]structs.Datacenter
// ListNodes returns the list of nodes with their raw network coordinates (if no // ListNodes returns the list of nodes with their raw network coordinates (if no
// coordinates are available for a node it won't appear in this list). // coordinates are available for a node it won't appear in this list).
func (c *Coordinate) ListNodes(args *structs.DCSpecificRequest, reply *structs.IndexedCoordinates) error { func (c *Coordinate) ListNodes(args *structs.DCSpecificRequest, reply *structs.IndexedCoordinates) error {
if done, err := c.srv.ForwardRPC("Coordinate.ListNodes", args, args, reply); done { if done, err := c.srv.ForwardRPC("Coordinate.ListNodes", args, reply); done {
return err return err
} }
@ -215,7 +215,7 @@ func (c *Coordinate) ListNodes(args *structs.DCSpecificRequest, reply *structs.I
// Node returns the raw coordinates for a single node. // Node returns the raw coordinates for a single node.
func (c *Coordinate) Node(args *structs.NodeSpecificRequest, reply *structs.IndexedCoordinates) error { func (c *Coordinate) Node(args *structs.NodeSpecificRequest, reply *structs.IndexedCoordinates) error {
if done, err := c.srv.ForwardRPC("Coordinate.Node", args, args, reply); done { if done, err := c.srv.ForwardRPC("Coordinate.Node", args, reply); done {
return err return err
} }

View File

@ -5,11 +5,12 @@ import (
"time" "time"
metrics "github.com/armon/go-metrics" metrics "github.com/armon/go-metrics"
memdb "github.com/hashicorp/go-memdb"
"github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/acl"
"github.com/hashicorp/consul/agent/consul/discoverychain" "github.com/hashicorp/consul/agent/consul/discoverychain"
"github.com/hashicorp/consul/agent/consul/state" "github.com/hashicorp/consul/agent/consul/state"
"github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/agent/structs"
memdb "github.com/hashicorp/go-memdb"
) )
type DiscoveryChain struct { type DiscoveryChain struct {
@ -22,7 +23,7 @@ func (c *DiscoveryChain) Get(args *structs.DiscoveryChainRequest, reply *structs
return ErrConnectNotEnabled return ErrConnectNotEnabled
} }
if done, err := c.srv.ForwardRPC("DiscoveryChain.Get", args, args, reply); done { if done, err := c.srv.ForwardRPC("DiscoveryChain.Get", args, reply); done {
return err return err
} }
defer metrics.MeasureSince([]string{"discovery_chain", "get"}, time.Now()) defer metrics.MeasureSince([]string{"discovery_chain", "get"}, time.Now())

View File

@ -48,7 +48,7 @@ func (c *FederationState) Apply(args *structs.FederationStateRequest, reply *boo
// be replicated to all the other datacenters. // be replicated to all the other datacenters.
args.Datacenter = c.srv.config.PrimaryDatacenter args.Datacenter = c.srv.config.PrimaryDatacenter
if done, err := c.srv.ForwardRPC("FederationState.Apply", args, args, reply); done { if done, err := c.srv.ForwardRPC("FederationState.Apply", args, reply); done {
return err return err
} }
@ -94,7 +94,7 @@ func (c *FederationState) Apply(args *structs.FederationStateRequest, reply *boo
} }
func (c *FederationState) Get(args *structs.FederationStateQuery, reply *structs.FederationStateResponse) error { func (c *FederationState) Get(args *structs.FederationStateQuery, reply *structs.FederationStateResponse) error {
if done, err := c.srv.ForwardRPC("FederationState.Get", args, args, reply); done { if done, err := c.srv.ForwardRPC("FederationState.Get", args, reply); done {
return err return err
} }
@ -135,7 +135,7 @@ func (c *FederationState) Get(args *structs.FederationStateQuery, reply *structs
// List is the endpoint meant to be used by consul servers performing // List is the endpoint meant to be used by consul servers performing
// replication. // replication.
func (c *FederationState) List(args *structs.DCSpecificRequest, reply *structs.IndexedFederationStates) error { func (c *FederationState) List(args *structs.DCSpecificRequest, reply *structs.IndexedFederationStates) error {
if done, err := c.srv.ForwardRPC("FederationState.List", args, args, reply); done { if done, err := c.srv.ForwardRPC("FederationState.List", args, reply); done {
return err return err
} }
@ -178,7 +178,7 @@ func (c *FederationState) List(args *structs.DCSpecificRequest, reply *structs.I
// in the discovery info for dialing mesh gateways. Analogous to catalog // in the discovery info for dialing mesh gateways. Analogous to catalog
// endpoints. // endpoints.
func (c *FederationState) ListMeshGateways(args *structs.DCSpecificRequest, reply *structs.DatacenterIndexedCheckServiceNodes) error { func (c *FederationState) ListMeshGateways(args *structs.DCSpecificRequest, reply *structs.DatacenterIndexedCheckServiceNodes) error {
if done, err := c.srv.ForwardRPC("FederationState.ListMeshGateways", args, args, reply); done { if done, err := c.srv.ForwardRPC("FederationState.ListMeshGateways", args, reply); done {
return err return err
} }

View File

@ -5,11 +5,12 @@ import (
"sort" "sort"
"github.com/armon/go-metrics" "github.com/armon/go-metrics"
bexpr "github.com/hashicorp/go-bexpr"
"github.com/hashicorp/go-memdb"
"github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/acl"
"github.com/hashicorp/consul/agent/consul/state" "github.com/hashicorp/consul/agent/consul/state"
"github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/agent/structs"
bexpr "github.com/hashicorp/go-bexpr"
"github.com/hashicorp/go-memdb"
) )
// Health endpoint is used to query the health information // Health endpoint is used to query the health information
@ -20,7 +21,7 @@ type Health struct {
// ChecksInState is used to get all the checks in a given state // ChecksInState is used to get all the checks in a given state
func (h *Health) ChecksInState(args *structs.ChecksInStateRequest, func (h *Health) ChecksInState(args *structs.ChecksInStateRequest,
reply *structs.IndexedHealthChecks) error { reply *structs.IndexedHealthChecks) error {
if done, err := h.srv.ForwardRPC("Health.ChecksInState", args, args, reply); done { if done, err := h.srv.ForwardRPC("Health.ChecksInState", args, reply); done {
return err return err
} }
@ -71,7 +72,7 @@ func (h *Health) ChecksInState(args *structs.ChecksInStateRequest,
// NodeChecks is used to get all the checks for a node // NodeChecks is used to get all the checks for a node
func (h *Health) NodeChecks(args *structs.NodeSpecificRequest, func (h *Health) NodeChecks(args *structs.NodeSpecificRequest,
reply *structs.IndexedHealthChecks) error { reply *structs.IndexedHealthChecks) error {
if done, err := h.srv.ForwardRPC("Health.NodeChecks", args, args, reply); done { if done, err := h.srv.ForwardRPC("Health.NodeChecks", args, reply); done {
return err return err
} }
@ -121,7 +122,7 @@ func (h *Health) ServiceChecks(args *structs.ServiceSpecificRequest,
} }
// Potentially forward // Potentially forward
if done, err := h.srv.ForwardRPC("Health.ServiceChecks", args, args, reply); done { if done, err := h.srv.ForwardRPC("Health.ServiceChecks", args, reply); done {
return err return err
} }
@ -171,7 +172,7 @@ func (h *Health) ServiceChecks(args *structs.ServiceSpecificRequest,
// ServiceNodes returns all the nodes registered as part of a service including health info // ServiceNodes returns all the nodes registered as part of a service including health info
func (h *Health) ServiceNodes(args *structs.ServiceSpecificRequest, reply *structs.IndexedCheckServiceNodes) error { func (h *Health) ServiceNodes(args *structs.ServiceSpecificRequest, reply *structs.IndexedCheckServiceNodes) error {
if done, err := h.srv.ForwardRPC("Health.ServiceNodes", args, args, reply); done { if done, err := h.srv.ForwardRPC("Health.ServiceNodes", args, reply); done {
return err return err
} }

View File

@ -80,7 +80,7 @@ func (s *Intention) Apply(args *structs.IntentionRequest, reply *string) error {
// datacenter. These will then be replicated to all the other datacenters. // datacenter. These will then be replicated to all the other datacenters.
args.Datacenter = s.srv.config.PrimaryDatacenter args.Datacenter = s.srv.config.PrimaryDatacenter
if done, err := s.srv.ForwardRPC("Intention.Apply", args, args, reply); done { if done, err := s.srv.ForwardRPC("Intention.Apply", args, reply); done {
return err return err
} }
defer metrics.MeasureSince([]string{"consul", "intention", "apply"}, time.Now()) defer metrics.MeasureSince([]string{"consul", "intention", "apply"}, time.Now())
@ -423,7 +423,7 @@ func (s *Intention) Get(args *structs.IntentionQueryRequest, reply *structs.Inde
} }
// Forward if necessary // Forward if necessary
if done, err := s.srv.ForwardRPC("Intention.Get", args, args, reply); done { if done, err := s.srv.ForwardRPC("Intention.Get", args, reply); done {
return err return err
} }
@ -501,7 +501,7 @@ func (s *Intention) List(args *structs.IntentionListRequest, reply *structs.Inde
} }
// Forward if necessary // Forward if necessary
if done, err := s.srv.ForwardRPC("Intention.List", args, args, reply); done { if done, err := s.srv.ForwardRPC("Intention.List", args, reply); done {
return err return err
} }
@ -571,7 +571,7 @@ func (s *Intention) Match(args *structs.IntentionQueryRequest, reply *structs.In
} }
// Forward if necessary // Forward if necessary
if done, err := s.srv.ForwardRPC("Intention.Match", args, args, reply); done { if done, err := s.srv.ForwardRPC("Intention.Match", args, reply); done {
return err return err
} }
@ -645,7 +645,7 @@ func (s *Intention) Check(args *structs.IntentionQueryRequest, reply *structs.In
} }
// Forward maybe // Forward maybe
if done, err := s.srv.ForwardRPC("Intention.Check", args, args, reply); done { if done, err := s.srv.ForwardRPC("Intention.Check", args, reply); done {
return err return err
} }

View File

@ -3,14 +3,15 @@ package consul
import ( import (
"fmt" "fmt"
"github.com/hashicorp/consul/acl"
"github.com/hashicorp/consul/agent/consul/state"
"github.com/hashicorp/consul/agent/structs"
bexpr "github.com/hashicorp/go-bexpr" bexpr "github.com/hashicorp/go-bexpr"
"github.com/hashicorp/go-hclog" "github.com/hashicorp/go-hclog"
"github.com/hashicorp/go-memdb" "github.com/hashicorp/go-memdb"
"github.com/hashicorp/go-multierror" "github.com/hashicorp/go-multierror"
"github.com/hashicorp/serf/serf" "github.com/hashicorp/serf/serf"
"github.com/hashicorp/consul/acl"
"github.com/hashicorp/consul/agent/consul/state"
"github.com/hashicorp/consul/agent/structs"
) )
// Internal endpoint is used to query the miscellaneous info that // Internal endpoint is used to query the miscellaneous info that
@ -24,7 +25,7 @@ type Internal struct {
// NodeInfo is used to retrieve information about a specific node. // NodeInfo is used to retrieve information about a specific node.
func (m *Internal) NodeInfo(args *structs.NodeSpecificRequest, func (m *Internal) NodeInfo(args *structs.NodeSpecificRequest,
reply *structs.IndexedNodeDump) error { reply *structs.IndexedNodeDump) error {
if done, err := m.srv.ForwardRPC("Internal.NodeInfo", args, args, reply); done { if done, err := m.srv.ForwardRPC("Internal.NodeInfo", args, reply); done {
return err return err
} }
@ -50,7 +51,7 @@ func (m *Internal) NodeInfo(args *structs.NodeSpecificRequest,
// NodeDump is used to generate information about all of the nodes. // NodeDump is used to generate information about all of the nodes.
func (m *Internal) NodeDump(args *structs.DCSpecificRequest, func (m *Internal) NodeDump(args *structs.DCSpecificRequest,
reply *structs.IndexedNodeDump) error { reply *structs.IndexedNodeDump) error {
if done, err := m.srv.ForwardRPC("Internal.NodeDump", args, args, reply); done { if done, err := m.srv.ForwardRPC("Internal.NodeDump", args, reply); done {
return err return err
} }
@ -89,7 +90,7 @@ func (m *Internal) NodeDump(args *structs.DCSpecificRequest,
} }
func (m *Internal) ServiceDump(args *structs.ServiceDumpRequest, reply *structs.IndexedNodesWithGateways) error { func (m *Internal) ServiceDump(args *structs.ServiceDumpRequest, reply *structs.IndexedNodesWithGateways) error {
if done, err := m.srv.ForwardRPC("Internal.ServiceDump", args, args, reply); done { if done, err := m.srv.ForwardRPC("Internal.ServiceDump", args, reply); done {
return err return err
} }
@ -145,7 +146,7 @@ func (m *Internal) ServiceDump(args *structs.ServiceDumpRequest, reply *structs.
} }
func (m *Internal) ServiceTopology(args *structs.ServiceSpecificRequest, reply *structs.IndexedServiceTopology) error { func (m *Internal) ServiceTopology(args *structs.ServiceSpecificRequest, reply *structs.IndexedServiceTopology) error {
if done, err := m.srv.ForwardRPC("Internal.ServiceTopology", args, args, reply); done { if done, err := m.srv.ForwardRPC("Internal.ServiceTopology", args, reply); done {
return err return err
} }
if args.ServiceName == "" { if args.ServiceName == "" {
@ -199,7 +200,7 @@ func (m *Internal) IntentionUpstreams(args *structs.ServiceSpecificRequest, repl
if args.ServiceName == "" { if args.ServiceName == "" {
return fmt.Errorf("Must provide a service name") return fmt.Errorf("Must provide a service name")
} }
if done, err := m.srv.ForwardRPC("Internal.IntentionUpstreams", args, args, reply); done { if done, err := m.srv.ForwardRPC("Internal.IntentionUpstreams", args, reply); done {
return err return err
} }
@ -233,7 +234,7 @@ func (m *Internal) IntentionUpstreams(args *structs.ServiceSpecificRequest, repl
// GatewayServiceNodes returns all the nodes for services associated with a gateway along with their gateway config // GatewayServiceNodes returns all the nodes for services associated with a gateway along with their gateway config
func (m *Internal) GatewayServiceDump(args *structs.ServiceSpecificRequest, reply *structs.IndexedServiceDump) error { func (m *Internal) GatewayServiceDump(args *structs.ServiceSpecificRequest, reply *structs.IndexedServiceDump) error {
if done, err := m.srv.ForwardRPC("Internal.GatewayServiceDump", args, args, reply); done { if done, err := m.srv.ForwardRPC("Internal.GatewayServiceDump", args, reply); done {
return err return err
} }
@ -312,7 +313,7 @@ func (m *Internal) GatewayServiceDump(args *structs.ServiceSpecificRequest, repl
// Match returns the set of intentions that match the given source/destination. // Match returns the set of intentions that match the given source/destination.
func (m *Internal) GatewayIntentions(args *structs.IntentionQueryRequest, reply *structs.IndexedIntentions) error { func (m *Internal) GatewayIntentions(args *structs.IntentionQueryRequest, reply *structs.IndexedIntentions) error {
// Forward if necessary // Forward if necessary
if done, err := m.srv.ForwardRPC("Internal.GatewayIntentions", args, args, reply); done { if done, err := m.srv.ForwardRPC("Internal.GatewayIntentions", args, reply); done {
return err return err
} }
@ -398,7 +399,7 @@ func (m *Internal) GatewayIntentions(args *structs.IntentionQueryRequest, reply
// triggered in a remote DC. // triggered in a remote DC.
func (m *Internal) EventFire(args *structs.EventFireRequest, func (m *Internal) EventFire(args *structs.EventFireRequest,
reply *structs.EventFireResponse) error { reply *structs.EventFireResponse) error {
if done, err := m.srv.ForwardRPC("Internal.EventFire", args, args, reply); done { if done, err := m.srv.ForwardRPC("Internal.EventFire", args, reply); done {
return err return err
} }

View File

@ -96,7 +96,7 @@ func kvsPreApply(logger hclog.Logger, srv *Server, authz acl.Authorizer, op api.
// Apply is used to apply a KVS update request to the data store. // Apply is used to apply a KVS update request to the data store.
func (k *KVS) Apply(args *structs.KVSRequest, reply *bool) error { func (k *KVS) Apply(args *structs.KVSRequest, reply *bool) error {
if done, err := k.srv.ForwardRPC("KVS.Apply", args, args, reply); done { if done, err := k.srv.ForwardRPC("KVS.Apply", args, reply); done {
return err return err
} }
defer metrics.MeasureSince([]string{"kvs", "apply"}, time.Now()) defer metrics.MeasureSince([]string{"kvs", "apply"}, time.Now())
@ -135,7 +135,7 @@ func (k *KVS) Apply(args *structs.KVSRequest, reply *bool) error {
// Get is used to lookup a single key. // Get is used to lookup a single key.
func (k *KVS) Get(args *structs.KeyRequest, reply *structs.IndexedDirEntries) error { func (k *KVS) Get(args *structs.KeyRequest, reply *structs.IndexedDirEntries) error {
if done, err := k.srv.ForwardRPC("KVS.Get", args, args, reply); done { if done, err := k.srv.ForwardRPC("KVS.Get", args, reply); done {
return err return err
} }
@ -180,7 +180,7 @@ func (k *KVS) Get(args *structs.KeyRequest, reply *structs.IndexedDirEntries) er
// List is used to list all keys with a given prefix. // List is used to list all keys with a given prefix.
func (k *KVS) List(args *structs.KeyRequest, reply *structs.IndexedDirEntries) error { func (k *KVS) List(args *structs.KeyRequest, reply *structs.IndexedDirEntries) error {
if done, err := k.srv.ForwardRPC("KVS.List", args, args, reply); done { if done, err := k.srv.ForwardRPC("KVS.List", args, reply); done {
return err return err
} }
@ -232,7 +232,7 @@ func (k *KVS) List(args *structs.KeyRequest, reply *structs.IndexedDirEntries) e
// of the response so that only a subset of the prefix is returned. In this // of the response so that only a subset of the prefix is returned. In this
// mode, the keys which are omitted are still counted in the returned index. // mode, the keys which are omitted are still counted in the returned index.
func (k *KVS) ListKeys(args *structs.KeyListRequest, reply *structs.IndexedKeyList) error { func (k *KVS) ListKeys(args *structs.KeyListRequest, reply *structs.IndexedKeyList) error {
if done, err := k.srv.ForwardRPC("KVS.ListKeys", args, args, reply); done { if done, err := k.srv.ForwardRPC("KVS.ListKeys", args, reply); done {
return err return err
} }

View File

@ -12,7 +12,7 @@ import (
// AutopilotGetConfiguration is used to retrieve the current Autopilot configuration. // AutopilotGetConfiguration is used to retrieve the current Autopilot configuration.
func (op *Operator) AutopilotGetConfiguration(args *structs.DCSpecificRequest, reply *structs.AutopilotConfig) error { func (op *Operator) AutopilotGetConfiguration(args *structs.DCSpecificRequest, reply *structs.AutopilotConfig) error {
if done, err := op.srv.ForwardRPC("Operator.AutopilotGetConfiguration", args, args, reply); done { if done, err := op.srv.ForwardRPC("Operator.AutopilotGetConfiguration", args, reply); done {
return err return err
} }
@ -44,7 +44,7 @@ func (op *Operator) AutopilotGetConfiguration(args *structs.DCSpecificRequest, r
// AutopilotSetConfiguration is used to set the current Autopilot configuration. // AutopilotSetConfiguration is used to set the current Autopilot configuration.
func (op *Operator) AutopilotSetConfiguration(args *structs.AutopilotSetConfigRequest, reply *bool) error { func (op *Operator) AutopilotSetConfiguration(args *structs.AutopilotSetConfigRequest, reply *bool) error {
if done, err := op.srv.ForwardRPC("Operator.AutopilotSetConfiguration", args, args, reply); done { if done, err := op.srv.ForwardRPC("Operator.AutopilotSetConfiguration", args, reply); done {
return err return err
} }
@ -79,7 +79,7 @@ func (op *Operator) ServerHealth(args *structs.DCSpecificRequest, reply *structs
// re-using a structure where we don't support all the options. // re-using a structure where we don't support all the options.
args.RequireConsistent = true args.RequireConsistent = true
args.AllowStale = false args.AllowStale = false
if done, err := op.srv.ForwardRPC("Operator.ServerHealth", args, args, reply); done { if done, err := op.srv.ForwardRPC("Operator.ServerHealth", args, reply); done {
return err return err
} }
@ -146,7 +146,7 @@ func (op *Operator) AutopilotState(args *structs.DCSpecificRequest, reply *autop
// re-using a structure where we don't support all the options. // re-using a structure where we don't support all the options.
args.RequireConsistent = true args.RequireConsistent = true
args.AllowStale = false args.AllowStale = false
if done, err := op.srv.ForwardRPC("Operator.AutopilotState", args, args, reply); done { if done, err := op.srv.ForwardRPC("Operator.AutopilotState", args, reply); done {
return err return err
} }

View File

@ -4,16 +4,17 @@ import (
"fmt" "fmt"
"net" "net"
"github.com/hashicorp/raft"
"github.com/hashicorp/serf/serf"
"github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/acl"
"github.com/hashicorp/consul/agent/metadata" "github.com/hashicorp/consul/agent/metadata"
"github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/agent/structs"
"github.com/hashicorp/raft"
"github.com/hashicorp/serf/serf"
) )
// RaftGetConfiguration is used to retrieve the current Raft configuration. // RaftGetConfiguration is used to retrieve the current Raft configuration.
func (op *Operator) RaftGetConfiguration(args *structs.DCSpecificRequest, reply *structs.RaftConfigurationResponse) error { func (op *Operator) RaftGetConfiguration(args *structs.DCSpecificRequest, reply *structs.RaftConfigurationResponse) error {
if done, err := op.srv.ForwardRPC("Operator.RaftGetConfiguration", args, args, reply); done { if done, err := op.srv.ForwardRPC("Operator.RaftGetConfiguration", args, reply); done {
return err return err
} }
@ -74,7 +75,7 @@ func (op *Operator) RaftGetConfiguration(args *structs.DCSpecificRequest, reply
// "IP:port". The reply argument is not used, but it required to fulfill the RPC // "IP:port". The reply argument is not used, but it required to fulfill the RPC
// interface. // interface.
func (op *Operator) RaftRemovePeerByAddress(args *structs.RaftRemovePeerRequest, reply *struct{}) error { func (op *Operator) RaftRemovePeerByAddress(args *structs.RaftRemovePeerRequest, reply *struct{}) error {
if done, err := op.srv.ForwardRPC("Operator.RaftRemovePeerByAddress", args, args, reply); done { if done, err := op.srv.ForwardRPC("Operator.RaftRemovePeerByAddress", args, reply); done {
return err return err
} }
@ -127,7 +128,7 @@ REMOVE:
// "IP:port". The reply argument is not used, but is required to fulfill the RPC // "IP:port". The reply argument is not used, but is required to fulfill the RPC
// interface. // interface.
func (op *Operator) RaftRemovePeerByID(args *structs.RaftRemovePeerRequest, reply *struct{}) error { func (op *Operator) RaftRemovePeerByID(args *structs.RaftRemovePeerRequest, reply *struct{}) error {
if done, err := op.srv.ForwardRPC("Operator.RaftRemovePeerByID", args, args, reply); done { if done, err := op.srv.ForwardRPC("Operator.RaftRemovePeerByID", args, reply); done {
return err return err
} }

View File

@ -46,7 +46,7 @@ type PreparedQuery struct {
// only be used for operations that modify the data. The ID of the session is // only be used for operations that modify the data. The ID of the session is
// returned in the reply. // returned in the reply.
func (p *PreparedQuery) Apply(args *structs.PreparedQueryRequest, reply *string) (err error) { func (p *PreparedQuery) Apply(args *structs.PreparedQueryRequest, reply *string) (err error) {
if done, err := p.srv.ForwardRPC("PreparedQuery.Apply", args, args, reply); done { if done, err := p.srv.ForwardRPC("PreparedQuery.Apply", args, reply); done {
return err return err
} }
defer metrics.MeasureSince([]string{"prepared-query", "apply"}, time.Now()) defer metrics.MeasureSince([]string{"prepared-query", "apply"}, time.Now())
@ -225,7 +225,7 @@ func parseDNS(dns *structs.QueryDNSOptions) error {
// Get returns a single prepared query by ID. // Get returns a single prepared query by ID.
func (p *PreparedQuery) Get(args *structs.PreparedQuerySpecificRequest, func (p *PreparedQuery) Get(args *structs.PreparedQuerySpecificRequest,
reply *structs.IndexedPreparedQueries) error { reply *structs.IndexedPreparedQueries) error {
if done, err := p.srv.ForwardRPC("PreparedQuery.Get", args, args, reply); done { if done, err := p.srv.ForwardRPC("PreparedQuery.Get", args, reply); done {
return err return err
} }
@ -269,7 +269,7 @@ func (p *PreparedQuery) Get(args *structs.PreparedQuerySpecificRequest,
// List returns all the prepared queries. // List returns all the prepared queries.
func (p *PreparedQuery) List(args *structs.DCSpecificRequest, reply *structs.IndexedPreparedQueries) error { func (p *PreparedQuery) List(args *structs.DCSpecificRequest, reply *structs.IndexedPreparedQueries) error {
if done, err := p.srv.ForwardRPC("PreparedQuery.List", args, args, reply); done { if done, err := p.srv.ForwardRPC("PreparedQuery.List", args, reply); done {
return err return err
} }
@ -293,7 +293,7 @@ func (p *PreparedQuery) List(args *structs.DCSpecificRequest, reply *structs.Ind
// will be executed here. // will be executed here.
func (p *PreparedQuery) Explain(args *structs.PreparedQueryExecuteRequest, func (p *PreparedQuery) Explain(args *structs.PreparedQueryExecuteRequest,
reply *structs.PreparedQueryExplainResponse) error { reply *structs.PreparedQueryExplainResponse) error {
if done, err := p.srv.ForwardRPC("PreparedQuery.Explain", args, args, reply); done { if done, err := p.srv.ForwardRPC("PreparedQuery.Explain", args, reply); done {
return err return err
} }
defer metrics.MeasureSince([]string{"prepared-query", "explain"}, time.Now()) defer metrics.MeasureSince([]string{"prepared-query", "explain"}, time.Now())
@ -340,7 +340,7 @@ func (p *PreparedQuery) Explain(args *structs.PreparedQueryExecuteRequest,
// part of a DNS lookup, or when executing prepared queries from the HTTP API. // part of a DNS lookup, or when executing prepared queries from the HTTP API.
func (p *PreparedQuery) Execute(args *structs.PreparedQueryExecuteRequest, func (p *PreparedQuery) Execute(args *structs.PreparedQueryExecuteRequest,
reply *structs.PreparedQueryExecuteResponse) error { reply *structs.PreparedQueryExecuteResponse) error {
if done, err := p.srv.ForwardRPC("PreparedQuery.Execute", args, args, reply); done { if done, err := p.srv.ForwardRPC("PreparedQuery.Execute", args, reply); done {
return err return err
} }
defer metrics.MeasureSince([]string{"prepared-query", "execute"}, time.Now()) defer metrics.MeasureSince([]string{"prepared-query", "execute"}, time.Now())
@ -475,7 +475,7 @@ func (p *PreparedQuery) Execute(args *structs.PreparedQueryExecuteRequest,
// We don't want things to fan out further than one level. // We don't want things to fan out further than one level.
func (p *PreparedQuery) ExecuteRemote(args *structs.PreparedQueryExecuteRemoteRequest, func (p *PreparedQuery) ExecuteRemote(args *structs.PreparedQueryExecuteRemoteRequest,
reply *structs.PreparedQueryExecuteResponse) error { reply *structs.PreparedQueryExecuteResponse) error {
if done, err := p.srv.ForwardRPC("PreparedQuery.ExecuteRemote", args, args, reply); done { if done, err := p.srv.ForwardRPC("PreparedQuery.ExecuteRemote", args, reply); done {
return err return err
} }
defer metrics.MeasureSince([]string{"prepared-query", "execute_remote"}, time.Now()) defer metrics.MeasureSince([]string{"prepared-query", "execute_remote"}, time.Now())

View File

@ -92,9 +92,7 @@ const (
enqueueLimit = 30 * time.Second enqueueLimit = 30 * time.Second
) )
var ( var ErrChunkingResubmit = errors.New("please resubmit call for rechunking")
ErrChunkingResubmit = errors.New("please resubmit call for rechunking")
)
func (s *Server) rpcLogger() hclog.Logger { func (s *Server) rpcLogger() hclog.Logger {
return s.loggers.Named(logging.RPC) return s.loggers.Named(logging.RPC)
@ -527,8 +525,8 @@ func (c *limitedConn) Read(b []byte) (n int, err error) {
return c.lr.Read(b) return c.lr.Read(b)
} }
// canRetry returns true if the given situation is safe for a retry. // canRetry returns true if the request and error indicate that a retry is safe.
func canRetry(args interface{}, err error) bool { func canRetry(info structs.RPCInfo, err error) bool {
// No leader errors are always safe to retry since no state could have // No leader errors are always safe to retry since no state could have
// been changed. // been changed.
if structs.IsErrNoLeader(err) { if structs.IsErrNoLeader(err) {
@ -542,26 +540,21 @@ func canRetry(args interface{}, err error) bool {
// Reads are safe to retry for stream errors, such as if a server was // Reads are safe to retry for stream errors, such as if a server was
// being shut down. // being shut down.
info, ok := args.(structs.RPCInfo) return info != nil && info.IsRead() && lib.IsErrEOF(err)
if ok && info.IsRead() && lib.IsErrEOF(err) {
return true
}
return false
} }
// ForwardRPC is used to forward an RPC request to a remote DC or to the local leader // ForwardRPC is used to forward an RPC request to a remote DC or to the local leader
// Returns a bool of if forwarding was performed, as well as any error // Returns a bool of if forwarding was performed, as well as any error
func (s *Server) ForwardRPC(method string, info structs.RPCInfo, args interface{}, reply interface{}) (bool, error) { func (s *Server) ForwardRPC(method string, req structs.RPCInfo, reply interface{}) (bool, error) {
var firstCheck time.Time var firstCheck time.Time
// Handle DC forwarding // Handle DC forwarding
dc := info.RequestDatacenter() dc := req.RequestDatacenter()
if dc != s.config.Datacenter { if dc != s.config.Datacenter {
// Local tokens only work within the current datacenter. Check to see // Local tokens only work within the current datacenter. Check to see
// if we are attempting to forward one to a remote datacenter and strip // if we are attempting to forward one to a remote datacenter and strip
// it, falling back on the anonymous token on the other end. // it, falling back on the anonymous token on the other end.
if token := info.TokenSecret(); token != "" { if token := req.TokenSecret(); token != "" {
done, ident, err := s.ResolveIdentityFromToken(token) done, ident, err := s.ResolveIdentityFromToken(token)
if done { if done {
if err != nil && !acl.IsErrNotFound(err) { if err != nil && !acl.IsErrNotFound(err) {
@ -569,18 +562,18 @@ func (s *Server) ForwardRPC(method string, info structs.RPCInfo, args interface{
} }
if ident != nil && ident.IsLocal() { if ident != nil && ident.IsLocal() {
// Strip it from the request. // Strip it from the request.
info.SetTokenSecret("") req.SetTokenSecret("")
defer info.SetTokenSecret(token) defer req.SetTokenSecret(token)
} }
} }
} }
err := s.forwardDC(method, dc, args, reply) err := s.forwardDC(method, dc, req, reply)
return true, err return true, err
} }
// Check if we can allow a stale read, ensure our local DB is initialized // Check if we can allow a stale read, ensure our local DB is initialized
if info.IsRead() && info.AllowStaleRead() && !s.raft.LastContact().IsZero() { if req.IsRead() && req.AllowStaleRead() && !s.raft.LastContact().IsZero() {
return false, nil return false, nil
} }
@ -603,8 +596,8 @@ CHECK_LEADER:
// Handle the case of a known leader // Handle the case of a known leader
if leader != nil { if leader != nil {
rpcErr = s.connPool.RPC(s.config.Datacenter, leader.ShortName, leader.Addr, rpcErr = s.connPool.RPC(s.config.Datacenter, leader.ShortName, leader.Addr,
method, args, reply) method, req, reply)
if rpcErr != nil && canRetry(info, rpcErr) { if rpcErr != nil && canRetry(req, rpcErr) {
goto RETRY goto RETRY
} }
return true, rpcErr return true, rpcErr
@ -790,11 +783,6 @@ func (s *Server) raftApplyWithEncoder(
// In this case we didn't apply all chunks successfully, possibly due // In this case we didn't apply all chunks successfully, possibly due
// to a term change; resubmit // to a term change; resubmit
if resp == nil { if resp == nil {
// This returns the error in the interface because the raft library
// returns errors from the FSM via the future, not via err from the
// apply function. Downstream client code expects to see any error
// from the FSM (as opposed to the apply itself) and decide whether
// it can retry in the future's response.
return nil, ErrChunkingResubmit return nil, ErrChunkingResubmit
} }
// We expect that this conversion should always work // We expect that this conversion should always work

View File

@ -4,6 +4,8 @@ import (
"bytes" "bytes"
"encoding/binary" "encoding/binary"
"errors" "errors"
"fmt"
"io"
"math" "math"
"net" "net"
"os" "os"
@ -12,6 +14,11 @@ import (
"testing" "testing"
"time" "time"
"github.com/hashicorp/go-memdb"
msgpackrpc "github.com/hashicorp/net-rpc-msgpackrpc"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/acl"
"github.com/hashicorp/consul/agent/consul/state" "github.com/hashicorp/consul/agent/consul/state"
"github.com/hashicorp/consul/agent/pool" "github.com/hashicorp/consul/agent/pool"
@ -20,10 +27,6 @@ import (
"github.com/hashicorp/consul/api" "github.com/hashicorp/consul/api"
"github.com/hashicorp/consul/sdk/testutil/retry" "github.com/hashicorp/consul/sdk/testutil/retry"
"github.com/hashicorp/consul/testrpc" "github.com/hashicorp/consul/testrpc"
"github.com/hashicorp/go-memdb"
msgpackrpc "github.com/hashicorp/net-rpc-msgpackrpc"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
) )
func TestRPC_NoLeader_Fail(t *testing.T) { func TestRPC_NoLeader_Fail(t *testing.T) {
@ -952,3 +955,59 @@ func TestRPC_LocalTokenStrippedOnForward(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, localToken2.SecretID, arg.WriteRequest.Token, "token should not be stripped") require.Equal(t, localToken2.SecretID, arg.WriteRequest.Token, "token should not be stripped")
} }
func TestCanRetry(t *testing.T) {
type testCase struct {
name string
req structs.RPCInfo
err error
expected bool
}
run := func(t *testing.T, tc testCase) {
require.Equal(t, tc.expected, canRetry(tc.req, tc.err))
}
var testCases = []testCase{
{
name: "unexpected error",
err: fmt.Errorf("some arbitrary error"),
expected: false,
},
{
name: "checking error",
err: fmt.Errorf("some wrapping :%w", ErrChunkingResubmit),
expected: true,
},
{
name: "no leader error",
err: fmt.Errorf("some wrapping: %w", structs.ErrNoLeader),
expected: true,
},
{
name: "EOF on read request",
req: isReadRequest{},
err: io.EOF,
expected: true,
},
{
name: "EOF on write request",
err: io.EOF,
expected: false,
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
run(t, tc)
})
}
}
type isReadRequest struct {
structs.RPCInfo
}
func (r isReadRequest) IsRead() bool {
return true
}

View File

@ -45,7 +45,7 @@ func fixupSessionSpecificRequest(args *structs.SessionSpecificRequest) {
// Apply is used to apply a modifying request to the data store. This should // Apply is used to apply a modifying request to the data store. This should
// only be used for operations that modify the data // only be used for operations that modify the data
func (s *Session) Apply(args *structs.SessionRequest, reply *string) error { func (s *Session) Apply(args *structs.SessionRequest, reply *string) error {
if done, err := s.srv.ForwardRPC("Session.Apply", args, args, reply); done { if done, err := s.srv.ForwardRPC("Session.Apply", args, reply); done {
return err return err
} }
defer metrics.MeasureSince([]string{"session", "apply"}, time.Now()) defer metrics.MeasureSince([]string{"session", "apply"}, time.Now())
@ -170,7 +170,7 @@ func (s *Session) Apply(args *structs.SessionRequest, reply *string) error {
// Get is used to retrieve a single session // Get is used to retrieve a single session
func (s *Session) Get(args *structs.SessionSpecificRequest, func (s *Session) Get(args *structs.SessionSpecificRequest,
reply *structs.IndexedSessions) error { reply *structs.IndexedSessions) error {
if done, err := s.srv.ForwardRPC("Session.Get", args, args, reply); done { if done, err := s.srv.ForwardRPC("Session.Get", args, reply); done {
return err return err
} }
@ -211,7 +211,7 @@ func (s *Session) Get(args *structs.SessionSpecificRequest,
// List is used to list all the active sessions // List is used to list all the active sessions
func (s *Session) List(args *structs.SessionSpecificRequest, func (s *Session) List(args *structs.SessionSpecificRequest,
reply *structs.IndexedSessions) error { reply *structs.IndexedSessions) error {
if done, err := s.srv.ForwardRPC("Session.List", args, args, reply); done { if done, err := s.srv.ForwardRPC("Session.List", args, reply); done {
return err return err
} }
@ -245,7 +245,7 @@ func (s *Session) List(args *structs.SessionSpecificRequest,
// NodeSessions is used to get all the sessions for a particular node // NodeSessions is used to get all the sessions for a particular node
func (s *Session) NodeSessions(args *structs.NodeSpecificRequest, func (s *Session) NodeSessions(args *structs.NodeSpecificRequest,
reply *structs.IndexedSessions) error { reply *structs.IndexedSessions) error {
if done, err := s.srv.ForwardRPC("Session.NodeSessions", args, args, reply); done { if done, err := s.srv.ForwardRPC("Session.NodeSessions", args, reply); done {
return err return err
} }
@ -279,7 +279,7 @@ func (s *Session) NodeSessions(args *structs.NodeSpecificRequest,
// Renew is used to renew the TTL on a single session // Renew is used to renew the TTL on a single session
func (s *Session) Renew(args *structs.SessionSpecificRequest, func (s *Session) Renew(args *structs.SessionSpecificRequest,
reply *structs.IndexedSessions) error { reply *structs.IndexedSessions) error {
if done, err := s.srv.ForwardRPC("Session.Renew", args, args, reply); done { if done, err := s.srv.ForwardRPC("Session.Renew", args, reply); done {
return err return err
} }

View File

@ -121,7 +121,7 @@ func (t *Txn) preCheck(authorizer acl.Authorizer, ops structs.TxnOps) structs.Tx
// Apply is used to apply multiple operations in a single, atomic transaction. // Apply is used to apply multiple operations in a single, atomic transaction.
func (t *Txn) Apply(args *structs.TxnRequest, reply *structs.TxnResponse) error { func (t *Txn) Apply(args *structs.TxnRequest, reply *structs.TxnResponse) error {
if done, err := t.srv.ForwardRPC("Txn.Apply", args, args, reply); done { if done, err := t.srv.ForwardRPC("Txn.Apply", args, reply); done {
return err return err
} }
defer metrics.MeasureSince([]string{"txn", "apply"}, time.Now()) defer metrics.MeasureSince([]string{"txn", "apply"}, time.Now())
@ -160,7 +160,7 @@ func (t *Txn) Apply(args *structs.TxnRequest, reply *structs.TxnResponse) error
// supports staleness, so this should be preferred if you're just performing // supports staleness, so this should be preferred if you're just performing
// reads. // reads.
func (t *Txn) Read(args *structs.TxnReadRequest, reply *structs.TxnReadResponse) error { func (t *Txn) Read(args *structs.TxnReadRequest, reply *structs.TxnReadResponse) error {
if done, err := t.srv.ForwardRPC("Txn.Read", args, args, reply); done { if done, err := t.srv.ForwardRPC("Txn.Read", args, reply); done {
return err return err
} }
defer metrics.MeasureSince([]string{"txn", "read"}, time.Now()) defer metrics.MeasureSince([]string{"txn", "read"}, time.Now())

View File

@ -39,7 +39,7 @@ load helpers
@test "s1 proxy should have been configured with one rbac listener filter at L4" { @test "s1 proxy should have been configured with one rbac listener filter at L4" {
LISTEN_FILTERS=$(get_envoy_listener_filters localhost:19000) LISTEN_FILTERS=$(get_envoy_listener_filters localhost:19000)
PUB=$(echo "$LISTEN_FILTERS" | grep -E "^public_listener:" | cut -f 2 -d ' ' ) PUB=$(echo "$LISTEN_FILTERS" | grep -E "^public_listener:" | cut -f 2 -d ' ' )
UPS=$(echo "$LISTEN_FILTERS" | grep -E "^(default\/)?s2:" | cut -f 2 -d ' ' ) UPS=$(echo "$LISTEN_FILTERS" | grep -E "^(\/default\/)?s2:" | cut -f 2 -d ' ' )
echo "LISTEN_FILTERS = $LISTEN_FILTERS" echo "LISTEN_FILTERS = $LISTEN_FILTERS"
echo "PUB = $PUB" echo "PUB = $PUB"

View File

@ -36,7 +36,7 @@ load helpers
@test "s1 proxy should have been configured with http connection managers" { @test "s1 proxy should have been configured with http connection managers" {
LISTEN_FILTERS=$(get_envoy_listener_filters localhost:19000) LISTEN_FILTERS=$(get_envoy_listener_filters localhost:19000)
PUB=$(echo "$LISTEN_FILTERS" | grep -E "^public_listener:" | cut -f 2 -d ' ' ) PUB=$(echo "$LISTEN_FILTERS" | grep -E "^public_listener:" | cut -f 2 -d ' ' )
UPS=$(echo "$LISTEN_FILTERS" | grep -E "^(default\/)?s2:" | cut -f 2 -d ' ' ) UPS=$(echo "$LISTEN_FILTERS" | grep -E "^(\/default\/)?s2:" | cut -f 2 -d ' ' )
echo "LISTEN_FILTERS = $LISTEN_FILTERS" echo "LISTEN_FILTERS = $LISTEN_FILTERS"
echo "PUB = $PUB" echo "PUB = $PUB"
@ -59,7 +59,7 @@ load helpers
@test "s1 proxy should have been configured with http rbac filters" { @test "s1 proxy should have been configured with http rbac filters" {
HTTP_FILTERS=$(get_envoy_http_filters localhost:19000) HTTP_FILTERS=$(get_envoy_http_filters localhost:19000)
PUB=$(echo "$HTTP_FILTERS" | grep -E "^public_listener:" | cut -f 2 -d ' ' ) PUB=$(echo "$HTTP_FILTERS" | grep -E "^public_listener:" | cut -f 2 -d ' ' )
UPS=$(echo "$HTTP_FILTERS" | grep -E "^(default\/)?s2:" | cut -f 2 -d ' ' ) UPS=$(echo "$HTTP_FILTERS" | grep -E "^(\/default\/)?s2:" | cut -f 2 -d ' ' )
echo "HTTP_FILTERS = $HTTP_FILTERS" echo "HTTP_FILTERS = $HTTP_FILTERS"
echo "PUB = $PUB" echo "PUB = $PUB"