From 91e0823ff02135f71605e2754c23795f04aad7c8 Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Tue, 23 Nov 2021 12:02:16 -0800 Subject: [PATCH] allow service freeze/unfreeze on a setup (#13707) an active running speedTest will reject all new S3 requests to the server, until speedTest is complete. this is to ensure that speedTest results are accurate and trusted. Co-authored-by: Klaus Post --- .github/workflows/go.yml | 4 +- README.md | 2 +- cmd/admin-handler-utils.go | 19 +++-- cmd/admin-handlers.go | 40 +++++++--- cmd/globals.go | 8 ++ cmd/handler-api.go | 9 ++- cmd/notification.go | 31 ++++++++ cmd/peer-rest-common.go | 2 +- cmd/peer-rest-server.go | 7 +- cmd/service.go | 56 ++++++++++++++ go.mod | 149 +++++++++++++++++++++++++++++++++++-- go.sum | 8 +- 12 files changed, 301 insertions(+), 34 deletions(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index dcaeadd69..1104cbbbd 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -7,7 +7,7 @@ on: # This ensures that previous jobs for the PR are canceled when the PR is # updated. -concurrency: +concurrency: group: ${{ github.workflow }}-${{ github.head_ref }} cancel-in-progress: true @@ -17,7 +17,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - go-version: [1.16.x, 1.17.x] + go-version: [1.17.x] os: [ubuntu-latest] steps: - uses: actions/checkout@v2 diff --git a/README.md b/README.md index d2c9bdbd1..b5aeb726a 100644 --- a/README.md +++ b/README.md @@ -124,7 +124,7 @@ You can also connect using any S3-compatible tool, such as the MinIO Client `mc` # Install from Source -Use the following commands to compile and run a standalone MinIO server from source. Source installation is only intended for developers and advanced users. If you do not have a working Golang environment, please follow [How to install Golang](https://golang.org/doc/install). Minimum version required is [go1.16](https://golang.org/dl/#stable) +Use the following commands to compile and run a standalone MinIO server from source. Source installation is only intended for developers and advanced users. If you do not have a working Golang environment, please follow [How to install Golang](https://golang.org/doc/install). Minimum version required is [go1.17](https://golang.org/dl/#stable) ```sh GO111MODULE=on go install github.com/minio/minio@latest diff --git a/cmd/admin-handler-utils.go b/cmd/admin-handler-utils.go index e7c80c164..6430787e0 100644 --- a/cmd/admin-handler-utils.go +++ b/cmd/admin-handler-utils.go @@ -29,7 +29,7 @@ import ( iampolicy "github.com/minio/pkg/iam/policy" ) -func validateAdminReq(ctx context.Context, w http.ResponseWriter, r *http.Request, action iampolicy.AdminAction) (ObjectLayer, auth.Credentials) { +func validateAdminReq(ctx context.Context, w http.ResponseWriter, r *http.Request, actions ...iampolicy.AdminAction) (ObjectLayer, auth.Credentials) { // Get current object layer instance. objectAPI := newObjectLayerFn() if objectAPI == nil || globalNotificationSys == nil { @@ -37,14 +37,17 @@ func validateAdminReq(ctx context.Context, w http.ResponseWriter, r *http.Reques return nil, auth.Credentials{} } - // Validate request signature. - cred, adminAPIErr := checkAdminRequestAuth(ctx, r, action, "") - if adminAPIErr != ErrNone { - writeErrorResponseJSON(ctx, w, errorCodes.ToAPIErr(adminAPIErr), r.URL) - return nil, cred + for _, action := range actions { + // Validate request signature. + cred, adminAPIErr := checkAdminRequestAuth(ctx, r, action, "") + if adminAPIErr != ErrNone { + writeErrorResponseJSON(ctx, w, errorCodes.ToAPIErr(adminAPIErr), r.URL) + return nil, cred + } + return objectAPI, cred } - - return objectAPI, cred + writeErrorResponseJSON(ctx, w, errorCodes.ToAPIErr(ErrAccessDenied), r.URL) + return nil, auth.Credentials{} } // AdminError - is a generic error for all admin APIs. diff --git a/cmd/admin-handlers.go b/cmd/admin-handlers.go index 9d98fd345..9a25d8115 100644 --- a/cmd/admin-handlers.go +++ b/cmd/admin-handlers.go @@ -190,7 +190,11 @@ func (a adminAPIHandlers) ServerUpdateHandler(w http.ResponseWriter, r *http.Req // ServiceHandler - POST /minio/admin/v3/service?action={action} // ---------- -// restarts/stops minio server gracefully. In a distributed setup, +// Supports following actions: +// - restart (restarts all the MinIO instances in a setup) +// - stop (stops all the MinIO instances in a setup) +// - freeze (freezes all incoming S3 API calls) +// - unfreeze (unfreezes previously frozen S3 API calls) func (a adminAPIHandlers) ServiceHandler(w http.ResponseWriter, r *http.Request) { ctx := newContext(r, w, "Service") @@ -205,6 +209,10 @@ func (a adminAPIHandlers) ServiceHandler(w http.ResponseWriter, r *http.Request) serviceSig = serviceRestart case madmin.ServiceActionStop: serviceSig = serviceStop + case madmin.ServiceActionFreeze: + serviceSig = serviceFreeze + case madmin.ServiceActionUnfreeze: + serviceSig = serviceUnFreeze default: logger.LogIf(ctx, fmt.Errorf("Unrecognized service action %s requested", action), logger.Application) writeErrorResponseJSON(ctx, w, errorCodes.ToAPIErr(ErrMalformedPOSTRequest), r.URL) @@ -217,6 +225,8 @@ func (a adminAPIHandlers) ServiceHandler(w http.ResponseWriter, r *http.Request) objectAPI, _ = validateAdminReq(ctx, w, r, iampolicy.ServiceRestartAdminAction) case serviceStop: objectAPI, _ = validateAdminReq(ctx, w, r, iampolicy.ServiceStopAdminAction) + case serviceFreeze, serviceUnFreeze: + objectAPI, _ = validateAdminReq(ctx, w, r, iampolicy.ServiceFreezeAdminAction) } if objectAPI == nil { return @@ -233,7 +243,14 @@ func (a adminAPIHandlers) ServiceHandler(w http.ResponseWriter, r *http.Request) // Reply to the client before restarting, stopping MinIO server. writeSuccessResponseHeadersOnly(w) - globalServiceSignalCh <- serviceSig + switch serviceSig { + case serviceFreeze: + freezeServices() + case serviceUnFreeze: + unfreezeServices() + case serviceRestart, serviceStop: + globalServiceSignalCh <- serviceSig + } } // ServerProperties holds some server information such as, version, region @@ -917,12 +934,16 @@ func (a adminAPIHandlers) BackgroundHealStatusHandler(w http.ResponseWriter, r * } } +// SpeedtestHandler - reports maximum speed of a cluster by performing PUT and +// GET operations on the server, supports auto tuning by default by automatically +// increasing concurrency and stopping when we have reached the limits on the +// system. func (a adminAPIHandlers) SpeedtestHandler(w http.ResponseWriter, r *http.Request) { ctx := newContext(r, w, "SpeedtestHandler") defer logger.AuditLog(ctx, w, r, mustGetClaimsFromToken(r)) - objectAPI, _ := validateAdminReq(ctx, w, r, iampolicy.HealAdminAction) + objectAPI, _ := validateAdminReq(ctx, w, r, iampolicy.HealthInfoAdminAction) if objectAPI == nil { return } @@ -935,12 +956,7 @@ func (a adminAPIHandlers) SpeedtestHandler(w http.ResponseWriter, r *http.Reques sizeStr := r.Form.Get(peerRESTSize) durationStr := r.Form.Get(peerRESTDuration) concurrentStr := r.Form.Get(peerRESTConcurrent) - autotuneStr := r.Form.Get("autotune") - - var autotune bool - if autotuneStr != "" { - autotune = true - } + autotune := r.Form.Get("autotune") == "true" size, err := strconv.Atoi(sizeStr) if err != nil { @@ -965,6 +981,12 @@ func (a adminAPIHandlers) SpeedtestHandler(w http.ResponseWriter, r *http.Reques }) } + // Freeze all incoming S3 API calls before running speedtest. + globalNotificationSys.ServiceFreeze(ctx, true) + + // unfreeze all incoming S3 API calls after speedtest. + defer globalNotificationSys.ServiceFreeze(ctx, false) + keepAliveTicker := time.NewTicker(500 * time.Millisecond) defer keepAliveTicker.Stop() diff --git a/cmd/globals.go b/cmd/globals.go index df7bfda9e..d42e94496 100644 --- a/cmd/globals.go +++ b/cmd/globals.go @@ -23,6 +23,7 @@ import ( "net/http" "os" "sync" + "sync/atomic" "time" "github.com/minio/console/restapi" @@ -325,6 +326,13 @@ var ( globalConsoleSrv *restapi.Server + // handles service freeze or un-freeze S3 API calls. + globalServiceFreeze atomic.Value + + // Only needed for tracking + globalServiceFreezeCnt int32 + globalServiceFreezeMu sync.Mutex // Updates. + // Add new variable global values here. ) diff --git a/cmd/handler-api.go b/cmd/handler-api.go index 66bbbc035..64931afcc 100644 --- a/cmd/handler-api.go +++ b/cmd/handler-api.go @@ -25,7 +25,7 @@ import ( "sync" "time" - mem "github.com/shirou/gopsutil/v3/mem" + "github.com/shirou/gopsutil/v3/mem" "github.com/minio/minio/internal/config/api" xioutil "github.com/minio/minio/internal/ioutil" @@ -227,6 +227,13 @@ func (t *apiConfig) getRequestsPool() (chan struct{}, time.Duration) { // maxClients throttles the S3 API calls func maxClients(f http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + if val := globalServiceFreeze.Load(); val != nil { + if unlock, ok := val.(chan struct{}); ok { + // Wait until unfrozen. + <-unlock + } + } + pool, deadline := globalAPIConfig.getRequestsPool() if pool == nil { f.ServeHTTP(w, r) diff --git a/cmd/notification.go b/cmd/notification.go index 3d132a5bd..96bb142f2 100644 --- a/cmd/notification.go +++ b/cmd/notification.go @@ -1501,6 +1501,37 @@ func (sys *NotificationSys) GetClusterMetrics(ctx context.Context) chan Metric { return ch } +// ServiceFreeze freezes all S3 API calls when 'freeze' is true, +// 'freeze' is 'false' would resume all S3 API calls again. +// NOTE: once a tenant is frozen either two things needs to +// happen before resuming normal operations. +// - Server needs to be restarted 'mc admin service restart' +// - 'freeze' should be set to 'false' for this call +// to resume normal operations. +func (sys *NotificationSys) ServiceFreeze(ctx context.Context, freeze bool) []NotificationPeerErr { + serviceSig := serviceUnFreeze + if freeze { + serviceSig = serviceFreeze + } + ng := WithNPeers(len(sys.peerClients)) + for idx, client := range sys.peerClients { + if client == nil { + continue + } + client := client + ng.Go(GlobalContext, func() error { + return client.SignalService(serviceSig) + }, idx, *client.host) + } + nerrs := ng.Wait() + if freeze { + freezeServices() + } else { + unfreezeServices() + } + return nerrs +} + // Speedtest run GET/PUT tests at input concurrency for requested object size, // optionally you can extend the tests longer with time.Duration. func (sys *NotificationSys) Speedtest(ctx context.Context, size int, concurrent int, duration time.Duration) []SpeedtestResult { diff --git a/cmd/peer-rest-common.go b/cmd/peer-rest-common.go index dfb954682..3f77ceb40 100644 --- a/cmd/peer-rest-common.go +++ b/cmd/peer-rest-common.go @@ -18,7 +18,7 @@ package cmd const ( - peerRESTVersion = "v15" // Add LoadTransitionTierConfig + peerRESTVersion = "v16" // Add new ServiceSignals. peerRESTVersionPrefix = SlashSeparator + peerRESTVersion peerRESTPrefix = minioReservedBucketPath + "/peer" peerRESTPath = peerRESTPrefix + peerRESTVersionPrefix diff --git a/cmd/peer-rest-server.go b/cmd/peer-rest-server.go index 4bce86337..317d6cdce 100644 --- a/cmd/peer-rest-server.go +++ b/cmd/peer-rest-server.go @@ -800,7 +800,7 @@ func (s *peerRESTServer) ServerUpdateHandler(w http.ResponseWriter, r *http.Requ } } -var errUnsupportedSignal = fmt.Errorf("unsupported signal: only restart and stop signals are supported") +var errUnsupportedSignal = fmt.Errorf("unsupported signal") // SignalServiceHandler - signal service handler. func (s *peerRESTServer) SignalServiceHandler(w http.ResponseWriter, r *http.Request) { @@ -826,6 +826,10 @@ func (s *peerRESTServer) SignalServiceHandler(w http.ResponseWriter, r *http.Req globalServiceSignalCh <- signal case serviceStop: globalServiceSignalCh <- signal + case serviceFreeze: + freezeServices() + case serviceUnFreeze: + unfreezeServices() case serviceReloadDynamic: objAPI := newObjectLayerFn() if objAPI == nil { @@ -1241,6 +1245,7 @@ func selfSpeedtest(ctx context.Context, size, concurrent int, duration time.Dura func (s *peerRESTServer) SpeedtestHandler(w http.ResponseWriter, r *http.Request) { if !s.IsValid(w, r) { s.writeErrorResponse(w, errors.New("invalid request")) + return } objAPI := newObjectLayerFn() diff --git a/cmd/service.go b/cmd/service.go index 715c60bed..243070108 100644 --- a/cmd/service.go +++ b/cmd/service.go @@ -31,6 +31,8 @@ const ( serviceRestart serviceSignal = iota // Restarts the server. serviceStop // Stops the server. serviceReloadDynamic // Reload dynamic config values. + serviceFreeze // Freeze all S3 API calls. + serviceUnFreeze // Un-Freeze previously frozen S3 API calls. // Add new service requests here. ) @@ -65,3 +67,57 @@ func restartProcess() error { // Re-uses the same pid. This preserves the pid over multiple server-respawns. return syscall.Exec(argv0, os.Args, os.Environ()) } + +// Keep track of number of freeze/unfreeze calls. +const trackFreezeCount = true + +// freezeServices will freeze all incoming S3 API calls. +// For each call, unfreezeServices must be called once. +func freezeServices() { + // Use atomics for globalServiceFreeze, so we can read without locking. + if trackFreezeCount { + // We need a lock since we are need the 2 atomic values to remain in sync. + globalServiceFreezeMu.Lock() + // If multiple calls, first one creates channel. + globalServiceFreezeCnt++ + if globalServiceFreezeCnt == 1 { + globalServiceFreeze.Store(make(chan struct{})) + } + globalServiceFreezeMu.Unlock() + } else { + // If multiple calls, first one creates channel. + globalServiceFreeze.CompareAndSwap(nil, make(chan struct{})) + } +} + +// unfreezeServices will unfreeze all incoming S3 API calls. +// For each call, unfreezeServices must be called once. +func unfreezeServices() { + if trackFreezeCount { + // We need a lock since we need the 2 atomic values to remain in sync. + globalServiceFreezeMu.Lock() + // Close when we reach 0 + globalServiceFreezeCnt-- + if globalServiceFreezeCnt <= 0 { + // Ensure we only close once. + if val := globalServiceFreeze.Load(); val != nil { + if ch, ok := val.(chan struct{}); ok { + globalServiceFreeze.Store(nil) + close(ch) + } + } + globalServiceFreezeCnt = 0 // Don't risk going negative. + } + globalServiceFreezeMu.Unlock() + } else { + // If multiple calls, first one closes channel. + if val := globalServiceFreeze.Load(); val != nil { + if ch, ok := val.(chan struct{}); ok { + // Ensure we only close once. + if globalServiceFreeze.CompareAndSwap(val, nil) { + close(ch) + } + } + } + } +} diff --git a/go.mod b/go.mod index 8f9c1a03c..7be6a4f8f 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/minio/minio -go 1.16 +go 1.17 require ( cloud.google.com/go/storage v1.10.0 @@ -26,7 +26,6 @@ require ( github.com/elastic/go-elasticsearch/v7 v7.12.0 github.com/fatih/color v1.13.0 github.com/go-ldap/ldap/v3 v3.2.4 - github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-openapi/loads v0.20.2 github.com/go-sql-driver/mysql v1.5.0 github.com/golang-jwt/jwt/v4 v4.1.0 @@ -49,11 +48,10 @@ require ( github.com/minio/csvparser v1.0.0 github.com/minio/highwayhash v1.0.2 github.com/minio/kes v0.14.0 - github.com/minio/madmin-go v1.1.15 - github.com/minio/mc v0.0.0-20211115052100-7fd441ec6c5b // indirect + github.com/minio/madmin-go v1.1.16 github.com/minio/minio-go/v7 v7.0.16-0.20211108161804-a7a36ee131df github.com/minio/parquet-go v1.1.0 - github.com/minio/pkg v1.1.8 + github.com/minio/pkg v1.1.9 github.com/minio/selfupdate v0.3.1 github.com/minio/sha256-simd v1.0.0 github.com/minio/simdjson-go v0.2.1 @@ -62,7 +60,6 @@ require ( github.com/mitchellh/go-homedir v1.1.0 github.com/montanaflynn/stats v0.6.6 github.com/nats-io/nats-server/v2 v2.3.2 - github.com/nats-io/nats-streaming-server v0.21.2 // indirect github.com/nats-io/nats.go v1.11.1-0.20210623165838-4b75fc59ae30 github.com/nats-io/stan.go v0.8.3 github.com/ncw/directio v1.0.5 @@ -88,7 +85,6 @@ require ( go.uber.org/atomic v1.9.0 go.uber.org/zap v1.19.1 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 - golang.org/x/net v0.0.0-20211020060615-d418f374d309 // indirect golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f golang.org/x/sys v0.0.0-20211020174200-9d6173849985 golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac @@ -96,4 +92,143 @@ require ( gopkg.in/yaml.v2 v2.4.0 ) +require ( + cloud.google.com/go v0.94.1 // indirect + github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c // indirect + github.com/PuerkitoBio/purell v1.1.1 // indirect + github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect + github.com/StackExchange/wmi v1.2.1 // indirect + github.com/apache/thrift v0.15.0 // indirect + github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bits-and-blooms/bitset v1.2.0 // indirect + github.com/briandowns/spinner v1.16.0 // indirect + github.com/coreos/go-semver v0.3.0 // indirect + github.com/coreos/go-systemd/v22 v22.3.2 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0 // indirect + github.com/docker/go-units v0.4.0 // indirect + github.com/eapache/go-resiliency v1.2.0 // indirect + github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 // indirect + github.com/eapache/queue v1.1.0 // indirect + github.com/emicklei/go-restful v2.9.5+incompatible // indirect + github.com/fatih/structs v1.1.0 // indirect + github.com/georgysavva/scany v0.2.7 // indirect + github.com/go-asn1-ber/asn1-ber v1.5.1 // indirect + github.com/go-logr/logr v0.4.0 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-openapi/analysis v0.20.0 // indirect + github.com/go-openapi/errors v0.19.9 // indirect + github.com/go-openapi/jsonpointer v0.19.5 // indirect + github.com/go-openapi/jsonreference v0.19.5 // indirect + github.com/go-openapi/runtime v0.19.24 // indirect + github.com/go-openapi/spec v0.20.3 // indirect + github.com/go-openapi/strfmt v0.20.0 // indirect + github.com/go-openapi/swag v0.19.14 // indirect + github.com/go-openapi/validate v0.20.2 // indirect + github.com/go-stack/stack v1.8.0 // indirect + github.com/goccy/go-json v0.7.9 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-jwt/jwt v3.2.2+incompatible // indirect + github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect + github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/golang/snappy v0.0.3 // indirect + github.com/google/go-cmp v0.5.6 // indirect + github.com/google/gofuzz v1.1.0 // indirect + github.com/googleapis/gax-go/v2 v2.1.1 // indirect + github.com/googleapis/gnostic v0.5.1 // indirect + github.com/gorilla/websocket v1.4.2 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-uuid v1.0.2 // indirect + github.com/jcmturner/aescts/v2 v2.0.0 // indirect + github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect + github.com/jcmturner/gofork v1.0.0 // indirect + github.com/jcmturner/goidentity/v6 v6.0.1 // indirect + github.com/jcmturner/rpc/v2 v2.0.3 // indirect + github.com/jessevdk/go-flags v1.4.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/lestrrat-go/backoff/v2 v2.0.8 // indirect + github.com/lestrrat-go/blackmagic v1.0.0 // indirect + github.com/lestrrat-go/httpcc v1.0.0 // indirect + github.com/lestrrat-go/iter v1.0.1 // indirect + github.com/lestrrat-go/jwx v1.2.7 // indirect + github.com/lestrrat-go/option v1.0.0 // indirect + github.com/mailru/easyjson v0.7.6 // indirect + github.com/mattn/go-colorable v0.1.10 // indirect + github.com/mattn/go-ieproxy v0.0.1 // indirect + github.com/mattn/go-isatty v0.0.14 // indirect + github.com/mattn/go-runewidth v0.0.13 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect + github.com/mb0/glob v0.0.0-20160210091149-1eb79d2de6c4 // indirect + github.com/minio/argon2 v1.0.0 // indirect + github.com/minio/colorjson v1.0.1 // indirect + github.com/minio/direct-csi v1.3.5-0.20210601185811-f7776f7961bf // indirect + github.com/minio/filepath v1.0.0 // indirect + github.com/minio/mc v0.0.0-20211115052100-7fd441ec6c5b // indirect + github.com/minio/md5-simd v1.1.2 // indirect + github.com/minio/operator v0.0.0-20211011212245-31460bbbc4b7 // indirect + github.com/minio/operator/logsearchapi v0.0.0-20211011212245-31460bbbc4b7 // indirect + github.com/mitchellh/mapstructure v1.4.1 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/nats-io/jwt/v2 v2.0.2 // indirect + github.com/nats-io/nats-streaming-server v0.21.2 // indirect + github.com/nats-io/nkeys v0.3.0 // indirect + github.com/nats-io/nuid v1.0.1 // indirect + github.com/pkg/profile v1.6.0 // indirect + github.com/pkg/xattr v0.4.3 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/posener/complete v1.2.3 // indirect + github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021 // indirect + github.com/prometheus/common v0.31.1 // indirect + github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 // indirect + github.com/rivo/uniseg v0.2.0 // indirect + github.com/rjeczalik/notify v0.9.2 // indirect + github.com/rs/xid v1.3.0 // indirect + github.com/sirupsen/logrus v1.8.1 // indirect + github.com/stretchr/objx v0.2.0 // indirect + github.com/stretchr/testify v1.7.0 // indirect + github.com/tidwall/gjson v1.11.0 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.0 // indirect + github.com/tidwall/sjson v1.2.3 // indirect + github.com/tklauser/go-sysconf v0.3.9 // indirect + github.com/tklauser/numcpus v0.3.0 // indirect + github.com/unrolled/secure v1.0.9 // indirect + github.com/xdg/stringprep v1.0.0 // indirect + go.etcd.io/etcd/client/pkg/v3 v3.5.0 // indirect + go.mongodb.org/mongo-driver v1.4.6 // indirect + go.opencensus.io v0.23.0 // indirect + go.uber.org/multierr v1.7.0 // indirect + golang.org/x/net v0.0.0-20211020060615-d418f374d309 // indirect + golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect + golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect + golang.org/x/text v0.3.7 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/genproto v0.0.0-20210928142010-c7af6a1a74c9 // indirect + google.golang.org/grpc v1.41.0 // indirect + google.golang.org/protobuf v1.27.1 // indirect + gopkg.in/h2non/filetype.v1 v1.0.5 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/ini.v1 v1.63.2 // indirect + gopkg.in/jcmturner/aescts.v1 v1.0.1 // indirect + gopkg.in/jcmturner/dnsutils.v1 v1.0.1 // indirect + gopkg.in/jcmturner/gokrb5.v7 v7.5.0 // indirect + gopkg.in/jcmturner/rpc.v1 v1.1.0 // indirect + gopkg.in/square/go-jose.v2 v2.3.1 // indirect + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect + k8s.io/api v0.21.1 // indirect + k8s.io/apimachinery v0.21.1 // indirect + k8s.io/client-go v0.21.1 // indirect + k8s.io/klog/v2 v2.8.0 // indirect + k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 // indirect + k8s.io/utils v0.0.0-20201110183641-67b214c5f920 // indirect + maze.io/x/duration v0.0.0-20160924141736-faac084b6075 // indirect + sigs.k8s.io/controller-runtime v0.8.0 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.1.0 // indirect + sigs.k8s.io/yaml v1.2.0 // indirect +) + replace github.com/gomodule/redigo v2.0.0+incompatible => github.com/gomodule/redigo v1.8.5 diff --git a/go.sum b/go.sum index ea3e1ba0f..5ebbee545 100644 --- a/go.sum +++ b/go.sum @@ -1087,8 +1087,8 @@ github.com/minio/madmin-go v1.0.12/go.mod h1:BK+z4XRx7Y1v8SFWXsuLNqQqnq5BO/axJ8I github.com/minio/madmin-go v1.1.11-0.20211102182201-e51fd3d6b104/go.mod h1:Iu0OnrMWNBYx1lqJTW+BFjBMx0Hi0wjw8VmqhiOs2Jo= github.com/minio/madmin-go v1.1.12/go.mod h1:Iu0OnrMWNBYx1lqJTW+BFjBMx0Hi0wjw8VmqhiOs2Jo= github.com/minio/madmin-go v1.1.13/go.mod h1:Iu0OnrMWNBYx1lqJTW+BFjBMx0Hi0wjw8VmqhiOs2Jo= -github.com/minio/madmin-go v1.1.15 h1:iRfHD3xTMGjJ6EZvLQbcxog2nfXUXZ1yp283xGvuvbM= -github.com/minio/madmin-go v1.1.15/go.mod h1:Iu0OnrMWNBYx1lqJTW+BFjBMx0Hi0wjw8VmqhiOs2Jo= +github.com/minio/madmin-go v1.1.16 h1:c96vQBF3W9sPXiY04rjNa06FfOmWDjeFuChuqtOzLmE= +github.com/minio/madmin-go v1.1.16/go.mod h1:Iu0OnrMWNBYx1lqJTW+BFjBMx0Hi0wjw8VmqhiOs2Jo= github.com/minio/mc v0.0.0-20211110003602-1461b652d920/go.mod h1:V8NmUfU0W3G/mrifeO6nm4CWFTiXY2nx7FJyMge/aHk= github.com/minio/mc v0.0.0-20211115052100-7fd441ec6c5b h1:crCI2lSbzWzMuk/U6fMqSl5eF2V2VKDFNX+ILSD1sxU= github.com/minio/mc v0.0.0-20211115052100-7fd441ec6c5b/go.mod h1:2fFAzMBmEYcN4mjcmQdlLuSabP+bvQC5UpqfLzRgrQQ= @@ -1112,8 +1112,8 @@ github.com/minio/pkg v1.0.4/go.mod h1:obU54TZ9QlMv0TRaDgQ/JTzf11ZSXxnSfLrm4tMtBP github.com/minio/pkg v1.0.11/go.mod h1:32x/3OmGB0EOi1N+3ggnp+B5VFkSBBB9svPMVfpnf14= github.com/minio/pkg v1.1.3/go.mod h1:32x/3OmGB0EOi1N+3ggnp+B5VFkSBBB9svPMVfpnf14= github.com/minio/pkg v1.1.7/go.mod h1:32x/3OmGB0EOi1N+3ggnp+B5VFkSBBB9svPMVfpnf14= -github.com/minio/pkg v1.1.8 h1:m/yKFtUCmLKp6kOO6Wf8C2SRUIIhtkIf6+rGlrB5RVk= -github.com/minio/pkg v1.1.8/go.mod h1:32x/3OmGB0EOi1N+3ggnp+B5VFkSBBB9svPMVfpnf14= +github.com/minio/pkg v1.1.9 h1:NJrcrQyFCSgyF+u6v7FbPXjjNV0oSnBuBevhsTKmA2U= +github.com/minio/pkg v1.1.9/go.mod h1:32x/3OmGB0EOi1N+3ggnp+B5VFkSBBB9svPMVfpnf14= github.com/minio/selfupdate v0.3.1 h1:BWEFSNnrZVMUWXbXIgLDNDjbejkmpAmZvy/nCz1HlEs= github.com/minio/selfupdate v0.3.1/go.mod h1:b8ThJzzH7u2MkF6PcIra7KaXO9Khf6alWPvMSyTDCFM= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=