-
Notifications
You must be signed in to change notification settings - Fork 214
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
Runtime panic caused by unaligned memory in arm32 architectures #2336
Labels
Comments
5 tasks
bors bot
pushed a commit
that referenced
this issue
Jul 13, 2021
Atomic operations such as atomic.AddUint64 must operate on 64-bit aligned memory when running on 32-bit systems, otherwise a runtime will panic occur. This is a known issue in go and might be addressed in a future release, see golang/go#36606. ## Motivation Using atomic.AddUint64 on non 64 bit aligned address on 32 bit systems results in a runtime panic. The solution is to guarantee the data it operates on is 64 bit aligned. This can be done by defining such fields as the first item in a struct. See #2336. Closes #2336 ## Changes Moving ReqID to the top of MessageServer guarantees 8 byte alignment. See https://go101.org/article/memory-layout.html section _The Alignment Requirement for 64-bit Word Atomic Operations_ for details on why this works. ## Test Plan This was tested on a Raspberry Pi 4B (armv7l) and on linux x86_64 resulting in no breaking changes. ## TODO - [ ] Test changes ## DevOps Notes - [x] This PR does not require configuration changes (e.g., environment variables, GitHub secrets, VM resources) - [x] This PR does not affect public APIs - [x] This PR does not rely on a new version of external services (PoET, elasticsearch, etc.) - [x] This PR does not make changes to log messages (which monitoring infrastructure may rely on) Co-authored-by: Nikita Kryuchkov <nkryuchkov10@gmail.com>
bors bot
pushed a commit
that referenced
this issue
Jul 13, 2021
Atomic operations such as atomic.AddUint64 must operate on 64-bit aligned memory when running on 32-bit systems, otherwise a runtime will panic occur. This is a known issue in go and might be addressed in a future release, see golang/go#36606. ## Motivation Using atomic.AddUint64 on non 64 bit aligned address on 32 bit systems results in a runtime panic. The solution is to guarantee the data it operates on is 64 bit aligned. This can be done by defining such fields as the first item in a struct. See #2336. Closes #2336 ## Changes Moving ReqID to the top of MessageServer guarantees 8 byte alignment. See https://go101.org/article/memory-layout.html section _The Alignment Requirement for 64-bit Word Atomic Operations_ for details on why this works. ## Test Plan This was tested on a Raspberry Pi 4B (armv7l) and on linux x86_64 resulting in no breaking changes. ## TODO - [ ] Test changes ## DevOps Notes - [x] This PR does not require configuration changes (e.g., environment variables, GitHub secrets, VM resources) - [x] This PR does not affect public APIs - [x] This PR does not rely on a new version of external services (PoET, elasticsearch, etc.) - [x] This PR does not make changes to log messages (which monitoring infrastructure may rely on) Co-authored-by: Nikita Kryuchkov <nkryuchkov10@gmail.com>
bors bot
pushed a commit
that referenced
this issue
Jul 13, 2021
Atomic operations such as atomic.AddUint64 must operate on 64-bit aligned memory when running on 32-bit systems, otherwise a runtime will panic occur. This is a known issue in go and might be addressed in a future release, see golang/go#36606. ## Motivation Using atomic.AddUint64 on non 64 bit aligned address on 32 bit systems results in a runtime panic. The solution is to guarantee the data it operates on is 64 bit aligned. This can be done by defining such fields as the first item in a struct. See #2336. Closes #2336 ## Changes Moving ReqID to the top of MessageServer guarantees 8 byte alignment. See https://go101.org/article/memory-layout.html section _The Alignment Requirement for 64-bit Word Atomic Operations_ for details on why this works. ## Test Plan This was tested on a Raspberry Pi 4B (armv7l) and on linux x86_64 resulting in no breaking changes. ## TODO - [ ] Test changes ## DevOps Notes - [x] This PR does not require configuration changes (e.g., environment variables, GitHub secrets, VM resources) - [x] This PR does not affect public APIs - [x] This PR does not rely on a new version of external services (PoET, elasticsearch, etc.) - [x] This PR does not make changes to log messages (which monitoring infrastructure may rely on) Co-authored-by: Nikita Kryuchkov <nkryuchkov10@gmail.com>
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Description
The following line causes a runtime panic on 32bit arm architectures.
go-spacemesh/p2p/server/msgserver.go
Line 249 in 2671a24
Cause
A well known requirement of atomic.AddUint64 is that the address must be 64 bit aligned on 32bit arm architectures. This was picked up by the go-staticcheck linter, see https://staticcheck.io/docs/checks#SA1027 and this issue is also described in this article https://go101.org/article/memory-layout.html in particular the section The Alignment Requirement for 64-bit Word Atomic Operations. In our case the ReqID field in MessageServer comes after the log.log field and so is not guaranteed to be 8 byte aligned. A proposal exist in golang for the addresses of 64-bit words to be always be 8-byte aligned but has not yet been implemented, see: golang/go#36606.
Proposed Solution
Move ReqID to the top of MessageServer to guarantee 8 byte alignment. Testing with this change fixes the issue for me.
Steps To Reproduce
go-spacemesh --config <path to config.json>
with the config file found here: https://storage.googleapis.com/spacecraft-data/tweedlelite126-archive/config.jsonExpected Behavior
No panic.
Environment
Tested on node versions:
The text was updated successfully, but these errors were encountered: