Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

metrics/generic: fix uint64 alignment #1007

Merged
merged 2 commits into from Sep 15, 2020

Conversation

ldez
Copy link
Contributor

@ldez ldez commented Aug 24, 2020

Fixes uint64 alignment on 32-bit arch.

panic on Counter
Stack: goroutine 59 [running]: 
runtime/debug.Stack(0x4d20140, 0x2662937, 0x17)
        /usr/local/go/src/runtime/debug/stack.go:24 +0x78
github.com/containous/traefik/v2/pkg/safe.defaultRecoverGoroutine(0x2232840, 0x41a7570)
        /go/src/github.com/containous/traefik/pkg/safe/routine.go:66 +0x90
github.com/containous/traefik/v2/pkg/safe.GoWithRecover.func1.1(0x276cc34)
        /go/src/github.com/containous/traefik/pkg/safe/routine.go:56 +0x44
panic(0x2232840, 0x41a7570)
        /usr/local/go/src/runtime/panic.go:969 +0x118
runtime/internal/atomic.goLoad64(0x4fbab54, 0x51b6920, 0x2350f01)
        /usr/local/go/src/runtime/internal/atomic/atomic_arm.go:131 +0x1c
github.com/go-kit/kit/metrics/generic.(*Counter).Add(0x4fbab40, 0x0, 0x3ff00000)
        /go/pkg/mod/github.com/go-kit/kit@v0.9.0/metrics/generic/generic.go:46 +0x28
github.com/containous/traefik/v2/pkg/metrics.(*pilotCounter).Add(0x4c0ea70, 0x0, 0x3ff00000)
        /go/src/github.com/containous/traefik/pkg/metrics/pilot.go:229 +0xa4
github.com/go-kit/kit/metrics/multi.Counter.Add(0x4d11940, 0x2, 0x2, 0x0, 0x3ff00000)
        /go/pkg/mod/github.com/go-kit/kit@v0.9.0/metrics/multi/multi.go:20 +0x40
main.setupServer.func3(0x4fcd810, 0x51b68f8, 0x51b6900, 0x51a1f00)
        /go/src/github.com/containous/traefik/cmd/traefik/traefik.go:258 +0x4c
github.com/containous/traefik/v2/pkg/server.(*ConfigurationWatcher).loadMessage(0x51265a0, 0x2626245, 0x4, 0x4fcd710)
        /go/src/github.com/containous/traefik/pkg/server/configurationwatcher.go:150 +0x14c
github.com/containous/traefik/v2/pkg/server.(*ConfigurationWatcher).listenConfigurations(0x51265a0, 0x2ae2d18, 0x4fba0c0)
        /go/src/github.com/containous/traefik/pkg/server/configurationwatcher.go:132 +0x2c
github.com/containous/traefik/v2/pkg/safe.(*Pool).GoCtx.func1()
        /go/src/github.com/containous/traefik/pkg/safe/routine.go:36 +0x5c
github.com/containous/traefik/v2/pkg/safe.GoWithRecover.func1(0x276cc34, 0x51c8010)
        /go/src/github.com/containous/traefik/pkg/safe/routine.go:59 +0x48
created by github.com/containous/traefik/v2/pkg/safe.GoWithRecover
        /go/src/github.com/containous/traefik/pkg/safe/routine.go:53 +0x34
panic on Gauge
runtime/debug.Stack(0x44ae140, 0x2653087, 0x17)
	/usr/local/go/src/runtime/debug/stack.go:24 +0x78
github.com/containous/traefik/v2/pkg/safe.defaultRecoverGoroutine(0x2222e48, 0x3e24e78)
	/go/src/github.com/containous/traefik/pkg/safe/routine.go:66 +0x90
github.com/containous/traefik/v2/pkg/safe.GoWithRecover.func1.1(0x275c22c)
	/go/src/github.com/containous/traefik/pkg/safe/routine.go:56 +0x44
panic(0x2222e48, 0x3e24e78)
	/usr/local/go/src/runtime/panic.go:969 +0x118
github.com/go-kit/kit/metrics/generic.(*Gauge).Set(...)
	/go/src/github.com/go-kit/kit/metrics/generic/generic.go:107
