Skip to content
This repository has been archived by the owner on Jul 31, 2023. It is now read-only.

trace: reorder defaultIDGenerator fields for 8byte alignment #866

Commits on Aug 16, 2018

  1. trace: reorder defaultIDGenerator fields for 8byte alignment

    Fixes census-instrumentation#865
    
    This bug manifested as a consequence of
    https://golang.org/pkg/sync/atomic/#pkg-note-BUG
    and was exposed by PR census-instrumentation#851 which switched to atomically
    incrementing defaultIDGenerator.nextSpanID
    
    The organization of the fields was misaligned on 32-bit
    machines because the field `traceIDRand *rand.Rand`, a
    pointer was included as the second field of the struct.
    This is because the size of a pointer on 32-bit machines
    is 4 bytes, hence after the second field, we'll have
    offset from 12 bytes and for atomic access of *int64
    fields, which are accessed in 4 byte increments by
    atomic operations, on 32-bit machines, their addresses
    are on non-8-byte divisible alignments i.e.
    *   nextSpanID -- [28, 36]
    *   spanIDInc  -- [36, 44]
    
    but on 64-bit machines, sizeof(pointer) = 8 bytes hence
    their addresses are on 8-byte divisible alignments i.e.
    *   nextSpanID -- [32, 40]
    *   spanIDInc  -- [40, 48]
    
    Thus the required reorganization but making the pointer
    the last field fixes the problem for both 32-bit and 64-bit.
    
    This fix can be verified by prefixing `GOARCH=386` before
    running code or tests.
    odeke-em committed Aug 16, 2018
    Configuration menu
    Copy the full SHA
    0856a85 View commit details
    Browse the repository at this point in the history