• Levin Zimmermann's avatar
    proto/msgpack: Fix {en,de}coding INVALID_{TID,OID} · 8dd0f2d0
    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].
    We fix this by encoding 'INVALID_{TID,OID}' to NIL on the
    wire and by decoding NIL to 'INVALID_{TID,OID}'.
    
    ---
    
    [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
    8dd0f2d0
msgpack.go 8.09 KB