github.com/containous/traefik/v2/pkg/metrics.(*pilotGauge).Set(0x440e680, 0x79400000, 0x41d7d0ed)
	/go/src/github.com/containous/traefik/pkg/metrics/pilot.go:261 +0xbc
github.com/go-kit/kit/metrics/multi.Gauge.Set(0x440e780, 0x1, 0x1, 0x79400000, 0x41d7d0ed)
	/go/src/github.com/go-kit/kit/metrics/multi/multi.go:44 +0x40
main.setupServer.func3(0x47de1f0, 0x4713bb8, 0x4713bc0, 0x47dc7a0)
	/go/src/github.com/containous/traefik/cmd/traefik/traefik.go:259 +0xf0
github.com/containous/traefik/v2/pkg/server.(*ConfigurationWatcher).loadMessage(0x488a360, 0x2620f52, 0x8, 0x47de1a0)
	/go/src/github.com/containous/traefik/pkg/server/configurationwatcher.go:150 +0x14c
github.com/containous/traefik/v2/pkg/server.(*ConfigurationWatcher).listenConfigurations(0x488a360, 0x2ad1dc0, 0x46f28a0)
	/go/src/github.com/containous/traefik/pkg/server/configurationwatcher.go:132 +0x2c
github.com/containous/traefik/v2/pkg/safe.(*Pool).GoCtx.func1()
	/go/src/github.com/containous/traefik/pkg/safe/routine.go:36 +0x5c
github.com/containous/traefik/v2/pkg/safe.GoWithRecover.func1(0x275c22c, 0x4605ae0)
	/go/src/github.com/containous/traefik/pkg/safe/routine.go:59 +0x48
created by github.com/containous/traefik/v2/pkg/safe.GoWithRecover
	/go/src/github.com/containous/traefik/pkg/safe/routine.go:53 +0x34 

Related to traefik/traefik#7207

@ldez ldez changed the title metrics/generic: fix unit64 alignment metrics/generic: fix uint64 alignment Aug 24, 2020
@ldez ldez force-pushed the fix/unit64aligment branch 2 times, most recently from 74f16a5 to b138422 Compare August 24, 2020 13:33
@peterbourgon
Copy link
Member

Sure! Please add a test :)

@ldez
Copy link
Contributor Author

ldez commented Aug 25, 2020

🤔 sure but could you help me?

  • how to add a test to check the alignment without unsafe?
  • how to add a test to check the alignment in a 32-bit arch from a 64-bit arch?

I don't write this kind of test every day so any help would be welcome.

@ldez
Copy link
Contributor Author

ldez commented Sep 4, 2020

@peterbourgon friendly ping 😉

@peterbourgon
Copy link
Member

peterbourgon commented Sep 7, 2020 via email

@ldez
Copy link
Contributor Author

ldez commented Sep 7, 2020

Without a 32bit arch it's not possible to create a simple test about alignment problem on a 32bits arch.
The problem of alignment appears at runtime, not at the compile time.

I see only one solution: be able to run the tests of the project on a CI that use a 32bit arch.
The GitHub Action only provide 64bit arch.

In all cases, this kind of change of the CI seems out of the scope of my PR.


As a kind of prof, I will give you some dumps.

On a 32bit arch

Created from an old PI2-B (arm)

Previous version:

generic.Counter:
 Name at offset 0, size=8, align=4
 lvs at offset 8, size=12, align=4
 bits at offset 20, size=8, align=4

the bits offset is 20, but 20 is not a multiple of 8.

My version:

generic.Counter:
 bits at offset 0, size=8, align=4
 Name at offset 8, size=8, align=4
 lvs at offset 16, size=12, align=4

On a 64bit arch

Previous version:

generic.Counter:
 Name at offset 0, size=16, align=8
 lvs at offset 16, size=24, align=8
 bits at offset 40, size=8, align=8

My version:

generic.Counter:
 bits at offset 0, size=8, align=8
 Name at offset 8, size=16, align=8
 lvs at offset 24, size=24, align=8

@peterbourgon
Copy link
Member

In all cases, this kind of change of the CI seems out of the scope of my PR.

Well, it's important to the long-term maintainability of the project that changes come with regression tests, so I don't accidentally undo your work in a future refactor. Can you think of any other way to accomplish that?

@ldez
Copy link
Contributor Author

ldez commented Sep 7, 2020

