lnd.xprv/htlcswitch
Olaoluwa Osuntokun 151a4325b1
htlcswitch: fix alignment of the packetQueue's fields for 32-bit systems (#507)
In this commit, we fix an existing issue that would cause lnd to panic
on 32-bit systems. Within the packetQueue we utilize atomics heavily.
However, it's the caller's job to ensure 64-bit alignment of 64-bit words
accessed atomically. This is documented within the sync/atomic package
as a set of known bugs.

The old alignment of this struct was:

⛰  structlayout github.com/lightningnetwork/lnd/htlcswitch packetQueue
packetQueue.queueLen int32: 0-4 (size 4, align 4)
padding: 4-8 (size 4, align 0)
packetQueue.totalHtlcAmt int64: 8-16 (size 8, align 8)
packetQueue.queueCond *sync.Cond: 16-24 (size 8, align 8)
packetQueue.queueMtx.state int32: 24-28 (size 4, align 4)
packetQueue.queueMtx.sema uint32: 28-32 (size 4, align 4)
packetQueue.queue []*github.com/lightningnetwork/lnd/htlcswitch.htlcPacket: 32-56 (size 24, align 8)
packetQueue.outgoingPkts chan *github.com/lightningnetwork/lnd/htlcswitch.htlcPacket: 56-64 (size 8, align 8)
packetQueue.freeSlots chan struct{}: 64-72 (size 8, align 8)
packetQueue.wg.noCopy sync.noCopy: 72-72 (size 0, align 1)
packetQueue.wg.state1 [12]byte: 72-84 (size 12, align 1)
packetQueue.wg.sema uint32: 84-88 (size 4, align 4)
packetQueue.quit chan struct{}: 88-96 (size 8, align 8)

After this commit, the new alignment of this sturct is:

⛰  structlayout  -json github.com/lightningnetwork/lnd/htlcswitch packetQueue | structlayout-optimize
packetQueue.queue []*github.com/lightningnetwork/lnd/htlcswitch.htlcPacket: 0-24 (size 24, align 8)
packetQueue.wg struct: 24-40 (size 16, align 8)
packetQueue.freeSlots chan struct{}: 40-48 (size 8, align 8)
packetQueue.queueCond *sync.Cond: 48-56 (size 8, align 8)
packetQueue.queueMtx struct: 56-64 (size 8, align 8)
packetQueue.outgoingPkts chan *github.com/lightningnetwork/lnd/htlcswitch.htlcPacket: 64-72 (size 8, align 8)
packetQueue.totalHtlcAmt int64: 72-80 (size 8, align 8)
packetQueue.quit chan struct{}: 80-88 (size 8, align 8)
packetQueue.queueLen int32: 88-92 (size 4, align 8)
padding: 92-96 (size 4, align 0)

Fixes #505, and #463.
2017-12-22 16:32:11 +01:00
..
circuit_test.go htlcswitch: Rename htlcPacket fields for clarity. 2017-12-14 17:53:58 -08:00
circuit.go htlcswitch: Change circuit map keys to (channel ID, HTLC ID). 2017-12-14 17:53:58 -08:00
failure.go htlcswitch: add new ExtraMsg field to ForwardingError 2017-10-16 18:15:51 -07:00
interfaces.go htlcswitch: add new method to the ChannelLink interface, EligibleToForward 2017-12-06 16:42:57 -08:00
iterator.go htlcswitch: add additional error logging during onion process failures 2017-12-10 15:52:37 -08:00
link_test.go htlcswitch: extend timeouts within bandwidth consistency tests 2017-12-21 11:47:45 +01:00
link.go htlcswitch: Fix failure error handling on outgoing adds. 2017-12-14 17:53:58 -08:00
log.go lnd: remove seelog logger 2017-06-25 14:19:56 +01:00
mailbox_test.go multi: fix several typos in godoc comments 2017-12-17 18:40:05 -08:00
mailbox.go htlcswitch: add new mailBox abstraction to the package 2017-11-10 19:51:01 -08:00
mock.go htlcswitch: mockChannelLink adds to circuit map to simplify tests. 2017-12-14 17:53:58 -08:00
packet.go htlcswitch: Fix failure error handling on outgoing adds. 2017-12-14 17:53:58 -08:00
queue_test.go htlcswitch: Remove obsolete fields from htlcPacket. 2017-12-14 17:53:58 -08:00
queue.go htlcswitch: fix alignment of the packetQueue's fields for 32-bit systems (#507) 2017-12-22 16:32:11 +01:00
switch_test.go htlcswitch: Fix failure error handling on outgoing adds. 2017-12-14 17:53:58 -08:00
switch.go htlcswitch: Fix failure error handling on outgoing adds. 2017-12-14 17:53:58 -08:00
test_utils.go htlcswitch: within link, with each new block, check to see if commit fee should change 2017-11-23 23:10:19 -06:00