mirror of
				https://github.com/minio/minio.git
				synced 2025-10-30 00:05:02 -04:00 
			
		
		
		
	readiness returns error quickly if any of the set is down (#9662)
This PR adds a new configuration parameter which allows readiness check to respond within 10secs, this can be reduced to a lower value if necessary using ``` mc admin config set api ready_deadline=5s ``` or ``` export MINIO_API_READY_DEADLINE=5s ```
This commit is contained in:
		
							parent
							
								
									3f6d624c7b
								
							
						
					
					
						commit
						7d19ab9f62
					
				| @ -371,6 +371,7 @@ func lookupConfigs(s config.Config) { | ||||
| 	} | ||||
| 
 | ||||
| 	globalAPIThrottling.init(apiRequestsMax, apiConfig.APIRequestsDeadline) | ||||
| 	globalReadyDeadline = apiConfig.APIReadyDeadline | ||||
| 
 | ||||
| 	if globalIsXL { | ||||
| 		globalStorageClass, err = storageclass.LookupConfig(s[config.StorageClassSubSys][config.Default], | ||||
|  | ||||
| @ -165,13 +165,14 @@ func readServerConfig(ctx context.Context, objAPI ObjectLayer) (config.Config, e | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	var config = config.New() | ||||
| 	var srvCfg = config.New() | ||||
| 	var json = jsoniter.ConfigCompatibleWithStandardLibrary | ||||
| 	if err = json.Unmarshal(configData, &config); err != nil { | ||||
| 	if err = json.Unmarshal(configData, &srvCfg); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	return config, nil | ||||
| 	// Add any missing entries | ||||
| 	return srvCfg.Merge(), nil | ||||
| } | ||||
| 
 | ||||
| // ConfigSys - config system. | ||||
|  | ||||
| @ -29,6 +29,7 @@ import ( | ||||
| const ( | ||||
| 	apiRequestsMax      = "requests_max" | ||||
| 	apiRequestsDeadline = "requests_deadline" | ||||
| 	apiReadyDeadline    = "ready_deadline" | ||||
| ) | ||||
| 
 | ||||
| // DefaultKVS - default storage class config | ||||
| @ -42,6 +43,10 @@ var ( | ||||
| 			Key:   apiRequestsDeadline, | ||||
| 			Value: "10s", | ||||
| 		}, | ||||
| 		config.KV{ | ||||
| 			Key:   apiReadyDeadline, | ||||
| 			Value: "10s", | ||||
| 		}, | ||||
| 	} | ||||
| ) | ||||
| 
 | ||||
| @ -49,6 +54,7 @@ var ( | ||||
| type Config struct { | ||||
| 	APIRequestsMax      int           `json:"requests_max"` | ||||
| 	APIRequestsDeadline time.Duration `json:"requests_deadline"` | ||||
| 	APIReadyDeadline    time.Duration `json:"ready_deadline"` | ||||
| } | ||||
| 
 | ||||
| // UnmarshalJSON - Validate SS and RRS parity when unmarshalling JSON. | ||||
| @ -83,9 +89,15 @@ func LookupConfig(kvs config.KVS) (cfg Config, err error) { | ||||
| 		return cfg, err | ||||
| 	} | ||||
| 
 | ||||
| 	readyDeadline, err := time.ParseDuration(env.Get(config.EnvAPIReadyDeadline, kvs.Get(apiReadyDeadline))) | ||||
| 	if err != nil { | ||||
| 		return cfg, err | ||||
| 	} | ||||
| 
 | ||||
| 	cfg = Config{ | ||||
| 		APIRequestsMax:      requestsMax, | ||||
| 		APIRequestsDeadline: requestsDeadline, | ||||
| 		APIReadyDeadline:    readyDeadline, | ||||
| 	} | ||||
| 	return cfg, nil | ||||
| } | ||||
|  | ||||
| @ -33,5 +33,11 @@ var ( | ||||
| 			Optional:    true, | ||||
| 			Type:        "duration", | ||||
| 		}, | ||||
| 		config.HelpKV{ | ||||
| 			Key:         apiReadyDeadline, | ||||
| 			Description: `set the deadline for health check API /minio/health/ready e.g. "1m"`, | ||||
| 			Optional:    true, | ||||
| 			Type:        "duration", | ||||
| 		}, | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| @ -434,6 +434,26 @@ func LookupWorm() (bool, error) { | ||||
| 	return ParseBool(env.Get(EnvWorm, EnableOff)) | ||||
| } | ||||
| 
 | ||||
| // Merge - merges a new config with all the | ||||
| // missing values for default configs, | ||||
| // returns a config. | ||||
| func (c Config) Merge() Config { | ||||
| 	cp := New() | ||||
| 	for subSys, tgtKV := range c { | ||||
| 		for tgt := range tgtKV { | ||||
| 			ckvs := c[subSys][tgt] | ||||
| 			for _, kv := range cp[subSys][Default] { | ||||
| 				_, ok := c[subSys][tgt].Lookup(kv.Key) | ||||
| 				if !ok { | ||||
| 					ckvs.Set(kv.Key, kv.Value) | ||||
| 				} | ||||
| 			} | ||||
| 			cp[subSys][tgt] = ckvs | ||||
| 		} | ||||
| 	} | ||||
| 	return cp | ||||
| } | ||||
| 
 | ||||
| // New - initialize a new server config. | ||||
| func New() Config { | ||||
| 	srvCfg := make(Config) | ||||
|  | ||||
| @ -37,6 +37,7 @@ const ( | ||||
| 	// API sub-system | ||||
| 	EnvAPIRequestsMax      = "MINIO_API_REQUESTS_MAX" | ||||
| 	EnvAPIRequestsDeadline = "MINIO_API_REQUESTS_DEADLINE" | ||||
| 	EnvAPIReadyDeadline    = "MINIO_API_READY_DEADLINE" | ||||
| 
 | ||||
| 	EnvUpdate = "MINIO_UPDATE" | ||||
| 
 | ||||
|  | ||||
| @ -275,6 +275,9 @@ var ( | ||||
| 
 | ||||
| 	// If writes to FS backend should be O_SYNC. | ||||
| 	globalFSOSync bool | ||||
| 
 | ||||
| 	// Deadline by which /minio/health/ready should respond. | ||||
| 	globalReadyDeadline time.Duration | ||||
| 	// Add new variable global values here. | ||||
| ) | ||||
| 
 | ||||
|  | ||||
| @ -18,15 +18,11 @@ package cmd | ||||
| 
 | ||||
| import ( | ||||
| 	"net/http" | ||||
| 	"os" | ||||
| 
 | ||||
| 	xhttp "github.com/minio/minio/cmd/http" | ||||
| 	"github.com/minio/minio/cmd/logger" | ||||
| ) | ||||
| 
 | ||||
| // ReadinessCheckHandler -- Checks if the quorum number of disks are available. | ||||
| // ReadinessCheckHandler returns if the server is ready to receive requests. | ||||
| // For FS - Checks if the backend disk is available | ||||
| // For Zones - Checks if all the zones have enough read quorum | ||||
| // For Erasure backend - Checks if all the erasure sets are writable | ||||
| func ReadinessCheckHandler(w http.ResponseWriter, r *http.Request) { | ||||
| 	ctx := newContext(r, w, "ReadinessCheckHandler") | ||||
| 
 | ||||
| @ -40,61 +36,7 @@ func ReadinessCheckHandler(w http.ResponseWriter, r *http.Request) { | ||||
| 	writeResponse(w, http.StatusOK, nil, mimeNone) | ||||
| } | ||||
| 
 | ||||
| // LivenessCheckHandler -- checks if server can reach its disks internally. | ||||
| // If not, server is considered to have failed and needs to be restarted. | ||||
| // Liveness probes are used to detect situations where application (minio) | ||||
| // has gone into a state where it can not recover except by being restarted. | ||||
| // LivenessCheckHandler - Checks if the process is up. Always returns success. | ||||
| func LivenessCheckHandler(w http.ResponseWriter, r *http.Request) { | ||||
| 	ctx := newContext(r, w, "LivenessCheckHandler") | ||||
| 
 | ||||
| 	objLayer := newObjectLayerWithoutSafeModeFn() | ||||
| 	// Service not initialized yet | ||||
| 	if objLayer == nil { | ||||
| 		// Respond with 200 OK while server initializes to ensure a distributed cluster | ||||
| 		// is able to start on orchestration platforms like Docker Swarm. | ||||
| 		// Refer https://github.com/minio/minio/issues/8140 for more details. | ||||
| 		// Make sure to add server not initialized status in header | ||||
| 		w.Header().Set(xhttp.MinIOServerStatus, "server-not-initialized") | ||||
| 		writeSuccessResponseHeadersOnly(w) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	if !globalIsXL && !globalIsDistXL { | ||||
| 		s := objLayer.StorageInfo(ctx, false) | ||||
| 		if s.Backend.Type == BackendGateway { | ||||
| 			if !s.Backend.GatewayOnline { | ||||
| 				writeResponse(w, http.StatusServiceUnavailable, nil, mimeNone) | ||||
| 				return | ||||
| 			} | ||||
| 			writeResponse(w, http.StatusOK, nil, mimeNone) | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	// For FS and Erasure backend, check if local disks are up. | ||||
| 	var erroredDisks int | ||||
| 	for _, ep := range globalEndpoints { | ||||
| 		for _, endpoint := range ep.Endpoints { | ||||
| 			// Check only if local disks are accessible, we do not have | ||||
| 			// to reach to rest of the other servers in a distributed setup. | ||||
| 			if !endpoint.IsLocal { | ||||
| 				continue | ||||
| 			} | ||||
| 			// Attempt a stat to backend, any error resulting | ||||
| 			// from this Stat() operation is considered as backend | ||||
| 			// is not available, count them as errors. | ||||
| 			if _, err := os.Stat(endpoint.Path); err != nil && os.IsNotExist(err) { | ||||
| 				logger.LogIf(ctx, err) | ||||
| 				erroredDisks++ | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	// Any errored disks, we let orchestrators take us down. | ||||
| 	if erroredDisks > 0 { | ||||
| 		writeResponse(w, http.StatusServiceUnavailable, nil, mimeNone) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	writeResponse(w, http.StatusOK, nil, mimeNone) | ||||
| } | ||||
|  | ||||
| @ -1163,6 +1163,29 @@ func (sys *NotificationSys) ServerInfo() []madmin.ServerProperties { | ||||
| 	return reply | ||||
| } | ||||
| 
 | ||||
| // GetLocalDiskIDs - return disk ids of the local disks of the peers. | ||||
| func (sys *NotificationSys) GetLocalDiskIDs() []string { | ||||
| 	var diskIDs []string | ||||
| 	var mu sync.Mutex | ||||
| 
 | ||||
| 	var wg sync.WaitGroup | ||||
| 	for _, client := range sys.peerClients { | ||||
| 		if client == nil { | ||||
| 			continue | ||||
| 		} | ||||
| 		wg.Add(1) | ||||
| 		go func(client *peerRESTClient) { | ||||
| 			defer wg.Done() | ||||
| 			ids := client.GetLocalDiskIDs() | ||||
| 			mu.Lock() | ||||
| 			diskIDs = append(diskIDs, ids...) | ||||
| 			mu.Unlock() | ||||
| 		}(client) | ||||
| 	} | ||||
| 	wg.Wait() | ||||
| 	return diskIDs | ||||
| } | ||||
| 
 | ||||
| // NewNotificationSys - creates new notification system object. | ||||
| func NewNotificationSys(endpoints EndpointZones) *NotificationSys { | ||||
| 	// bucketRulesMap/bucketRemoteTargetRulesMap are initialized by NotificationSys.Init() | ||||
|  | ||||
| @ -676,6 +676,32 @@ func (client *peerRESTClient) BackgroundHealStatus() (madmin.BgHealState, error) | ||||
| 	return state, err | ||||
| } | ||||
| 
 | ||||
| // GetLocalDiskIDs - get a peer's local disks' IDs. | ||||
| func (client *peerRESTClient) GetLocalDiskIDs() []string { | ||||
| 	doneCh := make(chan struct{}) | ||||
| 	defer close(doneCh) | ||||
| 
 | ||||
| 	ctx, cancel := context.WithCancel(GlobalContext) | ||||
| 	go func() { | ||||
| 		select { | ||||
| 		case <-doneCh: | ||||
| 			return | ||||
| 		case <-time.After(globalReadyDeadline): | ||||
| 			cancel() | ||||
| 		} | ||||
| 	}() | ||||
| 	respBody, err := client.callWithContext(ctx, peerRESTMethodGetLocalDiskIDs, nil, nil, -1) | ||||
| 	if err != nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 	defer http.DrainBody(respBody) | ||||
| 	var diskIDs []string | ||||
| 	if err = gob.NewDecoder(respBody).Decode(&diskIDs); err != nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 	return diskIDs | ||||
| } | ||||
| 
 | ||||
| func (client *peerRESTClient) doTrace(traceCh chan interface{}, doneCh <-chan struct{}, trcAll, trcErr bool) { | ||||
| 	values := make(url.Values) | ||||
| 	values.Set(peerRESTTraceAll, strconv.FormatBool(trcAll)) | ||||
|  | ||||
| @ -54,6 +54,7 @@ const ( | ||||
| 	peerRESTMethodTrace                 = "/trace" | ||||
| 	peerRESTMethodListen                = "/listen" | ||||
| 	peerRESTMethodLog                   = "/log" | ||||
| 	peerRESTMethodGetLocalDiskIDs       = "/getlocaldiskids" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
|  | ||||
| @ -701,6 +701,62 @@ func (s *peerRESTServer) PutBucketNotificationHandler(w http.ResponseWriter, r * | ||||
| 	w.(http.Flusher).Flush() | ||||
| } | ||||
| 
 | ||||
| // Return disk IDs of all the local disks. | ||||
| func getLocalDiskIDs(z *xlZones) []string { | ||||
| 	var ids []string | ||||
| 
 | ||||
| 	for zoneIdx := range z.zones { | ||||
| 		for _, set := range z.zones[zoneIdx].sets { | ||||
| 			disks := set.getDisks() | ||||
| 			for _, disk := range disks { | ||||
| 				if disk == nil { | ||||
| 					continue | ||||
| 				} | ||||
| 				if disk.IsLocal() { | ||||
| 					id, err := disk.GetDiskID() | ||||
| 					if err != nil { | ||||
| 						continue | ||||
| 					} | ||||
| 					if id == "" { | ||||
| 						continue | ||||
| 					} | ||||
| 					ids = append(ids, id) | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return ids | ||||
| } | ||||
| 
 | ||||
| // GetLocalDiskIDs - Return disk IDs of all the local disks. | ||||
| func (s *peerRESTServer) GetLocalDiskIDs(w http.ResponseWriter, r *http.Request) { | ||||
| 	if !s.IsValid(w, r) { | ||||
| 		s.writeErrorResponse(w, errors.New("Invalid request")) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	ctx := newContext(r, w, "GetLocalDiskIDs") | ||||
| 
 | ||||
| 	objLayer := newObjectLayerWithoutSafeModeFn() | ||||
| 
 | ||||
| 	// Service not initialized yet | ||||
| 	if objLayer == nil { | ||||
| 		s.writeErrorResponse(w, errServerNotInitialized) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	z, ok := objLayer.(*xlZones) | ||||
| 	if !ok { | ||||
| 		s.writeErrorResponse(w, errServerNotInitialized) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	ids := getLocalDiskIDs(z) | ||||
| 	logger.LogIf(ctx, gob.NewEncoder(w).Encode(ids)) | ||||
| 	w.(http.Flusher).Flush() | ||||
| } | ||||
| 
 | ||||
| // ServerUpdateHandler - updates the current server. | ||||
| func (s *peerRESTServer) ServerUpdateHandler(w http.ResponseWriter, r *http.Request) { | ||||
| 	if !s.IsValid(w, r) { | ||||
| @ -996,4 +1052,5 @@ func registerPeerRESTHandlers(router *mux.Router) { | ||||
| 	subrouter.Methods(http.MethodPost).Path(peerRESTVersionPrefix + peerRESTMethodListen).HandlerFunc(httpTraceHdrs(server.ListenHandler)) | ||||
| 	subrouter.Methods(http.MethodPost).Path(peerRESTVersionPrefix + peerRESTMethodBackgroundHealStatus).HandlerFunc(server.BackgroundHealStatusHandler) | ||||
| 	subrouter.Methods(http.MethodPost).Path(peerRESTVersionPrefix + peerRESTMethodLog).HandlerFunc(server.ConsoleLogHandler) | ||||
| 	subrouter.Methods(http.MethodPost).Path(peerRESTVersionPrefix + peerRESTMethodGetLocalDiskIDs).HandlerFunc(httpTraceHdrs(server.GetLocalDiskIDs)) | ||||
| } | ||||
|  | ||||
| @ -56,7 +56,7 @@ func (p *posixDiskIDCheck) Close() error { | ||||
| } | ||||
| 
 | ||||
| func (p *posixDiskIDCheck) GetDiskID() (string, error) { | ||||
| 	return p.diskID, nil | ||||
| 	return p.storage.GetDiskID() | ||||
| } | ||||
| 
 | ||||
| func (p *posixDiskIDCheck) SetDiskID(id string) { | ||||
|  | ||||
| @ -1709,30 +1709,6 @@ func (s *xlSets) GetMetrics(ctx context.Context) (*Metrics, error) { | ||||
| 	return &Metrics{}, NotImplemented{} | ||||
| } | ||||
| 
 | ||||
| // IsReady - Returns true if atleast n/2 disks (read quorum) are online | ||||
| func (s *xlSets) IsReady(_ context.Context) bool { | ||||
| 	s.xlDisksMu.RLock() | ||||
| 	defer s.xlDisksMu.RUnlock() | ||||
| 
 | ||||
| 	var activeDisks int | ||||
| 	for i := 0; i < s.setCount; i++ { | ||||
| 		for j := 0; j < s.drivesPerSet; j++ { | ||||
| 			if s.xlDisks[i][j] == nil { | ||||
| 				continue | ||||
| 			} | ||||
| 			if s.xlDisks[i][j].IsOnline() { | ||||
| 				activeDisks++ | ||||
| 			} | ||||
| 			// Return true if read quorum is available. | ||||
| 			if activeDisks >= len(s.endpoints)/2 { | ||||
| 				return true | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	// Disks are not ready | ||||
| 	return false | ||||
| } | ||||
| 
 | ||||
| // maintainMRFList gathers the list of successful partial uploads | ||||
| // from all underlying xl sets and puts them in a global map which | ||||
| // should not have more than 10000 entries. | ||||
|  | ||||
| @ -27,6 +27,7 @@ import ( | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/minio/minio-go/v6/pkg/tags" | ||||
| 	"github.com/minio/minio/cmd/config/storageclass" | ||||
| 	xhttp "github.com/minio/minio/cmd/http" | ||||
| 	"github.com/minio/minio/cmd/logger" | ||||
| 	"github.com/minio/minio/pkg/madmin" | ||||
| @ -1537,9 +1538,57 @@ func (z *xlZones) GetMetrics(ctx context.Context) (*Metrics, error) { | ||||
| 	return &Metrics{}, NotImplemented{} | ||||
| } | ||||
| 
 | ||||
| // IsReady - Returns true if first zone returns true | ||||
| func (z *xlZones) getZoneAndSet(id string) (int, int, error) { | ||||
| 	for zoneIdx := range z.zones { | ||||
| 		format := z.zones[zoneIdx].format | ||||
| 		for setIdx, set := range format.XL.Sets { | ||||
| 			for _, diskID := range set { | ||||
| 				if diskID == id { | ||||
| 					return zoneIdx, setIdx, nil | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return 0, 0, errDiskNotFound | ||||
| } | ||||
| 
 | ||||
| // IsReady - Returns true all the erasure sets are writable. | ||||
| func (z *xlZones) IsReady(ctx context.Context) bool { | ||||
| 	return z.zones[0].IsReady(ctx) | ||||
| 	erasureSetUpCount := make([][]int, len(z.zones)) | ||||
| 	for i := range z.zones { | ||||
| 		erasureSetUpCount[i] = make([]int, len(z.zones[i].sets)) | ||||
| 	} | ||||
| 
 | ||||
| 	diskIDs := globalNotificationSys.GetLocalDiskIDs() | ||||
| 
 | ||||
| 	diskIDs = append(diskIDs, getLocalDiskIDs(z)...) | ||||
| 
 | ||||
| 	for _, id := range diskIDs { | ||||
| 		zoneIdx, setIdx, err := z.getZoneAndSet(id) | ||||
| 		if err != nil { | ||||
| 			continue | ||||
| 		} | ||||
| 		erasureSetUpCount[zoneIdx][setIdx]++ | ||||
| 	} | ||||
| 
 | ||||
| 	for zoneIdx := range erasureSetUpCount { | ||||
| 		parityDrives := globalStorageClass.GetParityForSC(storageclass.STANDARD) | ||||
| 		diskCount := len(z.zones[zoneIdx].format.XL.Sets[0]) | ||||
| 		if parityDrives == 0 { | ||||
| 			parityDrives = getDefaultParityBlocks(diskCount) | ||||
| 		} | ||||
| 		dataDrives := diskCount - parityDrives | ||||
| 		writeQuorum := dataDrives | ||||
| 		if dataDrives == parityDrives { | ||||
| 			writeQuorum++ | ||||
| 		} | ||||
| 		for setIdx := range erasureSetUpCount[zoneIdx] { | ||||
| 			if erasureSetUpCount[zoneIdx][setIdx] < writeQuorum { | ||||
| 				return false | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
| 
 | ||||
| // PutObjectTags - replace or add tags to an existing object | ||||
|  | ||||
							
								
								
									
										22
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								go.mod
									
									
									
									
									
								
							| @ -35,6 +35,7 @@ require ( | ||||
| 	github.com/go-sql-driver/mysql v1.4.1 | ||||
| 	github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 // indirect | ||||
| 	github.com/gomodule/redigo v2.0.0+incompatible | ||||
| 	github.com/google/btree v1.0.0 // indirect | ||||
| 	github.com/google/uuid v1.1.1 | ||||
| 	github.com/gopherjs/gopherjs v0.0.0-20190328170749-bb2674552d8f // indirect | ||||
| 	github.com/gorilla/handlers v1.4.0 | ||||
| @ -55,10 +56,11 @@ require ( | ||||
| 	github.com/klauspost/pgzip v1.2.1 | ||||
| 	github.com/klauspost/readahead v1.3.1 | ||||
| 	github.com/klauspost/reedsolomon v1.9.7 | ||||
| 	github.com/kr/text v0.2.0 // indirect | ||||
| 	github.com/lib/pq v1.1.1 | ||||
| 	github.com/mattn/go-colorable v0.1.1 | ||||
| 	github.com/mattn/go-colorable v0.1.4 | ||||
| 	github.com/mattn/go-ieproxy v0.0.0-20190805055040-f9202b1cfdeb // indirect | ||||
| 	github.com/mattn/go-isatty v0.0.7 | ||||
| 	github.com/mattn/go-isatty v0.0.8 | ||||
| 	github.com/mattn/go-runewidth v0.0.4 // indirect | ||||
| 	github.com/miekg/dns v1.1.8 | ||||
| 	github.com/minio/cli v1.22.0 | ||||
| @ -85,11 +87,11 @@ require ( | ||||
| 	github.com/nats-io/nats.go v1.9.1 | ||||
| 	github.com/nats-io/stan.go v0.4.5 | ||||
| 	github.com/ncw/directio v1.0.5 | ||||
| 	github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect | ||||
| 	github.com/nsqio/go-nsq v1.0.7 | ||||
| 	github.com/philhofer/fwd v1.0.0 // indirect | ||||
| 	github.com/pkg/errors v0.8.1 | ||||
| 	github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829 | ||||
| 	github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 // indirect | ||||
| 	github.com/prometheus/client_golang v0.9.3 | ||||
| 	github.com/rcrowley/go-metrics v0.0.0-20190704165056-9c2d0518ed81 // indirect | ||||
| 	github.com/rjeczalik/notify v0.9.2 | ||||
| 	github.com/rs/cors v1.6.0 | ||||
| @ -97,12 +99,14 @@ require ( | ||||
| 	github.com/shirou/gopsutil v2.20.3-0.20200314133625-53cec6b37e6a+incompatible | ||||
| 	github.com/sirupsen/logrus v1.5.0 | ||||
| 	github.com/smartystreets/assertions v0.0.0-20190401211740-f487f9de1cd3 // indirect | ||||
| 	github.com/smartystreets/goconvey v1.6.4 // indirect | ||||
| 	github.com/soheilhy/cmux v0.1.4 // indirect | ||||
| 	github.com/spaolacci/murmur3 v1.1.0 // indirect | ||||
| 	github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94 | ||||
| 	github.com/stretchr/testify v1.5.1 // indirect | ||||
| 	github.com/tinylib/msgp v1.1.1 | ||||
| 	github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 // indirect | ||||
| 	github.com/ugorji/go v1.1.5-pre // indirect | ||||
| 	github.com/ugorji/go/codec v1.1.5-pre // indirect | ||||
| 	github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a | ||||
| 	github.com/willf/bitset v1.1.10 // indirect | ||||
| 	github.com/willf/bloom v2.0.3+incompatible | ||||
| @ -115,13 +119,15 @@ require ( | ||||
| 	golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a // indirect | ||||
| 	golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd | ||||
| 	golang.org/x/text v0.3.2 // indirect | ||||
| 	golang.org/x/tools v0.0.0-20200428211428-0c9eba77bc32 // indirect | ||||
| 	golang.org/x/tools v0.0.0-20200502202811-ed308ab3e770 // indirect | ||||
| 	google.golang.org/api v0.5.0 | ||||
| 	google.golang.org/appengine v1.6.0 // indirect | ||||
| 	google.golang.org/genproto v0.0.0-20190513181449-d00d292a067c // indirect | ||||
| 	gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect | ||||
| 	gopkg.in/cheggaaa/pb.v1 v1.0.28 // indirect | ||||
| 	gopkg.in/ini.v1 v1.48.0 // indirect | ||||
| 	gopkg.in/ini.v1 v1.51.0 // indirect | ||||
| 	gopkg.in/ldap.v3 v3.0.3 | ||||
| 	gopkg.in/olivere/elastic.v5 v5.0.80 | ||||
| 	gopkg.in/yaml.v2 v2.2.4 | ||||
| 	gopkg.in/yaml.v2 v2.2.8 | ||||
| 	honnef.co/go/tools v0.0.1-2020.1.3 // indirect | ||||
| ) | ||||
|  | ||||
							
								
								
									
										62
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										62
									
								
								go.sum
									
									
									
									
									
								
							| @ -15,6 +15,7 @@ github.com/Azure/go-autorest v11.7.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSW | ||||
| github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= | ||||
| github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= | ||||
| github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= | ||||
| github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= | ||||
| github.com/Shopify/sarama v1.24.1 h1:svn9vfN3R1Hz21WR2Gj0VW9ehaDGkiOS+VqlIcZOkMI= | ||||
| github.com/Shopify/sarama v1.24.1/go.mod h1:fGP8eQ6PugKEI0iUETYYtnP6d1pH/bdDMTel1X5ajsU= | ||||
| github.com/Shopify/toxiproxy v2.1.4+incompatible h1:TKdv8HiTLgE5wdJuEML90aBgNWsokNbMijUGhmcoBJc= | ||||
| @ -37,10 +38,14 @@ github.com/beevik/ntp v0.2.0 h1:sGsd+kAXzT0bfVfzJfce04g+dSRfrs+tbQW8lweuYgw= | ||||
| github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= | ||||
| github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0= | ||||
| github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= | ||||
| github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= | ||||
| github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= | ||||
| github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= | ||||
| github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= | ||||
| github.com/census-instrumentation/opencensus-proto v0.2.0 h1:LzQXZOgg4CQfE6bFvXGM30YZL1WW/M337pXml+GrcZ4= | ||||
| github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= | ||||
| github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= | ||||
| github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= | ||||
| github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= | ||||
| github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= | ||||
| github.com/cheggaaa/pb v1.0.28 h1:kWGpdAcSp3MxMU9CCHOwz/8V0kCHN4+9yQm2MzWuI98= | ||||
| @ -60,11 +65,13 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9 | ||||
| github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= | ||||
| github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= | ||||
| github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= | ||||
| github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= | ||||
| github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||
| github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= | ||||
| github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||
| github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= | ||||
| github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= | ||||
| github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= | ||||
| github.com/djherbis/atime v1.0.0 h1:ySLvBAM0EvOGaX7TI4dAM5lWj+RdJUCKtGSEHN8SGBg= | ||||
| github.com/djherbis/atime v1.0.0/go.mod h1:5W+KBIuTwVGcqjIfaTwt+KSYX1o6uep8dtevevQP/f8= | ||||
| github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= | ||||
| @ -96,6 +103,7 @@ github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH | ||||
| github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= | ||||
| github.com/go-ldap/ldap v3.0.2+incompatible/go.mod h1:qfd9rJvER9Q0/D/Sqn1DfHRoBp40uXYvFoEVrNEPqRc= | ||||
| github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= | ||||
| github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= | ||||
| github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI= | ||||
| github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= | ||||
| github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= | ||||
| @ -122,6 +130,8 @@ github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNu | ||||
| github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= | ||||
| github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw= | ||||
| github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= | ||||
| github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= | ||||
| github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= | ||||
| github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= | ||||
| github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= | ||||
| github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= | ||||
| @ -234,20 +244,21 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN | ||||
| github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= | ||||
| github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= | ||||
| github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= | ||||
| github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= | ||||
| github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= | ||||
| github.com/lib/pq v1.1.1 h1:sJZmqHoEaY7f+NPP8pgLB/WxulyR3fewgCM2qaSlBb4= | ||||
| github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= | ||||
| github.com/mailru/easyjson v0.0.0-20180730094502-03f2033d19d5 h1:0x4qcEHDpruK6ML/m/YSlFUUu0UpRD3I2PHsNCuGnyA= | ||||
| github.com/mailru/easyjson v0.0.0-20180730094502-03f2033d19d5/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | ||||
| github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= | ||||
| github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= | ||||
| github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= | ||||
| github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= | ||||
| github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= | ||||
| github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= | ||||
| github.com/mattn/go-ieproxy v0.0.0-20190805055040-f9202b1cfdeb h1:hXqqXzQtJbENrsb+rsIqkVqcg4FUJL0SQFGw08Dgivw= | ||||
| github.com/mattn/go-ieproxy v0.0.0-20190805055040-f9202b1cfdeb/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= | ||||
| github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= | ||||
| github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= | ||||
| github.com/mattn/go-isatty v0.0.7 h1:UvyT9uN+3r7yLEYSlJsbQGdsaB/a0DlgWP3pql6iwOc= | ||||
| github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= | ||||
| github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= | ||||
| github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= | ||||
| github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y= | ||||
| github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= | ||||
| github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= | ||||
| @ -326,9 +337,12 @@ github.com/nats-io/stan.go v0.4.5 h1:lPZ9y1jVGiXcTaUc1SnEIWPYfh0avuEiHBePNJYgpPk | ||||
| github.com/nats-io/stan.go v0.4.5/go.mod h1:Ji7mK6gRZJSH1nc3ZJH6vi7zn/QnZhpR9Arm4iuzsUQ= | ||||
| github.com/ncw/directio v1.0.5 h1:JSUBhdjEvVaJvOoyPAbcW0fnd0tvRXD76wEfZ1KcQz4= | ||||
| github.com/ncw/directio v1.0.5/go.mod h1:rX/pKEYkOXBGOggmcyJeJGloCkleSvphPx2eV3t6ROk= | ||||
| github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= | ||||
| github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= | ||||
| github.com/nsqio/go-nsq v1.0.7 h1:O0pIZJYTf+x7cZBA0UMY8WxFG79lYTURmWzAAh48ljY= | ||||
| github.com/nsqio/go-nsq v1.0.7/go.mod h1:XP5zaUs3pqf+Q71EqUJs3HYfBIqfK6G83WQMdNN+Ito= | ||||
| github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= | ||||
| github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= | ||||
| github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= | ||||
| github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= | ||||
| github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= | ||||
| @ -346,19 +360,20 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN | ||||
| github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= | ||||
| github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= | ||||
| github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= | ||||
| github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829 h1:D+CiwcpGTW6pL6bv6KI3KbyEyCKyS+1JWS2h8PNDnGA= | ||||
| github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= | ||||
| github.com/prometheus/client_golang v0.9.3 h1:9iH4JKXLzFbOAdtqv/a+j8aewx2Y8lAjAydhbaScPF8= | ||||
| github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= | ||||
| github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= | ||||
| github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= | ||||
| github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= | ||||
| github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= | ||||
| github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= | ||||
| github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= | ||||
| github.com/prometheus/common v0.2.0 h1:kUZDBDTdBVBYBj5Tmh2NZLlF60mfjA27rM34b+cVwNU= | ||||
| github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= | ||||
| github.com/prometheus/common v0.4.0 h1:7etb9YClo3a6HjLzfl6rIQaU+FDfi0VSX39io3aQ+DM= | ||||
| github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= | ||||
| github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= | ||||
| github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= | ||||
| github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1 h1:/K3IL0Z1quvmJ7X0A1AwNEK7CRkVK3YwfOU/QAL4WGg= | ||||
| github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= | ||||
| github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084 h1:sofwID9zm4tzrgykg80hfFph1mryUeLRsUfoocVVmRY= | ||||
| github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= | ||||
| github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= | ||||
| github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= | ||||
| github.com/rcrowley/go-metrics v0.0.0-20190704165056-9c2d0518ed81 h1:zQTtDd7fQiF9e80lbl+ShnD9/5NSq5r1EhcS8955ECg= | ||||
| github.com/rcrowley/go-metrics v0.0.0-20190704165056-9c2d0518ed81/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= | ||||
| @ -384,8 +399,11 @@ github.com/smartystreets/assertions v0.0.0-20190401211740-f487f9de1cd3/go.mod h1 | ||||
| github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM= | ||||
| github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a h1:pa8hGb/2YqsZKovtsgrwcDH1RZhVbTKCjLp47XpqCDs= | ||||
| github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= | ||||
| github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= | ||||
| github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= | ||||
| github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= | ||||
| github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= | ||||
| github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= | ||||
| github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= | ||||
| github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= | ||||
| github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94 h1:0ngsPmuP6XIjiFRNFYlvKwSr5zff2v+uPHaffZ6/M4k= | ||||
| @ -396,6 +414,8 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf | ||||
| github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= | ||||
| github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= | ||||
| github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= | ||||
| github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= | ||||
| github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= | ||||
| github.com/tidwall/gjson v1.3.5 h1:2oW9FBNu8qt9jy5URgrzsVx/T/KSn3qn/smJQ0crlDQ= | ||||
| github.com/tidwall/gjson v1.3.5/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= | ||||
| github.com/tidwall/match v1.0.1 h1:PnKP62LPNxHKTwvHHZZzdOAOCtsJTjo6dZLCwpKm5xc= | ||||
| @ -466,7 +486,6 @@ golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73r | ||||
| golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | ||||
| golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | ||||
| @ -524,8 +543,9 @@ golang.org/x/tools v0.0.0-20190914235951-31e00f45c22e/go.mod h1:b+2E5dAYhXwXZwtn | ||||
| golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||
| golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||
| golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||
| golang.org/x/tools v0.0.0-20200428211428-0c9eba77bc32 h1:Xvf3ZQTm5bjXPxhI7g+dwqsCqadK1rcNtwtszuatetk= | ||||
| golang.org/x/tools v0.0.0-20200428211428-0c9eba77bc32/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= | ||||
| golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||
| golang.org/x/tools v0.0.0-20200502202811-ed308ab3e770 h1:M9Fif0OxNji8w+HvmhVQ8KJtiZOsjU9RgslJGhn95XE= | ||||
| golang.org/x/tools v0.0.0-20200502202811-ed308ab3e770/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= | ||||
| golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= | ||||
| @ -554,12 +574,14 @@ gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUy | ||||
| gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
| gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= | ||||
| gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
| gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= | ||||
| gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
| gopkg.in/cheggaaa/pb.v1 v1.0.28 h1:n1tBJnnK2r7g9OW2btFH91V92STTUevLXYFb8gy9EMk= | ||||
| gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= | ||||
| gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= | ||||
| gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= | ||||
| gopkg.in/ini.v1 v1.48.0 h1:URjZc+8ugRY5mL5uUeQH/a63JcHwdX9xZaWvmNWD7z8= | ||||
| gopkg.in/ini.v1 v1.48.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= | ||||
| gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= | ||||
| gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= | ||||
| gopkg.in/jcmturner/aescts.v1 v1.0.1 h1:cVVZBK2b1zY26haWB4vbBiZrfFQnfbTVrE3xZq6hrEw= | ||||
| gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= | ||||
| gopkg.in/jcmturner/dnsutils.v1 v1.0.1 h1:cIuC1OLRGZrld+16ZJvvZxVJeKPsvd5eUIvxfoN5hSM= | ||||
| @ -581,11 +603,13 @@ gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHO | ||||
| gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= | ||||
| gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||
| gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||
| gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= | ||||
| gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||
| gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= | ||||
| gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||
| honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | ||||
| honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | ||||
| honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | ||||
| honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= | ||||
| honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= | ||||
| honnef.co/go/tools v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U= | ||||
| honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= | ||||
| rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user