I put a comment on the structure to explain why the field should be placed at the top of the structure.
It's a complex problem without simple solution, except if you are able to use the 32bit arch to run the tests.

@ldez
Copy link
Contributor Author

ldez commented Sep 8, 2020

I added a test, but it's a weak and complex test, the maintainability is low, because the real solution is to run the tests on a 32-bit arch.

FYI even staticcheck is not able to catch this misalignment properly without a 32-bit arch. Currently, I don't know any linter that can properly check this without a 32-bit arch.

@ldez
Copy link
Contributor Author

ldez commented Sep 14, 2020

@peterbourgon friendly ping 😉

@peterbourgon
Copy link
Member

Wow that is an... astonishing test ;)

OK, I'm happy with this. Final question, though — is there a command I could run on the relevant architectures that would return one result if the alignment is "good" and a different result if the alignment was "bad"?

@ldez
Copy link
Contributor Author

ldez commented Sep 14, 2020

As I explained in the code comment and in my previous message, you just have to run the existing tests or :

package main

import (
	"fmt"

	"github.com/go-kit/kit/metrics/generic"
)

func main() {
	counter := generic.Counter{}
	counter.Add(6)
	fmt.Println(counter)
}
go test ./... (on ARM)
ok  	github.com/go-kit/kit/auth/basic	0.069s
ok  	github.com/go-kit/kit/auth/casbin	0.644s
ok  	github.com/go-kit/kit/auth/jwt	0.213s
ok  	github.com/go-kit/kit/circuitbreaker	0.392s
ok  	github.com/go-kit/kit/cmd/kitgen	73.047s
?   	github.com/go-kit/kit/cmd/kitgen/templates	[no test files]
ok  	github.com/go-kit/kit/endpoint	0.032s
?   	github.com/go-kit/kit/examples/addsvc/cmd/addcli	[no test files]
ok  	github.com/go-kit/kit/examples/addsvc/cmd/addsvc	0.106s
?   	github.com/go-kit/kit/examples/addsvc/pb	[no test files]
?   	github.com/go-kit/kit/examples/addsvc/pkg/addendpoint	[no test files]
?   	github.com/go-kit/kit/examples/addsvc/pkg/addservice	[no test files]
?   	github.com/go-kit/kit/examples/addsvc/pkg/addtransport	[no test files]
?   	github.com/go-kit/kit/examples/addsvc/thrift/gen-go/addsvc	[no test files]
?   	github.com/go-kit/kit/examples/addsvc/thrift/gen-go/addsvc/add_service-remote	[no test files]
?   	github.com/go-kit/kit/examples/apigateway	[no test files]
?   	github.com/go-kit/kit/examples/profilesvc	[no test files]
?   	github.com/go-kit/kit/examples/profilesvc/client	[no test files]
?   	github.com/go-kit/kit/examples/profilesvc/cmd/profilesvc	[no test files]
?   	github.com/go-kit/kit/examples/shipping	[no test files]
?   	github.com/go-kit/kit/examples/shipping/booking	[no test files]
?   	github.com/go-kit/kit/examples/shipping/cargo	[no test files]
?   	github.com/go-kit/kit/examples/shipping/handling	[no test files]
?   	github.com/go-kit/kit/examples/shipping/inmem	[no test files]
?   	github.com/go-kit/kit/examples/shipping/inspection	[no test files]
?   	github.com/go-kit/kit/examples/shipping/location	[no test files]
?   	github.com/go-kit/kit/examples/shipping/routing	[no test files]
?   	github.com/go-kit/kit/examples/shipping/tracking	[no test files]
?   	github.com/go-kit/kit/examples/shipping/voyage	[no test files]
?   	github.com/go-kit/kit/examples/stringsvc1	[no test files]
?   	github.com/go-kit/kit/examples/stringsvc2	[no test files]
?   	github.com/go-kit/kit/examples/stringsvc3	[no test files]
?   	github.com/go-kit/kit/examples/stringsvc4	[no test files]
ok  	github.com/go-kit/kit/log	0.686s
ok  	github.com/go-kit/kit/log/deprecated_levels	0.094s
ok  	github.com/go-kit/kit/log/level	0.070s
ok  	github.com/go-kit/kit/log/logrus	0.066s
ok  	github.com/go-kit/kit/log/syslog	0.404s
ok  	github.com/go-kit/kit/log/term	0.281s
ok  	github.com/go-kit/kit/log/zap	0.064s
ok  	github.com/go-kit/kit/metrics	0.583s
ok  	github.com/go-kit/kit/metrics/cloudwatch	1.651s
ok  	github.com/go-kit/kit/metrics/cloudwatch2	0.065s
?   	github.com/go-kit/kit/metrics/discard	[no test files]
--- FAIL: TestGauge (0.00s)
panic: runtime error: invalid memory address or nil pointer dereference [recovered]
	panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x12180]

