[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