• Levin Zimmermann's avatar
    go/neo/proto/RowInfo: Fix representation on the wire · f7731bbf
    Levin Zimmermann authored
    Some NEO protocol packets have the field 'RowList'. This field contains
    information about each row of a partition table. In NEO/go the information
    of each row is represented with the 'RowInfo' type [1]. This type is defined
    as a struct with the field ‘CellList’. ‘CellList’ is defined as a list of
    'CellInfo' [1] (e.g. an entry for each cell).
    
    NEO/go {en,de}codes struct types with ‘genStructHead’ (structures in
    golang are encoded as arrays in msgpack) [2]. From the 'RowList'
    definition, the msgpack decoder currently expects the following msgpack
    array structure:
    
        ArrayHeader (RowList)
    
            ArrayHeader (RowInfo)
    
                ArrayHeader (CellList)
    
                    ArrayHeader (CellInfo)
    
                        int32 (NID)
                        enum (State)
    
    However NEO/py actually sends:
    
        ArrayHeader (RowList)
    
            ArrayHeader (CellList)
    
                ArrayHeader (CellInfo)
    
                    int32 (NID)
                    enum (State)
    
    In other words, currently the NEO/go msgpack encoder expects one more
    nesting, which NEO/py doesn’t provide (and which also doesn’t seem to
    be necessary as the outer nesting would always only contain one
    element). We could adjust the msgpack {en,de}coder to introduce an
    exception for the 'RowInfo' type, however as the protocol definition in
    'proto.go' aims to transparently reflect the structure of the packets on
    the wire, it seems to be more appropriate to fix this straight in the
    protocol definition. This is also less error-prone as we don't have to
    fix all the different positions of the encoder, decoder & sizer and it's
    less code (particularly if 'RowInfo' doesn't stay the only case for such
    an issue).
    
    [1] https://lab.nexedi.com/kirr/neo/-/blob/1ad088c8/go/neo/proto/proto.go#L391-394
    [2] https://lab.nexedi.com/kirr/neo/-/blob/1ad088c8/go/neo/proto/protogen.go#L1770-1775
    f7731bbf
neo_test.go 12.6 KB