goroutine 8 [running]:
testing.tRunner.func1.1(0x1356d8, 0x221f50)
	/usr/local/go/src/testing/testing.go:1076 +0x264
testing.tRunner.func1(0x401880)
	/usr/local/go/src/testing/testing.go:1079 +0x364
panic(0x1356d8, 0x221f50)
	/usr/local/go/src/runtime/panic.go:969 +0x118
runtime/internal/atomic.goLoad64(0x40cc54, 0x0, 0x11e84)
	/usr/local/go/src/runtime/internal/atomic/atomic_arm.go:131 +0x1c
github.com/go-kit/kit/metrics/generic.(*Gauge).With(0x40cc40, 0x43df50, 0x2, 0x2, 0x46e908, 0x46e908)
	/home/pi/go/src/github.com/go-kit/kit/metrics/generic/generic.go:100 +0x24
github.com/go-kit/kit/metrics/dogstatsd.(*Gauge).With(0x40e1b0, 0x42a750, 0x2, 0x2, 0x4184c0, 0x32)
	/home/pi/go/src/github.com/go-kit/kit/metrics/dogstatsd/dogstatsd.go:292 +0x9c
github.com/go-kit/kit/metrics/dogstatsd.TestGauge(0x401880)
	/home/pi/go/src/github.com/go-kit/kit/metrics/dogstatsd/dogstatsd_test.go:34 +0x280
testing.tRunner(0x401880, 0x1581bc)
	/usr/local/go/src/testing/testing.go:1127 +0xbc
created by testing.(*T).Run
	/usr/local/go/src/testing/testing.go:1178 +0x2d4
FAIL	github.com/go-kit/kit/metrics/dogstatsd	0.051s
ok  	github.com/go-kit/kit/metrics/expvar	0.792s
--- FAIL: TestCounter (0.00s)
panic: runtime error: invalid memory address or nil pointer dereference [recovered]
	panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x11ce8]

goroutine 18 [running]:
testing.tRunner.func1.1(0x123908, 0x201c40)
	/usr/local/go/src/testing/testing.go:1076 +0x264
testing.tRunner.func1(0x882700)
	/usr/local/go/src/testing/testing.go:1079 +0x364
panic(0x123908, 0x201c40)
	/usr/local/go/src/runtime/panic.go:969 +0x118
runtime/internal/atomic.goLoad64(0x89a534, 0x1c, 0x89a520)
	/usr/local/go/src/runtime/internal/atomic/atomic_arm.go:131 +0x1c
github.com/go-kit/kit/metrics/generic.(*Counter).With(0x89a520, 0x8d4f80, 0x2, 0x2, 0x0, 0xcfef4)
	/home/pi/go/src/github.com/go-kit/kit/metrics/generic/generic.go:37 +0x24
github.com/go-kit/kit/metrics/generic_test.TestCounter(0x882700)
	/home/pi/go/src/github.com/go-kit/kit/metrics/generic/generic_test.go:19 +0x7c
testing.tRunner(0x882700, 0x1434b4)
	/usr/local/go/src/testing/testing.go:1127 +0xbc
created by testing.(*T).Run
	/usr/local/go/src/testing/testing.go:1178 +0x2d4
FAIL	github.com/go-kit/kit/metrics/generic	0.055s
--- FAIL: TestCounter (0.00s)
panic: runtime error: invalid memory address or nil pointer dereference [recovered]
	panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x12180]

goroutine 6 [running]:
testing.tRunner.func1.1(0x135448, 0x221f40)
	/usr/local/go/src/testing/testing.go:1076 +0x264
testing.tRunner.func1(0x14015e0)
	/usr/local/go/src/testing/testing.go:1079 +0x364
