From 38c5fe8b5a9a40c96d5dc227921dbebde2fc6ad8 Mon Sep 17 00:00:00 2001 From: Evstigneev Denis Date: Mon, 9 Dec 2024 16:23:25 +0300 Subject: [PATCH 1/2] fixed struct alignment && refactor linter (#369) ## Pull Request template Please, go through these steps before clicking submit on this PR. 1. Give a descriptive title to your PR. 2. Provide a description of your changes. 3. Make sure you have some relevant tests. 4. Put `closes #XXXX` in your comment to auto-close the issue that your PR fixes (if applicable). **PLEASE REMOVE THIS TEMPLATE BEFORE SUBMITTING** Reviewed-on: https://git.unistack.org/unistack-org/micro/pulls/369 Co-authored-by: Evstigneev Denis Co-committed-by: Evstigneev Denis --- broker/memory/memory_test.go | 2 +- broker/options.go | 17 ++++-- client/backoff.go | 10 ++-- client/backoff_test.go | 10 ++-- client/noop.go | 16 +++--- client/options.go | 64 ++++++++++++--------- config/config.go | 2 +- config/default_test.go | 31 +++++++--- config/options.go | 12 ++-- errors/errors_test.go | 5 +- fsm/default.go | 2 +- go.mod | 1 + go.sum | 2 + logger/context.go | 4 +- logger/logger.go | 2 +- logger/options.go | 55 +++++++++--------- logger/slog/slog.go | 2 +- logger/slog/slog_test.go | 5 +- logger/unwrap/unwrap.go | 12 ++-- metadata/metadata_test.go | 7 +-- meter/meter.go | 2 +- meter/noop.go | 14 ++--- micro_test.go | 49 ++++++++-------- mtls/options.go | 19 ++++--- network/transport/transport.go | 2 +- network/tunnel/broker/broker.go | 4 +- profiler/noop.go | 2 +- profiler/profile.go | 2 +- register/memory/memory.go | 8 +-- register/memory/memory_test.go | 12 ++-- register/register.go | 2 +- resolver/noop/noop.go | 2 +- router/router.go | 2 +- selector/random/random.go | 2 +- selector/roundrobin/roundrobin.go | 6 +- server/noop.go | 13 +++-- server/noop_test.go | 4 +- server/options.go | 78 +++++++++++++------------- server/server.go | 2 +- service_test.go | 70 +++++++++++++++-------- store/memory/memory.go | 6 +- store/noop.go | 39 +++++++------ store/options.go | 22 ++++---- store/store.go | 2 +- sync/memory.go | 3 +- util/dns/cache.go | 13 ++--- util/dns/cache_test.go | 6 +- util/dns/conn.go | 46 +++++++-------- util/grpc/tracer.go | 4 +- util/http/trie.go | 8 +-- util/jitter/random.go | 4 +- util/jitter/ticker.go | 12 ++-- util/jitter/ticker_test.go | 12 ++-- util/net/net.go | 8 +-- util/reflect/path.go | 2 +- util/reflect/reflect_test.go | 4 +- util/register/util.go | 13 ++--- util/ring/buffer.go | 3 +- util/socket/pool.go | 2 +- util/stream/stream.go | 3 +- util/structfs/metadata_digitalocean.go | 32 ++++++----- util/structfs/metadata_ec2.go | 40 ++++++------- util/structfs/structfs.go | 12 ++-- util/structfs/structfs_test.go | 2 +- util/test/test.go | 6 +- util/text/text.go | 9 ++- util/time/duration.go | 9 ++- 67 files changed, 480 insertions(+), 398 deletions(-) diff --git a/broker/memory/memory_test.go b/broker/memory/memory_test.go index 7557e6b0..94729f18 100644 --- a/broker/memory/memory_test.go +++ b/broker/memory/memory_test.go @@ -74,7 +74,7 @@ func TestMemoryBroker(t *testing.T) { topic := "test" count := 10 - fn := func(p broker.Event) error { + fn := func(_ broker.Event) error { return nil } diff --git a/broker/options.go b/broker/options.go index 7e26adbc..38771e55 100644 --- a/broker/options.go +++ b/broker/options.go @@ -16,6 +16,9 @@ import ( // Options struct type Options struct { + // Name holds the broker name + Name string + // Tracer used for tracing Tracer tracer.Tracer // Register can be used for clustering @@ -28,23 +31,25 @@ type Options struct { Meter meter.Meter // Context holds external options Context context.Context + + // Wait waits for a collection of goroutines to finish + Wait *sync.WaitGroup // TLSConfig holds tls.TLSConfig options TLSConfig *tls.Config + // ErrorHandler used when broker can't unmarshal incoming message ErrorHandler Handler // BatchErrorHandler used when broker can't unmashal incoming messages BatchErrorHandler BatchHandler - // Name holds the broker name - Name string + // Addrs holds the broker address Addrs []string - // Wait waits for a collection of goroutines to finish - Wait *sync.WaitGroup - // GracefulTimeout contains time to wait to finish in flight requests - GracefulTimeout time.Duration // Hooks can be run before broker Publish/BatchPublish and // Subscribe/BatchSubscribe methods Hooks options.Hooks + + // GracefulTimeout contains time to wait to finish in flight requests + GracefulTimeout time.Duration } // NewOptions create new Options diff --git a/client/backoff.go b/client/backoff.go index 7eaacf7e..bc36a1b4 100644 --- a/client/backoff.go +++ b/client/backoff.go @@ -17,13 +17,13 @@ func BackoffExp(_ context.Context, _ Request, attempts int) (time.Duration, erro } // BackoffInterval specifies randomization interval for backoff func -func BackoffInterval(min time.Duration, max time.Duration) BackoffFunc { +func BackoffInterval(minTime time.Duration, maxTime time.Duration) BackoffFunc { return func(_ context.Context, _ Request, attempts int) (time.Duration, error) { td := time.Duration(math.Pow(float64(attempts), math.E)) * time.Millisecond * 100 - if td < min { - return min, nil - } else if td > max { - return max, nil + if td < minTime { + return minTime, nil + } else if td > maxTime { + return maxTime, nil } return td, nil } diff --git a/client/backoff_test.go b/client/backoff_test.go index 59bb7a41..36f63212 100644 --- a/client/backoff_test.go +++ b/client/backoff_test.go @@ -34,23 +34,23 @@ func TestBackoffExp(t *testing.T) { } func TestBackoffInterval(t *testing.T) { - min := 100 * time.Millisecond - max := 300 * time.Millisecond + minTime := 100 * time.Millisecond + maxTime := 300 * time.Millisecond r := &testRequest{ service: "test", method: "test", } - fn := BackoffInterval(min, max) + fn := BackoffInterval(minTime, maxTime) for i := 0; i < 5; i++ { d, err := fn(context.TODO(), r, i) if err != nil { t.Fatal(err) } - if d < min || d > max { - t.Fatalf("Expected %v < %v < %v", min, d, max) + if d < minTime || d > maxTime { + t.Fatalf("Expected %v < %v < %v", minTime, d, maxTime) } } } diff --git a/client/noop.go b/client/noop.go index dc24e1ec..db960e62 100644 --- a/client/noop.go +++ b/client/noop.go @@ -298,7 +298,7 @@ func (n *noopClient) fnCall(ctx context.Context, req Request, rsp interface{}, o // call backoff first. Someone may want an initial start delay t, err := callOpts.Backoff(ctx, req, i) if err != nil { - return errors.InternalServerError("go.micro.client", "%s", err.Error()) + return errors.InternalServerError("go.micro.client", "%s", err) } // only sleep if greater than 0 @@ -312,7 +312,7 @@ func (n *noopClient) fnCall(ctx context.Context, req Request, rsp interface{}, o // TODO apply any filtering here routes, err = n.opts.Lookup(ctx, req, callOpts) if err != nil { - return errors.InternalServerError("go.micro.client", "%s", err.Error()) + return errors.InternalServerError("go.micro.client", "%s", err) } // balance the list of nodes @@ -372,7 +372,7 @@ func (n *noopClient) fnCall(ctx context.Context, req Request, rsp interface{}, o return gerr } -func (n *noopClient) NewRequest(service, endpoint string, req interface{}, opts ...RequestOption) Request { +func (n *noopClient) NewRequest(service, endpoint string, _ interface{}, _ ...RequestOption) Request { return &noopRequest{service: service, endpoint: endpoint} } @@ -466,7 +466,7 @@ func (n *noopClient) fnStream(ctx context.Context, req Request, opts ...CallOpti // call backoff first. Someone may want an initial start delay t, cerr := callOpts.Backoff(ctx, req, i) if cerr != nil { - return nil, errors.InternalServerError("go.micro.client", "%s", cerr.Error()) + return nil, errors.InternalServerError("go.micro.client", "%s", cerr) } // only sleep if greater than 0 @@ -480,7 +480,7 @@ func (n *noopClient) fnStream(ctx context.Context, req Request, opts ...CallOpti // TODO apply any filtering here routes, err = n.opts.Lookup(ctx, req, callOpts) if err != nil { - return nil, errors.InternalServerError("go.micro.client", "%s", err.Error()) + return nil, errors.InternalServerError("go.micro.client", "%s", err) } // balance the list of nodes @@ -546,7 +546,7 @@ func (n *noopClient) fnStream(ctx context.Context, req Request, opts ...CallOpti return nil, grr } -func (n *noopClient) stream(ctx context.Context, addr string, req Request, opts CallOptions) (Stream, error) { +func (n *noopClient) stream(ctx context.Context, _ string, _ Request, _ CallOptions) (Stream, error) { return &noopStream{ctx: ctx}, nil } @@ -609,13 +609,13 @@ func (n *noopClient) publish(ctx context.Context, ps []Message, opts ...PublishO // use codec for payload cf, err := n.newCodec(p.ContentType()) if err != nil { - return errors.InternalServerError("go.micro.client", "%s", err.Error()) + return errors.InternalServerError("go.micro.client", "%s", err) } // set the body b, err := cf.Marshal(p.Payload()) if err != nil { - return errors.InternalServerError("go.micro.client", "%s", err.Error()) + return errors.InternalServerError("go.micro.client", "%s", err) } body = b } diff --git a/client/options.go b/client/options.go index 84b86672..905d8da4 100644 --- a/client/options.go +++ b/client/options.go @@ -21,6 +21,16 @@ import ( // Options holds client options type Options struct { + // Codecs map + Codecs map[string]codec.Codec + + // Proxy is used for proxy requests + Proxy string + // ContentType is used to select codec + ContentType string + // Name is the client name + Name string + // Selector used to select needed address Selector selector.Selector // Logger used to log messages @@ -35,31 +45,28 @@ type Options struct { Context context.Context // Router used to get route Router router.Router + // TLSConfig specifies tls.Config for secure connection TLSConfig *tls.Config - // Codecs map - Codecs map[string]codec.Codec + // Lookup func used to get destination addr Lookup LookupFunc - // Proxy is used for proxy requests - Proxy string - // ContentType is used to select codec - ContentType string - // Name is the client name - Name string + // ContextDialer used to connect + ContextDialer func(context.Context, string) (net.Conn, error) + // Wrappers contains wrappers Wrappers []Wrapper + // Hooks can be run before broker Publish/BatchPublish and + // Subscribe/BatchSubscribe methods + Hooks options.Hooks + // CallOptions contains default CallOptions CallOptions CallOptions + // PoolSize connection pool size PoolSize int // PoolTTL connection pool ttl PoolTTL time.Duration - // ContextDialer used to connect - ContextDialer func(context.Context, string) (net.Conn, error) - // Hooks can be run before broker Publish/BatchPublish and - // Subscribe/BatchSubscribe methods - Hooks options.Hooks } // NewCallOptions creates new call options struct @@ -73,6 +80,16 @@ func NewCallOptions(opts ...CallOption) CallOptions { // CallOptions holds client call options type CallOptions struct { + // RequestMetadata holds additional metadata for call + RequestMetadata metadata.Metadata + + // Network name + Network string + // Content-Type + ContentType string + // AuthToken string + AuthToken string + // Selector selects addr Selector selector.Selector // Context used for deadline @@ -80,33 +97,30 @@ type CallOptions struct { // Router used for route Router router.Router // Retry func used for retries + + // ResponseMetadata holds additional metadata from call + ResponseMetadata *metadata.Metadata + Retry RetryFunc // Backoff func used for backoff when retry Backoff BackoffFunc - // Network name - Network string - // Content-Type - ContentType string - // AuthToken string - AuthToken string + // ContextDialer used to connect + ContextDialer func(context.Context, string) (net.Conn, error) + // Address specifies static addr list Address []string // SelectOptions selector options SelectOptions []selector.SelectOption + // StreamTimeout stream timeout StreamTimeout time.Duration // RequestTimeout request timeout RequestTimeout time.Duration - // RequestMetadata holds additional metadata for call - RequestMetadata metadata.Metadata - // ResponseMetadata holds additional metadata from call - ResponseMetadata *metadata.Metadata + // DialTimeout dial timeout DialTimeout time.Duration // Retries specifies retries num Retries int - // ContextDialer used to connect - ContextDialer func(context.Context, string) (net.Conn, error) } // ContextDialer pass ContextDialer to client diff --git a/config/config.go b/config/config.go index a1831826..2029b1ac 100644 --- a/config/config.go +++ b/config/config.go @@ -13,7 +13,7 @@ type Validator interface { } // DefaultConfig default config -var DefaultConfig Config = NewConfig() +var DefaultConfig = NewConfig() // DefaultWatcherMinInterval default min interval for poll changes var DefaultWatcherMinInterval = 5 * time.Second diff --git a/config/default_test.go b/config/default_test.go index a4d90650..a94c9cb2 100644 --- a/config/default_test.go +++ b/config/default_test.go @@ -3,6 +3,7 @@ package config_test import ( "context" "fmt" + "reflect" "testing" "time" @@ -12,15 +13,17 @@ import ( ) type cfg struct { - StringValue string `default:"string_value"` - IgnoreValue string `json:"-"` - StructValue *cfgStructValue - IntValue int `default:"99"` - DurationValue time.Duration `default:"10s"` - MDurationValue mtime.Duration `default:"10s"` - MapValue map[string]bool `default:"key1=true,key2=false"` - UUIDValue string `default:"micro:generate uuid"` - IDValue string `default:"micro:generate id"` + MapValue map[string]bool `default:"key1=true,key2=false"` + StructValue *cfgStructValue + + StringValue string `default:"string_value"` + IgnoreValue string `json:"-"` + UUIDValue string `default:"micro:generate uuid"` + IDValue string `default:"micro:generate id"` + + DurationValue time.Duration `default:"10s"` + MDurationValue mtime.Duration `default:"10s"` + IntValue int `default:"99"` } type cfgStructValue struct { @@ -134,3 +137,13 @@ func TestValidate(t *testing.T) { t.Fatal(err) } } + +func Test_SizeOf(t *testing.T) { + st := cfg{} + + tVal := reflect.TypeOf(st) + for i := 0; i < tVal.NumField(); i++ { + field := tVal.Field(i) + fmt.Printf("Field: %s, Offset: %d, Size: %d\n", field.Name, field.Offset, field.Type.Size()) + } +} diff --git a/config/options.go b/config/options.go index 62e57659..43d7dcfe 100644 --- a/config/options.go +++ b/config/options.go @@ -41,14 +41,16 @@ type Options struct { BeforeInit []func(context.Context, Config) error // AfterInit contains slice of funcs that runs after Init AfterInit []func(context.Context, Config) error - // AllowFail flag to allow fail in config source - AllowFail bool + // SkipLoad runs only if condition returns true SkipLoad func(context.Context, Config) bool // SkipSave runs only if condition returns true SkipSave func(context.Context, Config) bool // Hooks can be run before/after config Save/Load Hooks options.Hooks + + // AllowFail flag to allow fail in config source + AllowFail bool } // Option function signature @@ -278,10 +280,10 @@ func WatchCoalesce(b bool) WatchOption { } // WatchInterval specifies min and max time.Duration for pulling changes -func WatchInterval(min, max time.Duration) WatchOption { +func WatchInterval(minTime, maxTime time.Duration) WatchOption { return func(o *WatchOptions) { - o.MinInterval = min - o.MaxInterval = max + o.MinInterval = minTime + o.MaxInterval = maxTime } } diff --git a/errors/errors_test.go b/errors/errors_test.go index dd476637..229f5da2 100644 --- a/errors/errors_test.go +++ b/errors/errors_test.go @@ -3,7 +3,6 @@ package errors import ( "encoding/json" "errors" - er "errors" "fmt" "net/http" "testing" @@ -43,7 +42,7 @@ func TestFromError(t *testing.T) { if merr.ID != "go.micro.test" || merr.Code != 404 { t.Fatalf("invalid conversation %v != %v", err, merr) } - err = er.New(err.Error()) + err = errors.New(err.Error()) merr = FromError(err) if merr.ID != "go.micro.test" || merr.Code != 404 { t.Fatalf("invalid conversation %v != %v", err, merr) @@ -58,7 +57,7 @@ func TestEqual(t *testing.T) { t.Fatal("errors must be equal") } - err3 := er.New("my test err") + err3 := errors.New("my test err") if Equal(err1, err3) { t.Fatal("errors must be not equal") } diff --git a/fsm/default.go b/fsm/default.go index 28500cda..d88347f9 100644 --- a/fsm/default.go +++ b/fsm/default.go @@ -32,7 +32,7 @@ type fsm struct { // NewFSM creates a new finite state machine having the specified initial state // with specified options -func NewFSM(opts ...Option) *fsm { +func NewFSM(opts ...Option) FSM { return &fsm{ statesMap: map[string]StateFunc{}, opts: NewOptions(opts...), diff --git a/go.mod b/go.mod index 9052eded..bd458e17 100644 --- a/go.mod +++ b/go.mod @@ -14,6 +14,7 @@ require ( golang.org/x/sync v0.3.0 google.golang.org/grpc v1.57.0 google.golang.org/protobuf v1.33.0 + gopkg.in/yaml.v3 v3.0.1 ) require ( diff --git a/go.sum b/go.sum index 025a4af7..94b37a9f 100644 --- a/go.sum +++ b/go.sum @@ -74,5 +74,7 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= 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/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/logger/context.go b/logger/context.go index 848b9bca..d3b7d67c 100644 --- a/logger/context.go +++ b/logger/context.go @@ -7,12 +7,12 @@ type loggerKey struct{} // MustContext returns logger from passed context or DefaultLogger if empty func MustContext(ctx context.Context) Logger { if ctx == nil { - return DefaultLogger + return DefaultLogger.Clone() } if l, ok := ctx.Value(loggerKey{}).(Logger); ok && l != nil { return l } - return DefaultLogger + return DefaultLogger.Clone() } // FromContext returns logger from passed context diff --git a/logger/logger.go b/logger/logger.go index 33622533..cc7c8c8c 100644 --- a/logger/logger.go +++ b/logger/logger.go @@ -11,7 +11,7 @@ var DefaultContextAttrFuncs []ContextAttrFunc var ( // DefaultLogger variable - DefaultLogger Logger = NewLogger() + DefaultLogger = NewLogger() // DefaultLevel used by logger DefaultLevel = InfoLevel ) diff --git a/logger/options.go b/logger/options.go index a1a71048..3b91bbbe 100644 --- a/logger/options.go +++ b/logger/options.go @@ -15,18 +15,6 @@ type Option func(*Options) // Options holds logger options type Options struct { - // Out holds the output writer - Out io.Writer - // Context holds exernal options - Context context.Context - // Name holds the logger name - Name string - // Fields holds additional metadata - Fields []interface{} - // callerSkipCount number of frmaes to skip - CallerSkipCount int - // ContextAttrFuncs contains funcs that executed before log func on context - ContextAttrFuncs []ContextAttrFunc // TimeKey is the key used for the time of the log call TimeKey string // LevelKey is the key used for the level of the log call @@ -39,16 +27,31 @@ type Options struct { SourceKey string // StacktraceKey is the key used for the stacktrace StacktraceKey string - // AddStacktrace controls writing of stacktaces on error - AddStacktrace bool - // AddSource enabled writing source file and position in log - AddSource bool - // The logging level the logger should log - Level Level - // TimeFunc used to obtain current time - TimeFunc func() time.Time + // Name holds the logger name + Name string + + // Out holds the output writer + Out io.Writer + // Context holds exernal options + Context context.Context // Meter used to count logs for specific level Meter meter.Meter + // TimeFunc used to obtain current time + TimeFunc func() time.Time + + // Fields holds additional metadata + Fields []interface{} + // ContextAttrFuncs contains funcs that executed before log func on context + ContextAttrFuncs []ContextAttrFunc + + // callerSkipCount number of frmaes to skip + CallerSkipCount int + // The logging level the logger should log + Level Level + // AddSource enabled writing source file and position in log + AddSource bool + // AddStacktrace controls writing of stacktaces on error + AddStacktrace bool } // NewOptions creates new options struct @@ -153,8 +156,8 @@ func WithTimeFunc(fn func() time.Time) Option { func WithZapKeys() Option { return func(o *Options) { o.TimeKey = "@timestamp" - o.LevelKey = "level" - o.MessageKey = "msg" + o.LevelKey = slog.LevelKey + o.MessageKey = slog.MessageKey o.SourceKey = "caller" o.StacktraceKey = "stacktrace" o.ErrorKey = "error" @@ -163,8 +166,8 @@ func WithZapKeys() Option { func WithZerologKeys() Option { return func(o *Options) { - o.TimeKey = "time" - o.LevelKey = "level" + o.TimeKey = slog.TimeKey + o.LevelKey = slog.LevelKey o.MessageKey = "message" o.SourceKey = "caller" o.StacktraceKey = "stacktrace" @@ -186,8 +189,8 @@ func WithSlogKeys() Option { func WithMicroKeys() Option { return func(o *Options) { o.TimeKey = "timestamp" - o.LevelKey = "level" - o.MessageKey = "msg" + o.LevelKey = slog.LevelKey + o.MessageKey = slog.MessageKey o.SourceKey = "caller" o.StacktraceKey = "stacktrace" o.ErrorKey = "error" diff --git a/logger/slog/slog.go b/logger/slog/slog.go index 534675f5..ad0aacb1 100644 --- a/logger/slog/slog.go +++ b/logger/slog/slog.go @@ -340,7 +340,7 @@ func (s *slogLogger) argsAttrs(args []interface{}) ([]slog.Attr, error) { case string: if idx+1 < len(args) { attrs = append(attrs, slog.Any(arg, args[idx+1])) - idx += 1 + idx++ } else { attrs = append(attrs, slog.String(badKey, arg)) } diff --git a/logger/slog/slog_test.go b/logger/slog/slog_test.go index 24a60bde..6aa73e81 100644 --- a/logger/slog/slog_test.go +++ b/logger/slog/slog_test.go @@ -11,9 +11,8 @@ import ( "testing" "github.com/google/uuid" - "go.unistack.org/micro/v3/metadata" - "go.unistack.org/micro/v3/logger" + "go.unistack.org/micro/v3/metadata" ) func TestWithHandlerFunc(t *testing.T) { @@ -133,7 +132,7 @@ func TestErrorf(t *testing.T) { buf := bytes.NewBuffer(nil) l := NewLogger(logger.WithLevel(logger.ErrorLevel), logger.WithOutput(buf), logger.WithAddStacktrace(true)) - if err := l.Init(logger.WithContextAttrFuncs(func(ctx context.Context) []interface{} { + if err := l.Init(logger.WithContextAttrFuncs(func(_ context.Context) []interface{} { return nil })); err != nil { t.Fatal(err) diff --git a/logger/unwrap/unwrap.go b/logger/unwrap/unwrap.go index 5cfcf167..8bab179d 100644 --- a/logger/unwrap/unwrap.go +++ b/logger/unwrap/unwrap.go @@ -52,13 +52,15 @@ type protoMessage interface { } type Wrapper struct { - val interface{} - s fmt.State - pointers map[uintptr]int - opts *Options + pointers map[uintptr]int + takeMap map[int]bool + + val interface{} + s fmt.State + opts *Options + depth int ignoreNextType bool - takeMap map[int]bool protoWrapperType bool sqlWrapperType bool } diff --git a/metadata/metadata_test.go b/metadata/metadata_test.go index 7b6eb885..84738f81 100644 --- a/metadata/metadata_test.go +++ b/metadata/metadata_test.go @@ -79,15 +79,14 @@ func TestPassing(t *testing.T) { ctx = NewIncomingContext(ctx, md1) testCtx(ctx) - md, ok := FromOutgoingContext(ctx) + _, ok := FromOutgoingContext(ctx) if ok { t.Fatalf("create outgoing context") } - _ = md ctx = NewOutgoingContext(ctx, New(1)) testCtx(ctx) - md, ok = FromOutgoingContext(ctx) + md, ok := FromOutgoingContext(ctx) if !ok { t.Fatalf("missing metadata from outgoing context") } @@ -110,7 +109,7 @@ func TestMerge(t *testing.T) { } } -func TestIterator(t *testing.T) { +func TestIterator(_ *testing.T) { md := Metadata{ "1Last": "last", "2First": "first", diff --git a/meter/meter.go b/meter/meter.go index 42b20473..90540859 100644 --- a/meter/meter.go +++ b/meter/meter.go @@ -11,7 +11,7 @@ import ( var ( // DefaultMeter is the default meter - DefaultMeter Meter = NewMeter() + DefaultMeter = NewMeter() // DefaultAddress data will be made available on this host:port DefaultAddress = ":9090" // DefaultPath the meter endpoint where the Meter data will be made available diff --git a/meter/noop.go b/meter/noop.go index a1b47a94..a65c558b 100644 --- a/meter/noop.go +++ b/meter/noop.go @@ -37,32 +37,32 @@ func (r *noopMeter) Init(opts ...Option) error { } // Counter implements the Meter interface -func (r *noopMeter) Counter(name string, labels ...string) Counter { +func (r *noopMeter) Counter(_ string, labels ...string) Counter { return &noopCounter{labels: labels} } // FloatCounter implements the Meter interface -func (r *noopMeter) FloatCounter(name string, labels ...string) FloatCounter { +func (r *noopMeter) FloatCounter(_ string, labels ...string) FloatCounter { return &noopFloatCounter{labels: labels} } // Gauge implements the Meter interface -func (r *noopMeter) Gauge(name string, f func() float64, labels ...string) Gauge { +func (r *noopMeter) Gauge(_ string, _ func() float64, labels ...string) Gauge { return &noopGauge{labels: labels} } // Summary implements the Meter interface -func (r *noopMeter) Summary(name string, labels ...string) Summary { +func (r *noopMeter) Summary(_ string, labels ...string) Summary { return &noopSummary{labels: labels} } // SummaryExt implements the Meter interface -func (r *noopMeter) SummaryExt(name string, window time.Duration, quantiles []float64, labels ...string) Summary { +func (r *noopMeter) SummaryExt(_ string, _ time.Duration, _ []float64, labels ...string) Summary { return &noopSummary{labels: labels} } // Histogram implements the Meter interface -func (r *noopMeter) Histogram(name string, labels ...string) Histogram { +func (r *noopMeter) Histogram(_ string, labels ...string) Histogram { return &noopHistogram{labels: labels} } @@ -77,7 +77,7 @@ func (r *noopMeter) Set(opts ...Option) Meter { return m } -func (r *noopMeter) Write(w io.Writer, opts ...Option) error { +func (r *noopMeter) Write(_ io.Writer, _ ...Option) error { return nil } diff --git a/micro_test.go b/micro_test.go index 20272e8c..a4d90fea 100644 --- a/micro_test.go +++ b/micro_test.go @@ -18,26 +18,27 @@ func TestAs(t *testing.T) { testCases := []struct { b any target any - match bool want any + + match bool }{ { - broTarget, - &b, - true, - broTarget, + b: broTarget, + target: &b, + match: true, + want: broTarget, }, { - nil, - &b, - false, - nil, + b: nil, + target: &b, + match: false, + want: nil, }, { - fsmTarget, - &b, - false, - nil, + b: fsmTarget, + target: &b, + match: false, + want: nil, }, } for i, tc := range testCases { @@ -72,7 +73,7 @@ func (p *bro) Ready() bool { return true } func (p *bro) Health() bool { return true } -func (p *bro) Init(opts ...broker.Option) error { return nil } +func (p *bro) Init(_ ...broker.Option) error { return nil } // Options returns broker options func (p *bro) Options() broker.Options { return broker.Options{} } @@ -81,28 +82,28 @@ func (p *bro) Options() broker.Options { return broker.Options{} } func (p *bro) Address() string { return "" } // Connect connects to broker -func (p *bro) Connect(ctx context.Context) error { return nil } +func (p *bro) Connect(_ context.Context) error { return nil } // Disconnect disconnect from broker -func (p *bro) Disconnect(ctx context.Context) error { return nil } +func (p *bro) Disconnect(_ context.Context) error { return nil } // Publish message, msg can be single broker.Message or []broker.Message -func (p *bro) Publish(ctx context.Context, topic string, msg *broker.Message, opts ...broker.PublishOption) error { +func (p *bro) Publish(_ context.Context, _ string, _ *broker.Message, _ ...broker.PublishOption) error { return nil } // BatchPublish messages to broker with multiple topics -func (p *bro) BatchPublish(ctx context.Context, msgs []*broker.Message, opts ...broker.PublishOption) error { +func (p *bro) BatchPublish(_ context.Context, _ []*broker.Message, _ ...broker.PublishOption) error { return nil } // BatchSubscribe subscribes to topic messages via handler -func (p *bro) BatchSubscribe(ctx context.Context, topic string, h broker.BatchHandler, opts ...broker.SubscribeOption) (broker.Subscriber, error) { +func (p *bro) BatchSubscribe(_ context.Context, _ string, _ broker.BatchHandler, _ ...broker.SubscribeOption) (broker.Subscriber, error) { return nil, nil } // Subscribe subscribes to topic message via handler -func (p *bro) Subscribe(ctx context.Context, topic string, handler broker.Handler, opts ...broker.SubscribeOption) (broker.Subscriber, error) { +func (p *bro) Subscribe(_ context.Context, _ string, _ broker.Handler, _ ...broker.SubscribeOption) (broker.Subscriber, error) { return nil, nil } @@ -113,9 +114,9 @@ type fsmT struct { name string } -func (f *fsmT) Start(ctx context.Context, a interface{}, o ...Option) (interface{}, error) { +func (f *fsmT) Start(_ context.Context, _ interface{}, _ ...Option) (interface{}, error) { return nil, nil } -func (f *fsmT) Current() string { return f.name } -func (f *fsmT) Reset() {} -func (f *fsmT) State(s string, sf fsm.StateFunc) {} +func (f *fsmT) Current() string { return f.name } +func (f *fsmT) Reset() {} +func (f *fsmT) State(_ string, _ fsm.StateFunc) {} diff --git a/mtls/options.go b/mtls/options.go index b5547f7e..55f3b2b6 100644 --- a/mtls/options.go +++ b/mtls/options.go @@ -8,19 +8,20 @@ import ( // CertificateOptions holds options for x509.CreateCertificate type CertificateOptions struct { - Organization []string - OrganizationalUnit []string - CommonName string - OCSPServer []string - IssuingCertificateURL []string SerialNumber *big.Int NotAfter time.Time NotBefore time.Time - SignatureAlgorithm x509.SignatureAlgorithm - PublicKeyAlgorithm x509.PublicKeyAlgorithm + CommonName string + Organization []string + OrganizationalUnit []string + OCSPServer []string + IssuingCertificateURL []string ExtKeyUsage []x509.ExtKeyUsage - KeyUsage x509.KeyUsage - IsCA bool + + SignatureAlgorithm x509.SignatureAlgorithm + PublicKeyAlgorithm x509.PublicKeyAlgorithm + KeyUsage x509.KeyUsage + IsCA bool } // CertificateOrganizationalUnit set OrganizationalUnit in certificate subject diff --git a/network/transport/transport.go b/network/transport/transport.go index 2e33dcc5..17b9e545 100644 --- a/network/transport/transport.go +++ b/network/transport/transport.go @@ -10,7 +10,7 @@ import ( var ( // DefaultTransport is the global default transport - DefaultTransport Transport = NewTransport() + DefaultTransport = NewTransport() // DefaultDialTimeout the default dial timeout DefaultDialTimeout = time.Second * 5 ) diff --git a/network/tunnel/broker/broker.go b/network/tunnel/broker/broker.go index a05e0ecb..523e2d12 100644 --- a/network/tunnel/broker/broker.go +++ b/network/tunnel/broker/broker.go @@ -84,7 +84,7 @@ func (t *tunBroker) Disconnect(ctx context.Context) error { return t.tunnel.Close(ctx) } -func (t *tunBroker) BatchPublish(ctx context.Context, msgs []*broker.Message, opts ...broker.PublishOption) error { +func (t *tunBroker) BatchPublish(ctx context.Context, msgs []*broker.Message, _ ...broker.PublishOption) error { // TODO: this is probably inefficient, we might want to just maintain an open connection // it may be easier to add broadcast to the tunnel topicMap := make(map[string]tunnel.Session) @@ -114,7 +114,7 @@ func (t *tunBroker) BatchPublish(ctx context.Context, msgs []*broker.Message, op return nil } -func (t *tunBroker) Publish(ctx context.Context, topic string, m *broker.Message, opts ...broker.PublishOption) error { +func (t *tunBroker) Publish(ctx context.Context, topic string, m *broker.Message, _ ...broker.PublishOption) error { // TODO: this is probably inefficient, we might want to just maintain an open connection // it may be easier to add broadcast to the tunnel c, err := t.tunnel.Dial(ctx, topic, tunnel.DialMode(tunnel.Multicast)) diff --git a/profiler/noop.go b/profiler/noop.go index c9d6d6d9..fb5278d1 100644 --- a/profiler/noop.go +++ b/profiler/noop.go @@ -15,6 +15,6 @@ func (p *noopProfiler) String() string { } // NewProfiler returns new noop profiler -func NewProfiler(opts ...Option) Profiler { +func NewProfiler(_ ...Option) Profiler { return &noopProfiler{} } diff --git a/profiler/profile.go b/profiler/profile.go index f14d5fb4..a416fc8f 100644 --- a/profiler/profile.go +++ b/profiler/profile.go @@ -12,7 +12,7 @@ type Profiler interface { } // DefaultProfiler holds the default profiler -var DefaultProfiler Profiler = NewProfiler() +var DefaultProfiler = NewProfiler() // Options holds the options for profiler type Options struct { diff --git a/register/memory/memory.go b/register/memory/memory.go index 1784a53c..8a13a7fb 100644 --- a/register/memory/memory.go +++ b/register/memory/memory.go @@ -31,10 +31,10 @@ type record struct { } type memory struct { - sync.RWMutex records map[string]services watchers map[string]*watcher opts register.Options + sync.RWMutex } // services is a KV map with service name as the key and a map of records as the value @@ -100,11 +100,11 @@ func (m *memory) sendEvent(r *register.Result) { } } -func (m *memory) Connect(ctx context.Context) error { +func (m *memory) Connect(_ context.Context) error { return nil } -func (m *memory) Disconnect(ctx context.Context) error { +func (m *memory) Disconnect(_ context.Context) error { return nil } @@ -124,7 +124,7 @@ func (m *memory) Options() register.Options { return m.opts } -func (m *memory) Register(ctx context.Context, s *register.Service, opts ...register.RegisterOption) error { +func (m *memory) Register(_ context.Context, s *register.Service, opts ...register.RegisterOption) error { m.Lock() defer m.Unlock() diff --git a/register/memory/memory_test.go b/register/memory/memory_test.go index 04502460..03928dcb 100644 --- a/register/memory/memory_test.go +++ b/register/memory/memory_test.go @@ -208,9 +208,9 @@ func TestMemoryRegistryTTLConcurrent(t *testing.T) { } } - //if len(os.Getenv("IN_TRAVIS_CI")) == 0 { + // if len(os.Getenv("IN_TRAVIS_CI")) == 0 { // t.Logf("test will wait %v, then check TTL timeouts", waitTime) - //} + // } errChan := make(chan error, concurrency) syncChan := make(chan struct{}) @@ -290,8 +290,12 @@ func TestWatcher(t *testing.T) { ctx := context.TODO() m := NewRegister() - _ = m.Init() - _ = m.Connect(ctx) + if err := m.Init(); err != nil { + t.Fatal(err) + } + if err := m.Connect(ctx); err != nil { + t.Fatal(err) + } wc, err := m.Watch(ctx) if err != nil { t.Fatalf("cant watch: %v", err) diff --git a/register/register.go b/register/register.go index a5713cc4..7f101357 100644 --- a/register/register.go +++ b/register/register.go @@ -18,7 +18,7 @@ var DefaultDomain = "micro" var ( // DefaultRegister is the global default register - DefaultRegister Register = NewRegister() + DefaultRegister = NewRegister() // ErrNotFound returned when LookupService is called and no services found ErrNotFound = errors.New("service not found") // ErrWatcherStopped returned when when watcher is stopped diff --git a/resolver/noop/noop.go b/resolver/noop/noop.go index 71dfcb98..c6d94a20 100644 --- a/resolver/noop/noop.go +++ b/resolver/noop/noop.go @@ -9,6 +9,6 @@ import ( type Resolver struct{} // Resolve returns the list of nodes -func (r *Resolver) Resolve(name string) ([]*resolver.Record, error) { +func (r *Resolver) Resolve(_ string) ([]*resolver.Record, error) { return []*resolver.Record{}, nil } diff --git a/router/router.go b/router/router.go index 8575d4ce..a0f97416 100644 --- a/router/router.go +++ b/router/router.go @@ -7,7 +7,7 @@ import ( var ( // DefaultRouter is the global default router - DefaultRouter Router = NewRouter() + DefaultRouter = NewRouter() // DefaultNetwork is default micro network DefaultNetwork = "micro" // ErrRouteNotFound is returned when no route was found in the routing table diff --git a/selector/random/random.go b/selector/random/random.go index 2d739263..9941ae16 100644 --- a/selector/random/random.go +++ b/selector/random/random.go @@ -25,7 +25,7 @@ func (r *random) Select(routes []string, opts ...selector.SelectOption) (selecto }, nil } -func (r *random) Record(addr string, err error) error { +func (r *random) Record(_ string, _ error) error { return nil } diff --git a/selector/roundrobin/roundrobin.go b/selector/roundrobin/roundrobin.go index f442b5b4..c7db8811 100644 --- a/selector/roundrobin/roundrobin.go +++ b/selector/roundrobin/roundrobin.go @@ -6,14 +6,14 @@ import ( ) // NewSelector returns an initialised round robin selector -func NewSelector(opts ...selector.Option) selector.Selector { +func NewSelector(_ ...selector.Option) selector.Selector { return new(roundrobin) } type roundrobin struct{} // Select return routes based on algo -func (r *roundrobin) Select(routes []string, opts ...selector.SelectOption) (selector.Next, error) { +func (r *roundrobin) Select(routes []string, _ ...selector.SelectOption) (selector.Next, error) { if len(routes) == 0 { return nil, selector.ErrNoneAvailable } @@ -28,7 +28,7 @@ func (r *roundrobin) Select(routes []string, opts ...selector.SelectOption) (sel }, nil } -func (r *roundrobin) Record(addr string, err error) error { return nil } +func (r *roundrobin) Record(_ string, _ error) error { return nil } func (r *roundrobin) Reset() error { return nil } diff --git a/server/noop.go b/server/noop.go index 8fd15791..d742706c 100644 --- a/server/noop.go +++ b/server/noop.go @@ -775,13 +775,16 @@ func (s *subscriber) Options() SubscriberOptions { } type subscriber struct { + topic string + typ reflect.Type subscriber interface{} - topic string - endpoints []*register.Endpoint - handlers []*handler - opts SubscriberOptions - rcvr reflect.Value + + endpoints []*register.Endpoint + handlers []*handler + + rcvr reflect.Value + opts SubscriberOptions } type handler struct { diff --git a/server/noop_test.go b/server/noop_test.go index 8b44a1e0..11476501 100644 --- a/server/noop_test.go +++ b/server/noop_test.go @@ -38,7 +38,9 @@ func TestNoopSub(t *testing.T) { t.Fatal(err) } - _ = logger.DefaultLogger.Init(logger.WithLevel(logger.ErrorLevel)) + if err := logger.DefaultLogger.Init(logger.WithLevel(logger.ErrorLevel)); err != nil { + t.Fatal(err) + } s := server.NewServer( server.Broker(b), server.Codec("application/octet-stream", codec.NewCodec()), diff --git a/server/options.go b/server/options.go index 4670cf63..a45bc43d 100644 --- a/server/options.go +++ b/server/options.go @@ -24,36 +24,11 @@ type Option func(*Options) // Options server struct type Options struct { - // Context holds the external options and can be used for server shutdown - Context context.Context - // Broker holds the server broker - Broker broker.Broker - // Register holds the register - Register register.Register - // Tracer holds the tracer - Tracer tracer.Tracer - // Logger holds the logger - Logger logger.Logger - // Meter holds the meter - Meter meter.Meter - - /* - // Router for requests - Router Router - */ - - // Listener may be passed if already created - Listener net.Listener - // Wait group - Wait *msync.WaitGroup - // TLSConfig specifies tls.Config for secure serving - TLSConfig *tls.Config - // Metadata holds the server metadata - Metadata metadata.Metadata - // RegisterCheck run before register server - RegisterCheck func(context.Context) error // Codecs map to handle content-type Codecs map[string]codec.Codec + // Metadata holds the server metadata + Metadata metadata.Metadata + // ID holds the id of the server ID string // Namespace for te server @@ -66,21 +41,46 @@ type Options struct { Advertise string // Version holds the server version Version string - // RegisterAttempts holds the number of register attempts before error - RegisterAttempts int + + // Context holds the external options and can be used for server shutdown + Context context.Context + // Broker holds the server broker + Broker broker.Broker + // Register holds the register + Register register.Register + // Tracer holds the tracer + Tracer tracer.Tracer + // Logger holds the logger + Logger logger.Logger + // Meter holds the meter + Meter meter.Meter + // Listener may be passed if already created + Listener net.Listener + + // TLSConfig specifies tls.Config for secure serving + TLSConfig *tls.Config + // Wait group + Wait *msync.WaitGroup + + // RegisterCheck run before register server + RegisterCheck func(context.Context) error + + // Hooks may contains hook actions that performs before/after server handler + // or server subscriber handler + Hooks options.Hooks + // RegisterInterval holds he interval for re-register RegisterInterval time.Duration // RegisterTTL specifies TTL for register record RegisterTTL time.Duration + // GracefulTimeout timeout for graceful stop server + GracefulTimeout time.Duration // MaxConn limits number of connections MaxConn int // DeregisterAttempts holds the number of deregister attempts before error DeregisterAttempts int - // Hooks may contains hook actions that performs before/after server handler - // or server subscriber handler - Hooks options.Hooks - // GracefulTimeout timeout for graceful stop server - GracefulTimeout time.Duration + // RegisterAttempts holds the number of register attempts before error + RegisterAttempts int } // NewOptions returns new options struct with default or passed values @@ -318,14 +318,14 @@ type SubscriberOptions struct { Context context.Context // Queue holds the subscription queue Queue string + // BatchWait flag specifies max wait time for batch filling + BatchWait time.Duration + // BatchSize flag specifies max size of batch + BatchSize int // AutoAck flag for auto ack messages after processing AutoAck bool // BodyOnly flag specifies that message without headers BodyOnly bool - // BatchSize flag specifies max size of batch - BatchSize int - // BatchWait flag specifies max wait time for batch filling - BatchWait time.Duration } // NewSubscriberOptions create new SubscriberOptions diff --git a/server/server.go b/server/server.go index 8f9e1579..232ed22b 100644 --- a/server/server.go +++ b/server/server.go @@ -12,7 +12,7 @@ import ( // DefaultServer default server var ( - DefaultServer Server = NewServer() + DefaultServer = NewServer() ) var ( diff --git a/service_test.go b/service_test.go index 7a39c1b5..47df5dbe 100644 --- a/service_test.go +++ b/service_test.go @@ -121,8 +121,10 @@ func TestNewService(t *testing.T) { } tests := []struct { name string - args args + want Service + + args args }{ { name: "NewService", @@ -146,9 +148,10 @@ func Test_service_Name(t *testing.T) { opts Options } tests := []struct { - name string + name string + want string + fields fields - want string }{ { name: "Test_service_Name", @@ -245,10 +248,12 @@ func Test_service_Broker(t *testing.T) { names []string } tests := []struct { - name string + name string + + want broker.Broker + fields fields args args - want broker.Broker }{ { name: "service.Broker", @@ -301,10 +306,12 @@ func Test_service_Tracer(t *testing.T) { names []string } tests := []struct { - name string + name string + + want tracer.Tracer + fields fields args args - want tracer.Tracer }{ { name: "service.Tracer", @@ -338,10 +345,11 @@ func Test_service_Config(t *testing.T) { names []string } tests := []struct { - name string + name string + want config.Config + fields fields args args - want config.Config }{ { name: "service.Config", @@ -375,10 +383,12 @@ func Test_service_Client(t *testing.T) { names []string } tests := []struct { - name string + name string + + want client.Client + fields fields args args - want client.Client }{ { name: "service.Client", @@ -412,10 +422,12 @@ func Test_service_Server(t *testing.T) { names []string } tests := []struct { - name string + name string + + want server.Server + fields fields args args - want server.Server }{ { name: "service.Server", @@ -449,10 +461,12 @@ func Test_service_Store(t *testing.T) { names []string } tests := []struct { - name string + name string + + want store.Store + fields fields args args - want store.Store }{ { name: "service.Store", @@ -486,10 +500,12 @@ func Test_service_Register(t *testing.T) { names []string } tests := []struct { - name string + name string + + want register.Register + fields fields args args - want register.Register }{ { name: "service.Register", @@ -523,10 +539,12 @@ func Test_service_Logger(t *testing.T) { names []string } tests := []struct { - name string + name string + + want logger.Logger + fields fields args args - want logger.Logger }{ { name: "service.Logger", @@ -560,10 +578,12 @@ func Test_service_Router(t *testing.T) { names []string } tests := []struct { - name string + name string + + want router.Router + fields fields args args - want router.Router }{ { name: "service.Router", @@ -597,10 +617,12 @@ func Test_service_Meter(t *testing.T) { names []string } tests := []struct { - name string + name string + + want meter.Meter + fields fields args args - want meter.Meter }{ { name: "service.Meter", @@ -631,8 +653,8 @@ func Test_service_String(t *testing.T) { } tests := []struct { name string - fields fields want string + fields fields }{ { name: "service.String", diff --git a/store/memory/memory.go b/store/memory/memory.go index c0d5193a..c91f38d9 100644 --- a/store/memory/memory.go +++ b/store/memory/memory.go @@ -96,15 +96,15 @@ func (m *memoryStore) list(prefix string, limit, offset uint) []string { if limit != 0 || offset != 0 { sort.Slice(allKeys, func(i, j int) bool { return allKeys[i] < allKeys[j] }) sort.Slice(allKeys, func(i, j int) bool { return allKeys[i] < allKeys[j] }) - end := len(allKeys) + end := uint(len(allKeys)) if limit > 0 { - calcLimit := int(offset + limit) + calcLimit := offset + limit if calcLimit < end { end = calcLimit } } - if int(offset) >= end { + if offset >= end { return nil } return allKeys[offset:end] diff --git a/store/noop.go b/store/noop.go index 24edafdd..322e8f00 100644 --- a/store/noop.go +++ b/store/noop.go @@ -12,15 +12,18 @@ import ( var _ Store = (*noopStore)(nil) type noopStore struct { - mu sync.Mutex - watchers map[string]Watcher - funcRead FuncRead - funcWrite FuncWrite - funcExists FuncExists - funcList FuncList - funcDelete FuncDelete + watchers map[string]Watcher + + funcRead FuncRead + funcWrite FuncWrite + funcExists FuncExists + funcList FuncList + funcDelete FuncDelete + opts Options isConnected atomic.Int32 + + mu sync.Mutex } func (n *noopStore) Live() bool { @@ -35,7 +38,7 @@ func (n *noopStore) Health() bool { return true } -func NewStore(opts ...Option) *noopStore { +func NewStore(opts ...Option) Store { options := NewOptions(opts...) return &noopStore{opts: options} } @@ -94,7 +97,7 @@ func (n *noopStore) Read(ctx context.Context, key string, val interface{}, opts return n.funcRead(ctx, key, val, opts...) } -func (n *noopStore) fnRead(ctx context.Context, key string, val interface{}, opts ...ReadOption) error { +func (n *noopStore) fnRead(ctx context.Context, _ string, _ interface{}, _ ...ReadOption) error { select { case <-ctx.Done(): return ctx.Err() @@ -112,7 +115,7 @@ func (n *noopStore) Delete(ctx context.Context, key string, opts ...DeleteOption return n.funcDelete(ctx, key, opts...) } -func (n *noopStore) fnDelete(ctx context.Context, key string, opts ...DeleteOption) error { +func (n *noopStore) fnDelete(ctx context.Context, _ string, _ ...DeleteOption) error { select { case <-ctx.Done(): return ctx.Err() @@ -130,7 +133,7 @@ func (n *noopStore) Exists(ctx context.Context, key string, opts ...ExistsOption return n.funcExists(ctx, key, opts...) } -func (n *noopStore) fnExists(ctx context.Context, key string, opts ...ExistsOption) error { +func (n *noopStore) fnExists(ctx context.Context, _ string, _ ...ExistsOption) error { select { case <-ctx.Done(): return ctx.Err() @@ -148,7 +151,7 @@ func (n *noopStore) Write(ctx context.Context, key string, val interface{}, opts return n.funcWrite(ctx, key, val, opts...) } -func (n *noopStore) fnWrite(ctx context.Context, key string, val interface{}, opts ...WriteOption) error { +func (n *noopStore) fnWrite(ctx context.Context, _ string, _ interface{}, _ ...WriteOption) error { select { case <-ctx.Done(): return ctx.Err() @@ -200,13 +203,13 @@ func (n *noopStore) connect(ctx context.Context) error { } type watcher struct { + opts WatchOptions + ch chan Event exit chan bool id string - ch chan Event - opts WatchOptions } -func (m *noopStore) Watch(ctx context.Context, opts ...WatchOption) (Watcher, error) { +func (n *noopStore) Watch(_ context.Context, opts ...WatchOption) (Watcher, error) { id, err := id.New() if err != nil { return nil, err @@ -223,9 +226,9 @@ func (m *noopStore) Watch(ctx context.Context, opts ...WatchOption) (Watcher, er opts: wo, } - m.mu.Lock() - m.watchers[w.id] = w - m.mu.Unlock() + n.mu.Lock() + n.watchers[w.id] = w + n.mu.Unlock() return w, nil } diff --git a/store/options.go b/store/options.go index a4871cd1..712ec5d5 100644 --- a/store/options.go +++ b/store/options.go @@ -15,6 +15,13 @@ import ( // Options contains configuration for the Store type Options struct { + // Name specifies store name + Name string + // Namespace of the records + Namespace string + // Separator used as key parts separator + Separator string + // Meter used for metrics Meter meter.Meter // Tracer used for tracing @@ -25,22 +32,17 @@ type Options struct { Codec codec.Codec // Logger used for logging Logger logger.Logger + // TLSConfig holds tls.TLSConfig options TLSConfig *tls.Config - // Name specifies store name - Name string - // Namespace of the records - Namespace string - // Separator used as key parts separator - Separator string + // Addrs contains store address Addrs []string - // Wrappers store wrapper that called before actual functions - // Wrappers []Wrapper - // Timeout specifies timeout duration for all operations - Timeout time.Duration // Hooks can be run before/after store Read/List/Write/Exists/Delete Hooks options.Hooks + + // Timeout specifies timeout duration for all operations + Timeout time.Duration // LazyConnect creates a connection when using store LazyConnect bool } diff --git a/store/store.go b/store/store.go index d93b58d3..531a022c 100644 --- a/store/store.go +++ b/store/store.go @@ -16,7 +16,7 @@ var ( // ErrInvalidKey is returned when a key has empty or have invalid format ErrInvalidKey = errors.New("invalid key") // DefaultStore is the global default store - DefaultStore Store = NewStore() + DefaultStore = NewStore() // DefaultSeparator is the gloabal default key parts separator DefaultSeparator = "/" ) diff --git a/sync/memory.go b/sync/memory.go index 813dbd99..50e55fd6 100644 --- a/sync/memory.go +++ b/sync/memory.go @@ -6,9 +6,10 @@ import ( ) type memorySync struct { - mtx gosync.RWMutex locks map[string]*memoryLock options Options + + mtx gosync.RWMutex } type memoryLock struct { diff --git a/util/dns/cache.go b/util/dns/cache.go index 3322b698..f9b06bde 100644 --- a/util/dns/cache.go +++ b/util/dns/cache.go @@ -43,7 +43,7 @@ func NewNetDialer(parent DialFunc, opts ...Option) DialFunc { if cache.opts.MaxCacheEntries == 0 { cache.opts.MaxCacheEntries = DefaultMaxCacheEntries } - return func(ctx context.Context, network, address string) (net.Conn, error) { + return func(_ context.Context, network, address string) (net.Conn, error) { conn := &dnsConn{} conn.roundTrip = cachingRoundTrip(&cache, network, address) return conn, nil @@ -132,12 +132,12 @@ func PreferIPV6(b bool) Option { } type cache struct { - sync.RWMutex - - dial DialFunc entries map[string]cacheEntry + dial DialFunc opts Options + + sync.RWMutex } type cacheEntry struct { @@ -306,7 +306,7 @@ func getNameLen(msg string) int { for i < len(msg) { if msg[i] == 0 { // end of name - i += 1 + i++ break } if msg[i] >= 0xc0 { @@ -336,8 +336,7 @@ func cachingRoundTrip(cache *cache, network, address string) roundTripper { cache.opts.Meter.Counter(semconv.CacheRequestInflight, "type", "dns").Inc() defer cache.opts.Meter.Counter(semconv.CacheRequestInflight, "type", "dns").Dec() // check cache - if res := cache.get(req); res != "" { - cache.opts.Meter.Counter(semconv.CacheRequestTotal, "type", "dns", "method", "get", "status", "hit").Inc() + if res = cache.get(req); res != "" { return res, nil } cache.opts.Meter.Counter(semconv.CacheRequestTotal, "type", "dns", "method", "get", "status", "miss").Inc() diff --git a/util/dns/cache_test.go b/util/dns/cache_test.go index 1c939145..392f82d4 100644 --- a/util/dns/cache_test.go +++ b/util/dns/cache_test.go @@ -8,15 +8,13 @@ import ( func TestCache(t *testing.T) { net.DefaultResolver = NewNetResolver(PreferIPV4(true)) - addrs, err := net.LookupHost("unistack.org") + _, err := net.LookupHost("unistack.org") if err != nil { t.Fatal(err) } - addrs, err = net.LookupHost("unistack.org") + _, err = net.LookupHost("unistack.org") if err != nil { t.Fatal(err) } - - _ = addrs } diff --git a/util/dns/conn.go b/util/dns/conn.go index 8cbb95e7..e8b5f426 100644 --- a/util/dns/conn.go +++ b/util/dns/conn.go @@ -11,12 +11,15 @@ import ( ) type dnsConn struct { - deadline time.Time ctx context.Context cancel context.CancelFunc roundTrip roundTripper - ibuf bytes.Buffer - obuf bytes.Buffer + + deadline time.Time + + ibuf bytes.Buffer + obuf bytes.Buffer + sync.Mutex } @@ -81,7 +84,7 @@ func (c *dnsConn) SetReadDeadline(t time.Time) error { return nil } -func (c *dnsConn) SetWriteDeadline(t time.Time) error { +func (c *dnsConn) SetWriteDeadline(_ time.Time) error { // writes do not timeout return nil } @@ -159,23 +162,22 @@ func readMessage(c net.Conn) (string, error) { return "", err } return string(b[:n]), nil - } else { - var sz [2]byte - _, err := io.ReadFull(c, sz[:]) - if err != nil { - return "", err - } - - size := int64(sz[0])<<8 | int64(sz[1]) - - var str strings.Builder - _, err = io.CopyN(&str, c, size) - if err == io.EOF { - return "", io.ErrUnexpectedEOF - } - if err != nil { - return "", err - } - return str.String(), nil } + var sz [2]byte + _, err := io.ReadFull(c, sz[:]) + if err != nil { + return "", err + } + + size := int64(sz[0])<<8 | int64(sz[1]) + + var str strings.Builder + _, err = io.CopyN(&str, c, size) + if err == io.EOF { + return "", io.ErrUnexpectedEOF + } + if err != nil { + return "", err + } + return str.String(), nil } diff --git a/util/grpc/tracer.go b/util/grpc/tracer.go index f87c24db..413b4652 100644 --- a/util/grpc/tracer.go +++ b/util/grpc/tracer.go @@ -71,7 +71,7 @@ func (h *serverHandler) HandleRPC(ctx context.Context, rs stats.RPCStats) { } // TagConn can attach some information to the given context. -func (h *serverHandler) TagConn(ctx context.Context, info *stats.ConnTagInfo) context.Context { +func (h *serverHandler) TagConn(ctx context.Context, _ *stats.ConnTagInfo) context.Context { if span, ok := tracer.SpanFromContext(ctx); ok { attrs := peerAttr(peerFromCtx(ctx)) span.AddLabels(attrs...) @@ -80,7 +80,7 @@ func (h *serverHandler) TagConn(ctx context.Context, info *stats.ConnTagInfo) co } // HandleConn processes the Conn stats. -func (h *serverHandler) HandleConn(ctx context.Context, info stats.ConnStats) { +func (h *serverHandler) HandleConn(_ context.Context, _ stats.ConnStats) { } type clientHandler struct { diff --git a/util/http/trie.go b/util/http/trie.go index 864c4a44..82dcee3d 100644 --- a/util/http/trie.go +++ b/util/http/trie.go @@ -665,12 +665,12 @@ func patParamKeys(pattern string) ([]string, error) { // longestPrefix finds the length of the shared prefix // of two strings func longestPrefix(k1, k2 string) int { - max := len(k1) - if l := len(k2); l < max { - max = l + maxLen := len(k1) + if l := len(k2); l < maxLen { + maxLen = l } var i int - for i = 0; i < max; i++ { + for i = 0; i < maxLen; i++ { if k1[i] != k2[i] { break } diff --git a/util/jitter/random.go b/util/jitter/random.go index 8e1cae69..83ef5315 100644 --- a/util/jitter/random.go +++ b/util/jitter/random.go @@ -14,7 +14,7 @@ func Random(d time.Duration) time.Duration { return time.Duration(v) } -func RandomInterval(min, max time.Duration) time.Duration { +func RandomInterval(minTime, maxTime time.Duration) time.Duration { var rng rand.Rand - return time.Duration(rng.Int63n(max.Nanoseconds()-min.Nanoseconds())+min.Nanoseconds()) * time.Nanosecond + return time.Duration(rng.Int63n(maxTime.Nanoseconds()-minTime.Nanoseconds())+minTime.Nanoseconds()) * time.Nanosecond } diff --git a/util/jitter/ticker.go b/util/jitter/ticker.go index 34e9d65f..b5b86f70 100644 --- a/util/jitter/ticker.go +++ b/util/jitter/ticker.go @@ -23,12 +23,12 @@ type Ticker struct { // NewTickerContext returns a pointer to an initialized instance of the Ticker. // It works like NewTicker except that it has ability to close via context. // Also it works fine with context.WithTimeout to handle max time to run ticker. -func NewTickerContext(ctx context.Context, min, max time.Duration) *Ticker { +func NewTickerContext(ctx context.Context, minTime, maxTime time.Duration) *Ticker { ticker := &Ticker{ C: make(chan time.Time), done: make(chan chan struct{}), - min: min.Nanoseconds(), - max: max.Nanoseconds(), + min: minTime.Nanoseconds(), + max: maxTime.Nanoseconds(), ctx: ctx, } go ticker.run() @@ -38,12 +38,12 @@ func NewTickerContext(ctx context.Context, min, max time.Duration) *Ticker { // NewTicker returns a pointer to an initialized instance of the Ticker. // Min and max are durations of the shortest and longest allowed // ticks. Ticker will run in a goroutine until explicitly stopped. -func NewTicker(min, max time.Duration) *Ticker { +func NewTicker(minTime, maxTime time.Duration) *Ticker { ticker := &Ticker{ C: make(chan time.Time), done: make(chan chan struct{}), - min: min.Nanoseconds(), - max: max.Nanoseconds(), + min: minTime.Nanoseconds(), + max: maxTime.Nanoseconds(), ctx: context.Background(), } go ticker.run() diff --git a/util/jitter/ticker_test.go b/util/jitter/ticker_test.go index a271dac0..f28d3d5b 100644 --- a/util/jitter/ticker_test.go +++ b/util/jitter/ticker_test.go @@ -31,26 +31,26 @@ loop: func TestTicker(t *testing.T) { t.Parallel() - min := time.Duration(10) - max := time.Duration(20) + minTime := time.Duration(10) + maxTime := time.Duration(20) // tick can take a little longer since we're not adjusting it to account for // processing. precision := time.Duration(4) - rt := NewTicker(min*time.Millisecond, max*time.Millisecond) + rt := NewTicker(minTime*time.Millisecond, maxTime*time.Millisecond) for i := 0; i < 5; i++ { t0 := time.Now() t1 := <-rt.C td := t1.Sub(t0) - if td < min*time.Millisecond { + if td < minTime*time.Millisecond { t.Fatalf("tick was shorter than expected: %s", td) - } else if td > (max+precision)*time.Millisecond { + } else if td > (maxTime+precision)*time.Millisecond { t.Fatalf("tick was longer than expected: %s", td) } } rt.Stop() - time.Sleep((max + precision) * time.Millisecond) + time.Sleep((maxTime + precision) * time.Millisecond) select { case v, ok := <-rt.C: if ok || !v.IsZero() { diff --git a/util/net/net.go b/util/net/net.go index 96a4f1e7..7631a9d5 100644 --- a/util/net/net.go +++ b/util/net/net.go @@ -48,19 +48,19 @@ func Listen(addr string, fn func(string) (net.Listener, error)) (net.Listener, e // we have a port range // extract min port - min, err := strconv.Atoi(prange[0]) + minPort, err := strconv.Atoi(prange[0]) if err != nil { return nil, errors.New("unable to extract port range") } // extract max port - max, err := strconv.Atoi(prange[1]) + maxPort, err := strconv.Atoi(prange[1]) if err != nil { return nil, errors.New("unable to extract port range") } // range the ports - for port := min; port <= max; port++ { + for port := minPort; port <= maxPort; port++ { // try bind to host:port ln, err := fn(HostPort(host, port)) if err == nil { @@ -68,7 +68,7 @@ func Listen(addr string, fn func(string) (net.Listener, error)) (net.Listener, e } // hit max port - if port == max { + if port == maxPort { return nil, err } } diff --git a/util/reflect/path.go b/util/reflect/path.go index df156e4a..9362be5d 100644 --- a/util/reflect/path.go +++ b/util/reflect/path.go @@ -155,7 +155,7 @@ func indexFunction(v reflect.Value) func(i int) reflect.Value { return v.MapIndex(keys[i]) } } - return func(i int) reflect.Value { return reflect.Value{} } + return func(_ int) reflect.Value { return reflect.Value{} } } func mergeValue(values []reflect.Value) reflect.Value { diff --git a/util/reflect/reflect_test.go b/util/reflect/reflect_test.go index 2b2a10b0..cbfc13fc 100644 --- a/util/reflect/reflect_test.go +++ b/util/reflect/reflect_test.go @@ -130,16 +130,16 @@ func TestMergeString(t *testing.T) { func TestMergeNested(t *testing.T) { type CallReqNested struct { + Nested *CallReqNested `json:"nested2"` StringArgs []string `json:"string_args"` Uint64Args []uint64 `json:"uint64_args"` - Nested *CallReqNested `json:"nested2"` } type CallReq struct { + Nested *CallReqNested `json:"nested"` Name string `json:"name"` Req string `json:"req"` Arg2 int `json:"arg2"` - Nested *CallReqNested `json:"nested"` } dst := &CallReq{ diff --git a/util/register/util.go b/util/register/util.go index 9bb8b48a..f047b989 100644 --- a/util/register/util.go +++ b/util/register/util.go @@ -109,12 +109,11 @@ func Merge(olist []*register.Service, nlist []*register.Service) []*register.Ser seen = true srv = append(srv, sp) break - } else { - sp := ®ister.Service{} - // make copy - *sp = *o - srv = append(srv, sp) } + sp := ®ister.Service{} + // make copy + *sp = *o + srv = append(srv, sp) } if !seen { srv = append(srv, Copy([]*register.Service{n})...) @@ -153,14 +152,14 @@ func Remove(old, del []*register.Service) []*register.Service { // WaitService using register wait for service to appear with min/max interval for check and optional timeout. // Timeout can be 0 to wait infinitive. -func WaitService(ctx context.Context, reg register.Register, name string, min time.Duration, max time.Duration, timeout time.Duration, opts ...register.LookupOption) error { +func WaitService(ctx context.Context, reg register.Register, name string, minTime time.Duration, maxTime time.Duration, timeout time.Duration, opts ...register.LookupOption) error { if timeout > 0 { var cancel context.CancelFunc ctx, cancel = context.WithTimeout(ctx, timeout) defer cancel() } - ticker := jitter.NewTickerContext(ctx, min, max) + ticker := jitter.NewTickerContext(ctx, minTime, maxTime) defer ticker.Stop() for { diff --git a/util/ring/buffer.go b/util/ring/buffer.go index 9cc4b891..680c31dc 100644 --- a/util/ring/buffer.go +++ b/util/ring/buffer.go @@ -10,10 +10,11 @@ import ( // Buffer is ring buffer type Buffer struct { - sync.RWMutex streams map[string]*Stream vals []*Entry size int + + sync.RWMutex } // Entry is ring buffer data entry diff --git a/util/socket/pool.go b/util/socket/pool.go index 470fa3c3..462ce883 100644 --- a/util/socket/pool.go +++ b/util/socket/pool.go @@ -6,8 +6,8 @@ import ( // Pool holds the socket pool type Pool struct { - sync.RWMutex pool map[string]*Socket + sync.RWMutex } // Get socket from pool diff --git a/util/stream/stream.go b/util/stream/stream.go index 36bf06b1..04b2d274 100644 --- a/util/stream/stream.go +++ b/util/stream/stream.go @@ -20,10 +20,11 @@ type Stream interface { } type stream struct { - sync.RWMutex Stream err error request *request + + sync.RWMutex } type request struct { diff --git a/util/structfs/metadata_digitalocean.go b/util/structfs/metadata_digitalocean.go index 5effe043..7042846a 100644 --- a/util/structfs/metadata_digitalocean.go +++ b/util/structfs/metadata_digitalocean.go @@ -10,11 +10,18 @@ import ( type DigitalOceanMetadata struct { Metadata struct { V1 struct { - DropletID int64 `json:"droplet_id"` - Hostname string `json:"hostname"` - VendorData string `json:"vendor_data"` + Features map[string]interface{} `json:"features"` + + Hostname string `json:"hostname"` + VendorData string `json:"vendor_data"` + Region string `json:"region"` + PublicKeys []string `json:"public_keys"` - Region string `json:"region"` + + DNS struct { + Nameservers []string `json:"nameservers"` + } `json:"dns"` + Interfaces struct { Private []struct { IPv4 struct { @@ -31,24 +38,23 @@ type DigitalOceanMetadata struct { Netmask string `json:"netmask"` Gateway string `json:"gateway"` } `json:"ipv4"` - IPv6 struct { - Address string `json:"ip_address"` - CIDR int `json:"cidr"` - Gateway string `json:"gateway"` - } `json:"ipv6"` Mac string `json:"mac"` Type string `json:"type"` + IPv6 struct { + Address string `json:"ip_address"` + Gateway string `json:"gateway"` + CIDR int `json:"cidr"` + } `json:"ipv6"` } `json:"public"` } `json:"interfaces"` + + DropletID int64 `json:"droplet_id"` + FloatingIP struct { IPv4 struct { Active bool `json:"active"` } `json:"ipv4"` } `json:"floating_ip"` - DNS struct { - Nameservers []string `json:"nameservers"` - } `json:"dns"` - Features map[string]interface{} `json:"features"` } `json:"v1"` } `json:"metadata"` } diff --git a/util/structfs/metadata_ec2.go b/util/structfs/metadata_ec2.go index 07be6e42..5bf9605e 100644 --- a/util/structfs/metadata_ec2.go +++ b/util/structfs/metadata_ec2.go @@ -2,29 +2,29 @@ package structfs type EC2Metadata struct { Latest struct { + Userdata string `json:"user-data"` Metadata struct { - AMIID int `json:"ami-id"` - AMILaunchIndex int `json:"ami-launch-index"` - AMIManifestPath string `json:"ami-manifest-path"` - AncestorAMIIDs []int `json:"ancestor-ami-ids"` - BlockDeviceMapping []string `json:"block-device-mapping"` - InstanceID int `json:"instance-id"` - InstanceType string `json:"instance-type"` - LocalHostname string `json:"local-hostname"` - LocalIPv4 string `json:"local-ipv4"` - KernelID int `json:"kernel-id"` - Placement string `json:"placement"` - AvailabilityZone string `json:"availability-zone"` - ProductCodes string `json:"product-codes"` - PublicHostname string `json:"public-hostname"` - PublicIPv4 string `json:"public-ipv4"` - PublicKeys []struct { + AMIManifestPath string `json:"ami-manifest-path"` + InstanceType string `json:"instance-type"` + LocalHostname string `json:"local-hostname"` + LocalIPv4 string `json:"local-ipv4"` + Placement string `json:"placement"` + AvailabilityZone string `json:"availability-zone"` + ProductCodes string `json:"product-codes"` + PublicHostname string `json:"public-hostname"` + PublicIPv4 string `json:"public-ipv4"` + PublicKeys []struct { Key []string `json:"-"` } `json:"public-keys"` - RamdiskID int `json:"ramdisk-id"` - ReservationID int `json:"reservation-id"` - SecurityGroups []string `json:"security-groups"` + AncestorAMIIDs []int `json:"ancestor-ami-ids"` + BlockDeviceMapping []string `json:"block-device-mapping"` + SecurityGroups []string `json:"security-groups"` + RamdiskID int `json:"ramdisk-id"` + ReservationID int `json:"reservation-id"` + AMIID int `json:"ami-id"` + AMILaunchIndex int `json:"ami-launch-index"` + KernelID int `json:"kernel-id"` + InstanceID int `json:"instance-id"` } `json:"meta-data"` - Userdata string `json:"user-data"` } `json:"latest"` } diff --git a/util/structfs/structfs.go b/util/structfs/structfs.go index a26a6bdf..3cffc750 100644 --- a/util/structfs/structfs.go +++ b/util/structfs/structfs.go @@ -35,22 +35,22 @@ func (fs *fs) ServeHTTP(w http.ResponseWriter, r *http.Request) { } type fs struct { + modtime time.Time iface interface{} tag string - modtime time.Time } type file struct { - name string - offset int64 - data []byte modtime time.Time + name string + data []byte + offset int64 } type fileInfo struct { + modtime time.Time name string size int64 - modtime time.Time } func (fi *fileInfo) Sys() interface{} { @@ -105,7 +105,7 @@ func (f *file) Read(b []byte) (int, error) { return n, err } -func (f *file) Readdir(count int) ([]os.FileInfo, error) { +func (f *file) Readdir(_ int) ([]os.FileInfo, error) { return nil, nil } diff --git a/util/structfs/structfs_test.go b/util/structfs/structfs_test.go index 8f84dd9d..ccf18bad 100644 --- a/util/structfs/structfs_test.go +++ b/util/structfs/structfs_test.go @@ -93,7 +93,7 @@ func TestAll(t *testing.T) { in string out string }{ - {"http://127.0.0.1:8080/metadata/v1/", "droplet_id\nhostname\nvendor_data\npublic_keys\nregion\ninterfaces\nfloating_ip\ndns\nfeatures"}, + {"http://127.0.0.1:8080/metadata/v1/", "features\nhostname\nvendor_data\nregion\npublic_keys\ndns\ninterfaces\ndroplet_id\nfloating_ip"}, {"http://127.0.0.1:8080/metadata/v1/droplet_id", "2756294"}, {"http://127.0.0.1:8080/metadata/v1/dns/", "nameservers"}, {"http://127.0.0.1:8080/metadata/v1/dns/nameservers", "2001:4860:4860::8844\n2001:4860:4860::8888\n8.8.8.8"}, diff --git a/util/test/test.go b/util/test/test.go index eedc4e77..5a328b53 100644 --- a/util/test/test.go +++ b/util/test/test.go @@ -78,8 +78,8 @@ var ( for _, se := range st.Details() { switch ne := se.(type) { case proto.Message: - buf, err := testCodec.Marshal(ne) - if err != nil { + var buf []byte + if buf, err = testCodec.Marshal(ne); err != nil { return fmt.Errorf("failed to marshal err: %w", err) } if err = testCodec.Unmarshal(buf, &testMap); err != nil { @@ -438,10 +438,10 @@ func Run(ctx context.Context, c client.Client, m sqlmock.Sqlmock, dir string, ex } type Case struct { - dbfiles []string reqfile string rspfile string errfile string + dbfiles []string } func GetCases(dir string, exts []string) ([]Case, error) { diff --git a/util/text/text.go b/util/text/text.go index f59485d0..52c1f815 100644 --- a/util/text/text.go +++ b/util/text/text.go @@ -1,6 +1,5 @@ package text - func DetectEncoding(text string) map[string]int { charsets := map[string]int{ "UTF-8": 0, @@ -19,7 +18,7 @@ func DetectEncoding(text string) map[string]int { utfupper := 5 lowercase := 3 uppercase := 1 - last_simb := 0 + lastSimb := 0 for a := 0; a < len(text); a++ { char := int(text[a]) @@ -30,10 +29,10 @@ func DetectEncoding(text string) map[string]int { } // UTF-8 - if (last_simb == 208) && ((char > 143 && char < 176) || char == 129) { + if (lastSimb == 208) && ((char > 143 && char < 176) || char == 129) { charsets["UTF-8"] += (utfupper * 2) } - if ((last_simb == 208) && ((char > 175 && char < 192) || char == 145)) || (last_simb == 209 && char > 127 && char < 144) { + if ((lastSimb == 208) && ((char > 175 && char < 192) || char == 145)) || (lastSimb == 209 && char > 127 && char < 144) { charsets["UTF-8"] += (utflower * 2) } @@ -77,7 +76,7 @@ func DetectEncoding(text string) map[string]int { charsets["MAC"] += uppercase } - last_simb = char + lastSimb = char } return charsets diff --git a/util/time/duration.go b/util/time/duration.go index 33acb1a9..0f679c82 100644 --- a/util/time/duration.go +++ b/util/time/duration.go @@ -2,7 +2,6 @@ package time import ( "encoding/json" - "errors" "fmt" "strconv" "time" @@ -14,7 +13,7 @@ type Duration int64 func ParseDuration(s string) (time.Duration, error) { if s == "" { - return 0, errors.New(`time: invalid duration "` + s + `"`) + return 0, fmt.Errorf(`time: invalid duration "%s"`, s) } var p int @@ -27,21 +26,21 @@ loop: case 'h': d, err := strconv.Atoi(s[p:i]) if err != nil { - return 0, errors.New("time: invalid duration " + s) + return 0, fmt.Errorf(`time: invalid duration "%s"`, s) } hours += d p = i + 1 case 'd': d, err := strconv.Atoi(s[p:i]) if err != nil { - return 0, errors.New("time: invalid duration " + s) + return 0, fmt.Errorf(`time: invalid duration "%s"`, s) } hours += d * 24 p = i + 1 case 'y': n, err := strconv.Atoi(s[p:i]) if err != nil { - return 0, errors.New("time: invalid duration " + s) + return 0, fmt.Errorf(`time: invalid duration "%s"`, s) } var d int for j := n - 1; j >= 0; j-- { From 2b62ad04f29d8a041dc8133bdcc4a374ff53d0f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B0=D1=81=D0=B8=D0=BB=D0=B8=D0=B9=20=D0=A2=D0=BE?= =?UTF-8?q?=D0=BB=D1=81=D1=82=D0=BE=D0=B2?= Date: Mon, 9 Dec 2024 19:06:49 +0300 Subject: [PATCH 2/2] metadata: fix for grpc case (#370) Signed-off-by: Vasiliy Tolstov Reviewed-on: https://git.unistack.org/unistack-org/micro/pulls/370 --- metadata/metadata.go | 6 ++++++ metadata/metadata_test.go | 9 +++++++++ 2 files changed, 15 insertions(+) diff --git a/metadata/metadata.go b/metadata/metadata.go index 7fd26e8a..46744b9a 100644 --- a/metadata/metadata.go +++ b/metadata/metadata.go @@ -4,6 +4,7 @@ package metadata import ( "net/textproto" "sort" + "strings" ) var ( @@ -73,6 +74,9 @@ func (md Metadata) Get(key string) (string, bool) { if !ok { // slow path val, ok = md[textproto.CanonicalMIMEHeaderKey(key)] + if !ok { + val, ok = md[strings.ToLower(key)] + } } return val, ok } @@ -94,6 +98,8 @@ func (md Metadata) Del(keys ...string) { delete(md, key) // slow path delete(md, textproto.CanonicalMIMEHeaderKey(key)) + // very slow path + delete(md, strings.ToLower(key)) } } diff --git a/metadata/metadata_test.go b/metadata/metadata_test.go index 84738f81..5c45a133 100644 --- a/metadata/metadata_test.go +++ b/metadata/metadata_test.go @@ -5,6 +5,15 @@ import ( "testing" ) +func TestLowercase(t *testing.T) { + md := New(1) + md["x-request-id"] = "12345" + v, ok := md.Get("X-Request-Id") + if !ok || v == "" { + t.Fatalf("metadata invalid %#+v", md) + } +} + func TestMultipleUsage(t *testing.T) { ctx := context.TODO() md := New(0)