151a4325b1
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. |
||
---|---|---|
.. | ||
circuit_test.go | ||
circuit.go | ||
failure.go | ||
interfaces.go | ||
iterator.go | ||
link_test.go | ||
link.go | ||
log.go | ||
mailbox_test.go | ||
mailbox.go | ||
mock.go | ||
packet.go | ||
queue_test.go | ||
queue.go | ||
switch_test.go | ||
switch.go | ||
test_utils.go |