panic(0x135448, 0x221f40)
	/usr/local/go/src/runtime/panic.go:969 +0x118
runtime/internal/atomic.goLoad64(0x140c974, 0x10f56c, 0x140e0f0)
	/usr/local/go/src/runtime/internal/atomic/atomic_arm.go:131 +0x1c
github.com/go-kit/kit/metrics/generic.(*Counter).Add(0x140c960, 0x0, 0x40570000)
	/home/pi/go/src/github.com/go-kit/kit/metrics/generic/generic.go:46 +0x28
github.com/go-kit/kit/metrics/graphite.(*Counter).Add(0x1410458, 0x0, 0x40570000)
	/home/pi/go/src/github.com/go-kit/kit/metrics/graphite/graphite.go:173 +0x28
github.com/go-kit/kit/metrics/teststat.FillCounter(0x177cb8, 0x1410458, 0x118c2c, 0x1451100)
	/home/pi/go/src/github.com/go-kit/kit/metrics/teststat/teststat.go:35 +0xa0
github.com/go-kit/kit/metrics/teststat.TestCounter(0x177cb8, 0x1410458, 0x140c980, 0x1b, 0x140c980)
	/home/pi/go/src/github.com/go-kit/kit/metrics/teststat/teststat.go:19 +0x24
github.com/go-kit/kit/metrics/graphite.TestCounter(0x14015e0)
	/home/pi/go/src/github.com/go-kit/kit/metrics/graphite/graphite_test.go:20 +0x174
testing.tRunner(0x14015e0, 0x157470)
	/usr/local/go/src/testing/testing.go:1127 +0xbc
created by testing.(*T).Run
	/usr/local/go/src/testing/testing.go:1178 +0x2d4
FAIL	github.com/go-kit/kit/metrics/graphite	0.035s
ok  	github.com/go-kit/kit/metrics/influx	0.556s
--- FAIL: TestGauge (0.00s)
panic: runtime error: invalid memory address or nil pointer dereference [recovered]
	panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x12180]

goroutine 21 [running]:
testing.tRunner.func1.1(0x1356e0, 0x221f50)
	/usr/local/go/src/testing/testing.go:1076 +0x264
testing.tRunner.func1(0x2106a80)
	/usr/local/go/src/testing/testing.go:1079 +0x364
panic(0x1356e0, 0x221f50)
	/usr/local/go/src/runtime/panic.go:969 +0x118
runtime/internal/atomic.goLoad64(0x2116bf4, 0x0, 0x11e84)
	/usr/local/go/src/runtime/internal/atomic/atomic_arm.go:131 +0x1c
github.com/go-kit/kit/metrics/generic.(*Gauge).With(0x2116be0, 0x2038f50, 0x2, 0x2, 0x2120ba8, 0x2120ba8)
	/home/pi/go/src/github.com/go-kit/kit/metrics/generic/generic.go:100 +0x24
github.com/go-kit/kit/metrics/influxstatsd.(*Gauge).With(0x2128180, 0x202a750, 0x2, 0x2, 0x211a120, 0x30)
	/home/pi/go/src/github.com/go-kit/kit/metrics/influxstatsd/influxstatsd.go:278 +0x9c
github.com/go-kit/kit/metrics/influxstatsd.TestGauge(0x2106a80)
	/home/pi/go/src/github.com/go-kit/kit/metrics/influxstatsd/influxstatsd_test.go:34 +0x284
testing.tRunner(0x2106a80, 0x15816c)
	/usr/local/go/src/testing/testing.go:1127 +0xbc
created by testing.(*T).Run
	/usr/local/go/src/testing/testing.go:1178 +0x2d4
FAIL	github.com/go-kit/kit/metrics/influxstatsd	0.060s
--- FAIL: TestCounterHistogramConversion (0.00s)
panic: runtime error: invalid memory address or nil pointer dereference [recovered]
	panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x11ce8]

goroutine 6 [running]:
testing.tRunner.func1.1(0x1236a0, 0x201c38)
	/usr/local/go/src/testing/testing.go:1076 +0x264
testing.tRunner.func1(0x2000ee0)
	/usr/local/go/src/testing/testing.go:1079 +0x364
