• Levin Zimmermann's avatar
    proto/msgpack: Fix encoding INVALID_{TID,OID} · 37dd83e9
    Levin Zimmermann authored
    In pre-msgpack protocol an 'INVALID_{TID,OID}' was always
    decoded as 'None' in NEO/py [1]. But in msgpack protocol
    this isn't true anymore. An `INVALID_TID` is now decoded
    as an `INVALID_TID`. And this then leads to errors later [2].
    Instead of restoring NEO/py to a pre-msgpack behaviour, we
    fix this on NEO/go side by encoding 'INVALID_{TID,OID}' to NIL
    on the wire. This is good as it makes the messages we send
    smaller.
    
    [1] https://lab.nexedi.com/nexedi/neoppod/-/blob/6332112cba979dfd29b40fe9f98d097911fde696/neo/lib/protocol.py#L579-583
    [2] With SQLite backend we can see the following exception:
    
    Traceback (most recent call last):
      File "/home/levin/neo/neo/tests/functional/__init__.py", line 192, in start
        self.run()
      File "/home/levin/neo/neo/tests/functional/__init__.py", line 288, in run
        getattr(neo.scripts,  self.command).main()
      File "/home/levin/neo/neo/scripts/neostorage.py", line 32, in main
        app.run()
      File "/home/levin/neo/neo/storage/app.py", line 196, in run
        self._run()
      File "/home/levin/neo/neo/storage/app.py", line 227, in _run
        self.doOperation()
      File "/home/levin/neo/neo/storage/app.py", line 301, in doOperation
        poll()
      File "/home/levin/neo/neo/storage/app.py", line 145, in _poll
        self.em.poll(1)
      File "/home/levin/neo/neo/lib/event.py", line 160, in poll
        to_process.process()
      File "/home/levin/neo/neo/lib/connection.py", line 508, in process
        self._handlers.handle(self, self._queue.pop(0))
      File "/home/levin/neo/neo/lib/connection.py", line 93, in handle
        self._handle(connection, packet)
      File "/home/levin/neo/neo/lib/connection.py", line 108, in _handle
        pending[0][1].packetReceived(connection, packet)
      File "/home/levin/neo/neo/lib/handler.py", line 125, in packetReceived
        self.dispatch(*args)
      File "/home/levin/neo/neo/lib/handler.py", line 75, in dispatch
        method(conn, *args, **kw)
      File "/home/levin/neo/neo/storage/handlers/client.py", line 67, in askObject
        o = app.dm.getObject(oid, at, before)
      File "/home/levin/neo/neo/storage/database/manager.py", line 484, in getObject
        before_tid and u64(before_tid))
      File "/home/levin/neo/neo/storage/database/sqlite.py", line 336, in _getObject
        r = q(sql + ' AND tid=?', (partition, oid, tid))
    OverflowError: Python int too large to convert to SQLite INTEGER
    37dd83e9
protogen.go 53.2 KB