[arvados] created: 2.5.0-225-gaa6a9ab30

git repository hosting git at public.arvados.org
Fri Mar 3 19:47:11 UTC 2023


        at  aa6a9ab30ff48d1e4450a2ad7319df3be1ef8d49 (commit)


commit aa6a9ab30ff48d1e4450a2ad7319df3be1ef8d49
Author: Peter Amstutz <peter.amstutz at curii.com>
Date:   Fri Mar 3 14:46:48 2023 -0500

    20200: Add limiter for log create requests, WIP
    
    Arvados-DCO-1.1-Signed-off-by: Peter Amstutz <peter.amstutz at curii.com>

diff --git a/lib/boot/helpers.go b/lib/boot/helpers.go
index 77036e934..6463de7d7 100644
--- a/lib/boot/helpers.go
+++ b/lib/boot/helpers.go
@@ -92,5 +92,5 @@ func (super *Supervisor) AnonymousClients(clusterID string) (context.Context, *a
 // specified cluster.
 func (super *Supervisor) Conn(clusterID string) *rpc.Conn {
 	controllerURL := url.URL(super.Cluster(clusterID).Services.Controller.ExternalURL)
-	return rpc.NewConn(clusterID, &controllerURL, true, rpc.PassthroughTokenProvider)
+	return rpc.NewConn(clusterID, &controllerURL, true, rpc.PassthroughTokenProvider, 0)
 }
diff --git a/lib/config/config.default.yml b/lib/config/config.default.yml
index 527439571..32a1b0313 100644
--- a/lib/config/config.default.yml
+++ b/lib/config/config.default.yml
@@ -225,7 +225,12 @@ Clusters:
 
       # Maximum number of concurrent requests to accept in a single
       # service process, or 0 for no limit.
-      MaxConcurrentRequests: 0
+      MaxConcurrentRequests: 64
+
+      # Fraction of MaxConcurrentRequests that can be "log create"
+      # messages at any given time.  This is to prevent logging
+      # updates from crowding out more important requests.
+      LogCreateRequestFraction: 0.50
 
       # Maximum number of 64MiB memory buffers per Keepstore server process, or
       # 0 for no limit. When this limit is reached, up to
diff --git a/lib/config/export.go b/lib/config/export.go
index a8a535eeb..44fd55941 100644
--- a/lib/config/export.go
+++ b/lib/config/export.go
@@ -68,6 +68,7 @@ var whitelist = map[string]bool{
 	"API.LockBeforeUpdate":                     false,
 	"API.KeepServiceRequestTimeout":            false,
 	"API.MaxConcurrentRequests":                false,
+	"API.LogCreateRequestFraction":             false,
 	"API.MaxIndexDatabaseRead":                 false,
 	"API.MaxItemsPerResponse":                  true,
 	"API.MaxKeepBlobBuffers":                   false,
diff --git a/lib/controller/federation/conn.go b/lib/controller/federation/conn.go
index 03690af02..17fa56bdc 100644
--- a/lib/controller/federation/conn.go
+++ b/lib/controller/federation/conn.go
@@ -38,7 +38,7 @@ func New(cluster *arvados.Cluster, healthFuncs *map[string]health.Func) *Conn {
 		if !remote.Proxy || id == cluster.ClusterID {
 			continue
 		}
-		conn := rpc.NewConn(id, &url.URL{Scheme: remote.Scheme, Host: remote.Host}, remote.Insecure, saltedTokenProvider(cluster, local, id))
+		conn := rpc.NewConn(id, &url.URL{Scheme: remote.Scheme, Host: remote.Host}, remote.Insecure, saltedTokenProvider(cluster, local, id), 0)
 		// Older versions of controller rely on the Via header
 		// to detect loops.
 		conn.SendHeader = http.Header{"Via": {"HTTP/1.1 arvados-controller"}}
diff --git a/lib/controller/federation/federation_test.go b/lib/controller/federation/federation_test.go
index 5460e938a..724f7a695 100644
--- a/lib/controller/federation/federation_test.go
+++ b/lib/controller/federation/federation_test.go
@@ -93,5 +93,5 @@ func (s *FederationSuite) addHTTPRemote(c *check.C, id string, backend backend)
 		Host:   srv.Addr,
 		Proxy:  true,
 	}
-	s.fed.remotes[id] = rpc.NewConn(id, &url.URL{Scheme: "http", Host: srv.Addr}, true, saltedTokenProvider(s.cluster, s.fed.local, id))
+	s.fed.remotes[id] = rpc.NewConn(id, &url.URL{Scheme: "http", Host: srv.Addr}, true, saltedTokenProvider(s.cluster, s.fed.local, id), 0)
 }
diff --git a/lib/controller/federation/user_test.go b/lib/controller/federation/user_test.go
index 064f8ce5d..2a6655449 100644
--- a/lib/controller/federation/user_test.go
+++ b/lib/controller/federation/user_test.go
@@ -31,7 +31,7 @@ func (s *UserSuite) TestLoginClusterUserList(c *check.C) {
 	s.cluster.ClusterID = "local"
 	s.cluster.Login.LoginCluster = "zzzzz"
 	s.fed = New(s.cluster, nil)
-	s.addDirectRemote(c, "zzzzz", rpc.NewConn("zzzzz", &url.URL{Scheme: "https", Host: os.Getenv("ARVADOS_API_HOST")}, true, rpc.PassthroughTokenProvider))
+	s.addDirectRemote(c, "zzzzz", rpc.NewConn("zzzzz", &url.URL{Scheme: "https", Host: os.Getenv("ARVADOS_API_HOST")}, true, rpc.PassthroughTokenProvider, 0))
 
 	for _, updateFail := range []bool{false, true} {
 		for _, opts := range []arvados.ListOptions{
@@ -47,7 +47,7 @@ func (s *UserSuite) TestLoginClusterUserList(c *check.C) {
 			if updateFail {
 				s.fed.local = stub
 			} else {
-				s.fed.local = rpc.NewConn(s.cluster.ClusterID, spy.URL, true, rpc.PassthroughTokenProvider)
+				s.fed.local = rpc.NewConn(s.cluster.ClusterID, spy.URL, true, rpc.PassthroughTokenProvider, 0)
 			}
 			userlist, err := s.fed.UserList(s.ctx, opts)
 			if err != nil {
@@ -121,7 +121,7 @@ func (s *UserSuite) TestLoginClusterUserGet(c *check.C) {
 	s.cluster.ClusterID = "local"
 	s.cluster.Login.LoginCluster = "zzzzz"
 	s.fed = New(s.cluster, nil)
-	s.addDirectRemote(c, "zzzzz", rpc.NewConn("zzzzz", &url.URL{Scheme: "https", Host: os.Getenv("ARVADOS_API_HOST")}, true, rpc.PassthroughTokenProvider))
+	s.addDirectRemote(c, "zzzzz", rpc.NewConn("zzzzz", &url.URL{Scheme: "https", Host: os.Getenv("ARVADOS_API_HOST")}, true, rpc.PassthroughTokenProvider, 0))
 
 	opts := arvados.GetOptions{UUID: "zzzzz-tpzed-xurymjxw79nv3jz", Select: []string{"uuid", "email"}}
 
@@ -176,10 +176,10 @@ func (s *UserSuite) TestLoginClusterUserListBypassFederation(c *check.C) {
 	s.cluster.Login.LoginCluster = "zzzzz"
 	s.fed = New(s.cluster, nil)
 	s.addDirectRemote(c, "zzzzz", rpc.NewConn("zzzzz", &url.URL{Scheme: "https", Host: os.Getenv("ARVADOS_API_HOST")},
-		true, rpc.PassthroughTokenProvider))
+		true, rpc.PassthroughTokenProvider, 0))
 
 	spy := arvadostest.NewProxy(c, s.cluster.Services.RailsAPI)
-	s.fed.local = rpc.NewConn(s.cluster.ClusterID, spy.URL, true, rpc.PassthroughTokenProvider)
+	s.fed.local = rpc.NewConn(s.cluster.ClusterID, spy.URL, true, rpc.PassthroughTokenProvider, 0)
 
 	_, err := s.fed.UserList(s.ctx, arvados.ListOptions{Offset: 0, Limit: math.MaxInt64, Select: nil, BypassFederation: true})
 	// this will fail because it is not using a root token
diff --git a/lib/controller/handler_test.go b/lib/controller/handler_test.go
index 1af3ba362..00e4b32ba 100644
--- a/lib/controller/handler_test.go
+++ b/lib/controller/handler_test.go
@@ -540,7 +540,7 @@ func (s *HandlerSuite) TestLogActivity(c *check.C) {
 	defer testServer.Close()
 
 	u, _ := url.Parse("http://" + testServer.Addr)
-	client := rpc.NewConn(s.cluster.ClusterID, u, true, rpc.PassthroughTokenProvider)
+	client := rpc.NewConn(s.cluster.ClusterID, u, true, rpc.PassthroughTokenProvider, 0)
 
 	starttime := time.Now()
 	for i := 0; i < 4; i++ {
diff --git a/lib/controller/localdb/collection_test.go b/lib/controller/localdb/collection_test.go
index dac8b769f..923a3f961 100644
--- a/lib/controller/localdb/collection_test.go
+++ b/lib/controller/localdb/collection_test.go
@@ -47,7 +47,7 @@ func (s *CollectionSuite) SetUpTest(c *check.C) {
 	c.Assert(err, check.IsNil)
 	s.localdb = NewConn(s.cluster)
 	s.railsSpy = arvadostest.NewProxy(c, s.cluster.Services.RailsAPI)
-	*s.localdb.railsProxy = *rpc.NewConn(s.cluster.ClusterID, s.railsSpy.URL, true, rpc.PassthroughTokenProvider)
+	*s.localdb.railsProxy = *rpc.NewConn(s.cluster.ClusterID, s.railsSpy.URL, true, rpc.PassthroughTokenProvider, 0)
 }
 
 func (s *CollectionSuite) TearDownTest(c *check.C) {
diff --git a/lib/controller/localdb/container_gateway.go b/lib/controller/localdb/container_gateway.go
index 77c5182e9..5ba98af26 100644
--- a/lib/controller/localdb/container_gateway.go
+++ b/lib/controller/localdb/container_gateway.go
@@ -137,7 +137,7 @@ func (conn *Conn) ContainerSSH(ctx context.Context, opts arvados.ContainerSSHOpt
 			if u.String() == tunurl {
 				ctxlog.FromContext(ctx).Debugf("proxying ContainerSSH request to other controller at %s", u)
 				u := url.URL(u)
-				arpc := rpc.NewConn(conn.cluster.ClusterID, &u, conn.cluster.TLS.Insecure, rpc.PassthroughTokenProvider)
+				arpc := rpc.NewConn(conn.cluster.ClusterID, &u, conn.cluster.TLS.Insecure, rpc.PassthroughTokenProvider, 0)
 				opts.NoForward = true
 				return arpc.ContainerSSH(ctx, opts)
 			}
diff --git a/lib/controller/localdb/container_gateway_test.go b/lib/controller/localdb/container_gateway_test.go
index 3f63e7aa8..a9dabd991 100644
--- a/lib/controller/localdb/container_gateway_test.go
+++ b/lib/controller/localdb/container_gateway_test.go
@@ -352,7 +352,7 @@ func (s *ContainerGatewaySuite) testConnectThroughTunnel(c *check.C, expectError
 	}
 
 	c.Log("connecting to gateway through tunnel")
-	arpc := rpc.NewConn("", &url.URL{Scheme: "https", Host: s.gw.ArvadosClient.APIHost}, true, rpc.PassthroughTokenProvider)
+	arpc := rpc.NewConn("", &url.URL{Scheme: "https", Host: s.gw.ArvadosClient.APIHost}, true, rpc.PassthroughTokenProvider, 0)
 	sshconn, err := arpc.ContainerSSH(s.ctx, arvados.ContainerSSHOptions{UUID: s.ctrUUID})
 	if expectErrorMatch != "" {
 		c.Check(err, check.ErrorMatches, expectErrorMatch)
diff --git a/lib/controller/localdb/container_request_test.go b/lib/controller/localdb/container_request_test.go
index cca541a40..491447451 100644
--- a/lib/controller/localdb/container_request_test.go
+++ b/lib/controller/localdb/container_request_test.go
@@ -38,7 +38,7 @@ func (s *ContainerRequestSuite) SetUpTest(c *check.C) {
 	c.Assert(err, check.IsNil)
 	s.localdb = NewConn(s.cluster)
 	s.railsSpy = arvadostest.NewProxy(c, s.cluster.Services.RailsAPI)
-	*s.localdb.railsProxy = *rpc.NewConn(s.cluster.ClusterID, s.railsSpy.URL, true, rpc.PassthroughTokenProvider)
+	*s.localdb.railsProxy = *rpc.NewConn(s.cluster.ClusterID, s.railsSpy.URL, true, rpc.PassthroughTokenProvider, 0)
 }
 
 func (s *ContainerRequestSuite) TearDownTest(c *check.C) {
diff --git a/lib/controller/localdb/group_test.go b/lib/controller/localdb/group_test.go
index 78150c955..1e3a522b1 100644
--- a/lib/controller/localdb/group_test.go
+++ b/lib/controller/localdb/group_test.go
@@ -31,7 +31,7 @@ func (s *GroupSuite) SetUpSuite(c *check.C) {
 	c.Assert(err, check.IsNil)
 	s.localdb = NewConn(s.cluster)
 	s.railsSpy = arvadostest.NewProxy(c, s.cluster.Services.RailsAPI)
-	*s.localdb.railsProxy = *rpc.NewConn(s.cluster.ClusterID, s.railsSpy.URL, true, rpc.PassthroughTokenProvider)
+	*s.localdb.railsProxy = *rpc.NewConn(s.cluster.ClusterID, s.railsSpy.URL, true, rpc.PassthroughTokenProvider, 0)
 }
 
 func (s *GroupSuite) TearDownSuite(c *check.C) {
diff --git a/lib/controller/localdb/link_test.go b/lib/controller/localdb/link_test.go
index 2f07fb459..eb7521d41 100644
--- a/lib/controller/localdb/link_test.go
+++ b/lib/controller/localdb/link_test.go
@@ -38,7 +38,7 @@ func (s *LinkSuite) SetUpTest(c *check.C) {
 	c.Assert(err, check.IsNil)
 	s.localdb = NewConn(s.cluster)
 	s.railsSpy = arvadostest.NewProxy(c, s.cluster.Services.RailsAPI)
-	*s.localdb.railsProxy = *rpc.NewConn(s.cluster.ClusterID, s.railsSpy.URL, true, rpc.PassthroughTokenProvider)
+	*s.localdb.railsProxy = *rpc.NewConn(s.cluster.ClusterID, s.railsSpy.URL, true, rpc.PassthroughTokenProvider, 0)
 }
 
 func (s *LinkSuite) TearDownTest(c *check.C) {
diff --git a/lib/controller/localdb/login_oidc_test.go b/lib/controller/localdb/login_oidc_test.go
index 40cdde76f..538e3c26d 100644
--- a/lib/controller/localdb/login_oidc_test.go
+++ b/lib/controller/localdb/login_oidc_test.go
@@ -84,7 +84,7 @@ func (s *OIDCLoginSuite) SetUpTest(c *check.C) {
 	s.localdb.loginController.(*oidcLoginController).peopleAPIBasePath = s.fakeProvider.PeopleAPI.URL
 
 	s.railsSpy = arvadostest.NewProxy(c, s.cluster.Services.RailsAPI)
-	*s.localdb.railsProxy = *rpc.NewConn(s.cluster.ClusterID, s.railsSpy.URL, true, rpc.PassthroughTokenProvider)
+	*s.localdb.railsProxy = *rpc.NewConn(s.cluster.ClusterID, s.railsSpy.URL, true, rpc.PassthroughTokenProvider, 0)
 }
 
 func (s *OIDCLoginSuite) TearDownTest(c *check.C) {
@@ -478,7 +478,7 @@ func (s *OIDCLoginSuite) TestGenericOIDCLogin(c *check.C) {
 		}
 		s.railsSpy = arvadostest.NewProxy(c, s.cluster.Services.RailsAPI)
 		s.localdb = NewConn(s.cluster)
-		*s.localdb.railsProxy = *rpc.NewConn(s.cluster.ClusterID, s.railsSpy.URL, true, rpc.PassthroughTokenProvider)
+		*s.localdb.railsProxy = *rpc.NewConn(s.cluster.ClusterID, s.railsSpy.URL, true, rpc.PassthroughTokenProvider, 0)
 
 		state := s.startLogin(c, func(form url.Values) {
 			c.Check(form.Get("testkey"), check.Equals, "testvalue")
diff --git a/lib/controller/localdb/login_pam_test.go b/lib/controller/localdb/login_pam_test.go
index 0282b566f..e41ff7ac2 100644
--- a/lib/controller/localdb/login_pam_test.go
+++ b/lib/controller/localdb/login_pam_test.go
@@ -42,7 +42,7 @@ func (s *PamSuite) SetUpSuite(c *check.C) {
 	s.railsSpy = arvadostest.NewProxy(c, s.cluster.Services.RailsAPI)
 	s.ctrl = &pamLoginController{
 		Cluster: s.cluster,
-		Parent:  &Conn{railsProxy: rpc.NewConn(s.cluster.ClusterID, s.railsSpy.URL, true, rpc.PassthroughTokenProvider)},
+		Parent:  &Conn{railsProxy: rpc.NewConn(s.cluster.ClusterID, s.railsSpy.URL, true, rpc.PassthroughTokenProvider, 0)},
 	}
 	s.db = arvadostest.DB(c, s.cluster)
 }
diff --git a/lib/controller/localdb/login_testuser_test.go b/lib/controller/localdb/login_testuser_test.go
index 871761788..d2097336e 100644
--- a/lib/controller/localdb/login_testuser_test.go
+++ b/lib/controller/localdb/login_testuser_test.go
@@ -44,7 +44,7 @@ func (s *TestUserSuite) SetUpSuite(c *check.C) {
 	s.railsSpy = arvadostest.NewProxy(c, s.cluster.Services.RailsAPI)
 	s.ctrl = &testLoginController{
 		Cluster: s.cluster,
-		Parent:  &Conn{railsProxy: rpc.NewConn(s.cluster.ClusterID, s.railsSpy.URL, true, rpc.PassthroughTokenProvider)},
+		Parent:  &Conn{railsProxy: rpc.NewConn(s.cluster.ClusterID, s.railsSpy.URL, true, rpc.PassthroughTokenProvider, 0)},
 	}
 	s.db = arvadostest.DB(c, s.cluster)
 }
diff --git a/lib/controller/railsproxy/railsproxy.go b/lib/controller/railsproxy/railsproxy.go
index 515dd5df0..da12768a7 100644
--- a/lib/controller/railsproxy/railsproxy.go
+++ b/lib/controller/railsproxy/railsproxy.go
@@ -36,5 +36,9 @@ func NewConn(cluster *arvados.Cluster) *rpc.Conn {
 	if err != nil {
 		panic(err)
 	}
-	return rpc.NewConn(cluster.ClusterID, url, insecure, rpc.PassthroughTokenProvider)
+	logCreateLimit := int(float64(cluster.API.MaxConcurrentRequests) * cluster.API.LogCreateRequestFraction)
+	if logCreateLimit == 0 && cluster.API.LogCreateRequestFraction > 0 {
+		logCreateLimit = 1
+	}
+	return rpc.NewConn(cluster.ClusterID, url, insecure, rpc.PassthroughTokenProvider, logCreateLimit)
 }
diff --git a/lib/controller/router/router_test.go b/lib/controller/router/router_test.go
index 11b090a21..adc9c22da 100644
--- a/lib/controller/router/router_test.go
+++ b/lib/controller/router/router_test.go
@@ -210,7 +210,7 @@ func (s *RouterIntegrationSuite) SetUpTest(c *check.C) {
 	cluster.TLS.Insecure = true
 	arvadostest.SetServiceURL(&cluster.Services.RailsAPI, "https://"+os.Getenv("ARVADOS_TEST_API_HOST"))
 	url, _ := url.Parse("https://" + os.Getenv("ARVADOS_TEST_API_HOST"))
-	s.rtr = New(rpc.NewConn("zzzzz", url, true, rpc.PassthroughTokenProvider), Config{})
+	s.rtr = New(rpc.NewConn("zzzzz", url, true, rpc.PassthroughTokenProvider, 0), Config{})
 }
 
 func (s *RouterIntegrationSuite) TearDownSuite(c *check.C) {
diff --git a/lib/controller/rpc/conn.go b/lib/controller/rpc/conn.go
index 4d8a82ce4..40d6b7a51 100644
--- a/lib/controller/rpc/conn.go
+++ b/lib/controller/rpc/conn.go
@@ -43,13 +43,14 @@ type Conn struct {
 	SendHeader         http.Header
 	RedactHostInErrors bool
 
-	clusterID     string
-	httpClient    http.Client
-	baseURL       url.URL
-	tokenProvider TokenProvider
+	clusterID      string
+	httpClient     http.Client
+	baseURL        url.URL
+	tokenProvider  TokenProvider
+	logCreateLimit chan struct{}
 }
 
-func NewConn(clusterID string, url *url.URL, insecure bool, tp TokenProvider) *Conn {
+func NewConn(clusterID string, url *url.URL, insecure bool, tp TokenProvider, logCreateLimit int) *Conn {
 	transport := http.DefaultTransport
 	if insecure {
 		// It's not safe to copy *http.DefaultTransport
@@ -71,14 +72,21 @@ func NewConn(clusterID string, url *url.URL, insecure bool, tp TokenProvider) *C
 			TLSClientConfig:       &tls.Config{InsecureSkipVerify: true},
 		}
 	}
+	if logCreateLimit == 0 {
+		// can't have unlimited channels, and making the
+		// logCreateLimit channel "nil" make the code ugly, so
+		// just make the queue really big.
+		logCreateLimit = 1024
+	}
 	return &Conn{
 		clusterID: clusterID,
 		httpClient: http.Client{
 			CheckRedirect: func(req *http.Request, via []*http.Request) error { return http.ErrUseLastResponse },
 			Transport:     transport,
 		},
-		baseURL:       *url,
-		tokenProvider: tp,
+		baseURL:        *url,
+		tokenProvider:  tp,
+		logCreateLimit: make(chan struct{}, logCreateLimit),
 	}
 }
 
@@ -560,10 +568,16 @@ func (conn *Conn) LinkDelete(ctx context.Context, options arvados.DeleteOptions)
 }
 
 func (conn *Conn) LogCreate(ctx context.Context, options arvados.CreateOptions) (arvados.Log, error) {
-	ep := arvados.EndpointLogCreate
-	var resp arvados.Log
-	err := conn.requestAndDecode(ctx, &resp, ep, nil, options)
-	return resp, err
+	select {
+	case conn.logCreateLimit <- struct{}{}:
+		ep := arvados.EndpointLogCreate
+		var resp arvados.Log
+		err := conn.requestAndDecode(ctx, &resp, ep, nil, options)
+		<-conn.logCreateLimit
+		return resp, err
+	default:
+		return arvados.Log{}, httpError(503, errors.New("Excess log create messages"))
+	}
 }
 
 func (conn *Conn) LogUpdate(ctx context.Context, options arvados.UpdateOptions) (arvados.Log, error) {
@@ -798,3 +812,16 @@ func wrapHTTPStatusError(err httpStatusError, message string) httpStatusError {
 func (err wrappedHTTPStatusError) Error() string {
 	return err.message
 }
+
+type errorWithStatus struct {
+	code int
+	error
+}
+
+func (err errorWithStatus) HTTPStatus() int {
+	return err.code
+}
+
+func httpError(code int, err error) error {
+	return errorWithStatus{code: code, error: err}
+}
diff --git a/lib/controller/rpc/conn_test.go b/lib/controller/rpc/conn_test.go
index eee8db9ac..614c9b8a6 100644
--- a/lib/controller/rpc/conn_test.go
+++ b/lib/controller/rpc/conn_test.go
@@ -42,7 +42,7 @@ func (s *RPCSuite) SetUpTest(c *check.C) {
 	s.conn = NewConn("zzzzz", &url.URL{Scheme: "https", Host: os.Getenv("ARVADOS_TEST_API_HOST")}, true, func(ctx context.Context) ([]string, error) {
 		tokens, _ := ctx.Value(contextKeyTestTokens).([]string)
 		return tokens, nil
-	})
+	}, 0)
 }
 
 func (s *RPCSuite) TestLogin(c *check.C) {
diff --git a/lib/crunchrun/container_gateway.go b/lib/crunchrun/container_gateway.go
index 3cb93fc74..64de21a43 100644
--- a/lib/crunchrun/container_gateway.go
+++ b/lib/crunchrun/container_gateway.go
@@ -207,7 +207,7 @@ func (gw *Gateway) maintainTunnel(addr string) {
 // addr.
 func (gw *Gateway) runTunnel(addr string) error {
 	ctx := auth.NewContext(context.Background(), auth.NewCredentials(gw.ArvadosClient.AuthToken))
-	arpc := rpc.NewConn("", &url.URL{Scheme: "https", Host: gw.ArvadosClient.APIHost}, gw.ArvadosClient.Insecure, rpc.PassthroughTokenProvider)
+	arpc := rpc.NewConn("", &url.URL{Scheme: "https", Host: gw.ArvadosClient.APIHost}, gw.ArvadosClient.Insecure, rpc.PassthroughTokenProvider, 0)
 	tun, err := arpc.ContainerGatewayTunnel(ctx, arvados.ContainerGatewayTunnelOptions{
 		UUID:       gw.ContainerUUID,
 		AuthSecret: gw.AuthSecret,
diff --git a/lib/install/init.go b/lib/install/init.go
index c362c32b8..6d3dc25c2 100644
--- a/lib/install/init.go
+++ b/lib/install/init.go
@@ -392,7 +392,7 @@ func (initcmd *initCommand) RunCommand(prog string, args []string, stdin io.Read
 
 		fmt.Fprintln(stderr, "checking controller API endpoint...")
 		u := url.URL(cluster.Services.Controller.ExternalURL)
-		conn := rpc.NewConn(cluster.ClusterID, &u, cluster.TLS.Insecure, rpc.PassthroughTokenProvider)
+		conn := rpc.NewConn(cluster.ClusterID, &u, cluster.TLS.Insecure, rpc.PassthroughTokenProvider, 0)
 		ctx := auth.NewContext(context.Background(), auth.NewCredentials(cluster.SystemRootToken))
 		_, err = conn.UserGetCurrent(ctx, arvados.GetOptions{})
 		if err != nil {
diff --git a/sdk/go/arvados/config.go b/sdk/go/arvados/config.go
index bf70a7603..4466b0a4d 100644
--- a/sdk/go/arvados/config.go
+++ b/sdk/go/arvados/config.go
@@ -100,6 +100,7 @@ type Cluster struct {
 		MaxIndexDatabaseRead             int
 		MaxItemsPerResponse              int
 		MaxConcurrentRequests            int
+		LogCreateRequestFraction         float64
 		MaxKeepBlobBuffers               int
 		MaxRequestAmplification          int
 		MaxRequestSize                   int

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list