panic(0x1236a0, 0x201c38)
	/usr/local/go/src/runtime/panic.go:969 +0x118
runtime/internal/atomic.goLoad64(0x200a574, 0x66d45c06, 0x1e4057)
	/usr/local/go/src/runtime/internal/atomic/atomic_arm.go:131 +0x1c
github.com/go-kit/kit/metrics/generic.(*Counter).With(0x200a560, 0x200c060, 0x2, 0x2, 0x19bbc, 0x76f79088)
	/home/pi/go/src/github.com/go-kit/kit/metrics/generic/generic.go:37 +0x24
github.com/go-kit/kit/metrics/internal/convert.counterHistogram.With(...)
	/home/pi/go/src/github.com/go-kit/kit/metrics/internal/convert/convert.go:19
github.com/go-kit/kit/metrics/internal/convert.histogramCounter.With(...)
	/home/pi/go/src/github.com/go-kit/kit/metrics/internal/convert/convert.go:39
github.com/go-kit/kit/metrics/internal/convert.TestCounterHistogramConversion(0x2000ee0)
	/home/pi/go/src/github.com/go-kit/kit/metrics/internal/convert/convert_test.go:14 +0xfc
testing.tRunner(0x2000ee0, 0x143118)
	/usr/local/go/src/testing/testing.go:1127 +0xbc
created by testing.(*T).Run
	/usr/local/go/src/testing/testing.go:1178 +0x2d4
FAIL	github.com/go-kit/kit/metrics/internal/convert	0.030s
ok  	github.com/go-kit/kit/metrics/internal/lv	0.051s
?   	github.com/go-kit/kit/metrics/internal/ratemap	[no test files]
ok  	github.com/go-kit/kit/metrics/multi	0.081s
ok  	github.com/go-kit/kit/metrics/pcp	30.861s
ok  	github.com/go-kit/kit/metrics/prometheus	0.749s
?   	github.com/go-kit/kit/metrics/provider	[no test files]
ok  	github.com/go-kit/kit/metrics/statsd	2.727s
?   	github.com/go-kit/kit/metrics/teststat	[no test files]
ok  	github.com/go-kit/kit/ratelimit	0.026s
ok  	github.com/go-kit/kit/sd	0.073s
ok  	github.com/go-kit/kit/sd/consul	0.153s
ok  	github.com/go-kit/kit/sd/dnssrv	0.241s
ok  	github.com/go-kit/kit/sd/etcd	0.128s
ok  	github.com/go-kit/kit/sd/etcdv3	3.121s
ok  	github.com/go-kit/kit/sd/eureka	2.482s
ok  	github.com/go-kit/kit/sd/internal/instance	0.069s
ok  	github.com/go-kit/kit/sd/lb	1.695s
ok  	github.com/go-kit/kit/sd/zk	1.228s
?   	github.com/go-kit/kit/tracing	[no test files]
ok  	github.com/go-kit/kit/tracing/opencensus	2.767s
ok  	github.com/go-kit/kit/tracing/opentracing	0.054s
ok  	github.com/go-kit/kit/tracing/zipkin	1.479s
ok  	github.com/go-kit/kit/transport	0.035s
ok  	github.com/go-kit/kit/transport/amqp	0.208s
ok  	github.com/go-kit/kit/transport/awslambda	0.128s
ok  	github.com/go-kit/kit/transport/grpc	0.100s
ok  	github.com/go-kit/kit/transport/http	1.210s
ok  	github.com/go-kit/kit/transport/http/jsonrpc	0.201s
ok  	github.com/go-kit/kit/transport/http/proto	0.063s
ok  	github.com/go-kit/kit/transport/httprp	0.076s
ok  	github.com/go-kit/kit/transport/nats	1.310s
ok  	github.com/go-kit/kit/util/conn	0.236s
FAIL

If you are asking for a linter or something like that: no linter is perfect and this problem is complex, so I can not recommend a tool.

@ldez
Copy link
Contributor Author

ldez commented Sep 15, 2020

@peterbourgon ping 🙏

@peterbourgon peterbourgon merged commit 439c4d2 into go-kit:master Sep 15, 2020
@ldez ldez deleted the fix/unit64aligment branch September 15, 2020 14:36
@sagikazarmark sagikazarmark added this to the v0.11.0 milestone Jun 19, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants