zeroc-ice / ice

All-in-one solution for creating networked applications with RPC, pub/sub, server deployment, and more.
https://zeroc.com
GNU General Public License v2.0
2.01k stars 592 forks source link

Python GC failure #1761

Closed pepone closed 2 days ago

pepone commented 5 months ago
*** [33/35] Running python/Ice/thread tests ***
[ running client/server test - 02/05/24 21:21:56 ]
- Config: ssl
("/opt/homebrew/opt/python@3.11/bin/python3.11"  /Users/runner/work/ice/ice/python/test/TestHelper.py Server --Ice.Default.Host=127.0.0.1 --Test.BasePort=14200 --Ice.Warn.Connections=1 --Ice.Default.Protocol=ssl --Ice.IPv6=0 --Ice.Plugin.IceSSL=IceSSL:createIceSSL --IceSSL.*** --IceSSL.DefaultDir=/Users/runner/work/ice/ice/certs --IceSSL.CAs=cacert.pem --IceSSL.CertFile=server.p12 --IceSSL.KeychainPassword=password --IceSSL.Keychain=server.keychain --Ice.ThreadPool.Server.Size=1 --Ice.ThreadPool.Server.SizeMax=3 --Ice.ThreadPool.Server.SizeWarn=0 --Ice.PrintAdapterReady=1 env={'DYLD_LIBRARY_PATH': '/Users/runner/work/ice/ice/cpp/lib', 'PYTHONPATH': '/Users/runner/work/ice/ice/python/python:/Users/runner/work/ice/ice/python/test/Ice/thread'})
("/opt/homebrew/opt/python@3.11/bin/python3.11"  /Users/runner/work/ice/ice/python/test/TestHelper.py Client --Ice.Default.Host=127.0.0.1 --Test.BasePort=14200 --Ice.Warn.Connections=1 --Ice.Default.Protocol=ssl --Ice.IPv6=0 --Ice.Plugin.IceSSL=IceSSL:createIceSSL --IceSSL.*** --IceSSL.DefaultDir=/Users/runner/work/ice/ice/certs --IceSSL.CAs=cacert.pem --IceSSL.CertFile=client.p12 --IceSSL.KeychainPassword=password --IceSSL.Keychain=client.keychain env={'DYLD_LIBRARY_PATH': '/Users/runner/work/ice/ice/cpp/lib', 'PYTHONPATH': '/Users/runner/work/ice/ice/python/python:/Users/runner/work/ice/ice/python/test/Ice/thread'})
testing thread hooks... ok
[ running client/server test - 02/05/24 21:21:57 ]
- Config: ws,compress,ipv6,serialize,mx
("/opt/homebrew/opt/python@3.11/bin/python3.11"  /Users/runner/work/ice/ice/python/test/TestHelper.py Server --Ice.Default.Host=::1 --Test.BasePort=14200 --Ice.Warn.Connections=1 --Ice.Default.Protocol=ws --Ice.Override.Compress=1 --Ice.ThreadPool.Server.Serialize=1 --Ice.IPv6=1 --Ice.PreferIPv6Address=1 --Ice.Admin.Endpoints="tcp -h \"::1\"" --Ice.Admin.InstanceName=Server --IceMX.Metrics.Debug.GroupBy=id --IceMX.Metrics.Parent.GroupBy=parent --IceMX.Metrics.All.GroupBy=none --Ice.ThreadPool.Server.Size=1 --Ice.ThreadPool.Server.SizeMax=3 --Ice.ThreadPool.Server.SizeWarn=0 --Ice.PrintAdapterReady=1 env={'DYLD_LIBRARY_PATH': '/Users/runner/work/ice/ice/cpp/lib', 'PYTHONPATH': '/Users/runner/work/ice/ice/python/python:/Users/runner/work/ice/ice/python/test/Ice/thread'})
("/opt/homebrew/opt/python@3.11/bin/python3.11"  /Users/runner/work/ice/ice/python/test/TestHelper.py Client --Ice.Default.Host=::1 --Test.BasePort=14200 --Ice.Warn.Connections=1 --Ice.Default.Protocol=ws --Ice.Override.Compress=1 --Ice.ThreadPool.Server.Serialize=1 --Ice.IPv6=1 --Ice.PreferIPv6Address=1 --Ice.Admin.Endpoints="tcp -h \"::1\"" --Ice.Admin.InstanceName=Client --IceMX.Metrics.Debug.GroupBy=id --IceMX.Metrics.Parent.GroupBy=parent --IceMX.Metrics.All.GroupBy=none env={'DYLD_LIBRARY_PATH': '/Users/runner/work/ice/ice/cpp/lib', 'PYTHONPATH': '/Users/runner/work/ice/ice/python/python:/Users/runner/work/ice/ice/python/test/Ice/thread'})
testing thread hooks... ok
Traceback (most recent call last):
  File "/Users/runner/work/ice/ice/scripts/Util.py", line 1543, in stop
    process.waitSuccess(exitstatus=exitstatus, timeout=30)
  File "/Users/runner/work/ice/ice/scripts/Expect.py", line 691, in waitSuccess
    self.testExitStatus(exitstatus)
  File "/Users/runner/work/ice/ice/scripts/Expect.py", line 735, in testExitStatus
    test(self.exitstatus, exitstatus)
  File "/Users/runner/work/ice/ice/scripts/Expect.py", line 717, in test
    raise RuntimeError(
RuntimeError: unexpected exit status: expected: 0, got -6

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/runner/work/ice/ice/scripts/Util.py", line 2050, in run
    self.runWithDriver(current)
  File "/Users/runner/work/ice/ice/scripts/Util.py", line 2081, in runWithDriver
    current.driver.runClientServerTestCase(current)
  File "/Users/runner/work/ice/ice/scripts/LocalDriver.py", line 712, in runClientServerTestCase
    raise failure[0]
  File "/Users/runner/work/ice/ice/scripts/LocalDriver.py", line 693, in stopServerSide
    self.runner.stopServerSide(server, current, success)
  File "/Users/runner/work/ice/ice/scripts/LocalDriver.py", line 204, in stopServerSide
    testcase._stopServerSide(current, success)
  File "/Users/runner/work/ice/ice/scripts/Util.py", line 1997, in _stopServerSide
    self.stopServerSide(current, success)
  File "/Users/runner/work/ice/ice/scripts/Util.py", line 1909, in stopServerSide
    self._stopServer(current, server, success)
  File "/Users/runner/work/ice/ice/scripts/Util.py", line 2015, in _stopServer
    server.stop(current, success)
  File "/Users/runner/work/ice/ice/scripts/Util.py", line 1707, in stop
    IceProcess.stop(self, current, waitSuccess and self.waitForShutdown, exitstatus)
  File "/Users/runner/work/ice/ice/scripts/Util.py", line 1559, in stop
    raise RuntimeError(str(ex) + output)
RuntimeError: unexpected exit status: expected: 0, got -6
Fatal Python error: bool_dealloc: deallocating True or False: bug likely caused by a refcount error in a C extension
Python runtime state: finalizing (tstate=0x000000010517e9a0)

Current thread 0x00000001df831000 (most recent call first):
  Garbage-collecting
  <no Python frame>
externl commented 5 months ago

We also got an failure in Ice/operations in CI, probably related

https://github.com/zeroc-ice/ice/actions/runs/7790569493/job/21244716190

 client/amd server [wss]: python.Ice.operations
Traceback (most recent call last):
  File "/Users/runner/work/ice/ice/scripts/Util.py", line 1543, in stop
    process.waitSuccess(exitstatus=exitstatus, timeout=30)
  File "/Users/runner/work/ice/ice/scripts/Expect.py", line 691, in waitSuccess
    self.testExitStatus(exitstatus)
  File "/Users/runner/work/ice/ice/scripts/Expect.py", line 735, in testExitStatus
    test(self.exitstatus, exitstatus)
  File "/Users/runner/work/ice/ice/scripts/Expect.py", line 717, in test
    raise RuntimeError(
RuntimeError: unexpected exit status: expected: 0, got -6

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/runner/work/ice/ice/scripts/Util.py", line 2050, in run
    self.runWithDriver(current)
  File "/Users/runner/work/ice/ice/scripts/Util.py", line 2081, in runWithDriver
    current.driver.runClientServerTestCase(current)
  File "/Users/runner/work/ice/ice/scripts/LocalDriver.py", line 712, in runClientServerTestCase
    raise failure[0]
  File "/Users/runner/work/ice/ice/scripts/LocalDriver.py", line 693, in stopServerSide
    self.runner.stopServerSide(server, current, success)
  File "/Users/runner/work/ice/ice/scripts/LocalDriver.py", line 204, in stopServerSide
    testcase._stopServerSide(current, success)
  File "/Users/runner/work/ice/ice/scripts/Util.py", line 1997, in _stopServerSide
    self.stopServerSide(current, success)
  File "/Users/runner/work/ice/ice/scripts/Util.py", line 1909, in stopServerSide
    self._stopServer(current, server, success)
  File "/Users/runner/work/ice/ice/scripts/Util.py", line 2015, in _stopServer
    server.stop(current, success)
  File "/Users/runner/work/ice/ice/scripts/Util.py", line 1707, in stop
    IceProcess.stop(self, current, waitSuccess and self.waitForShutdown, exitstatus)
  File "/Users/runner/work/ice/ice/scripts/Util.py", line 1559, in stop
    raise RuntimeError(str(ex) + output)
RuntimeError: unexpected exit status: expected: 0, got -6
Fatal Python error: bool_dealloc: deallocating True or False: bug likely caused by a refcount error in a C extension
Python runtime state: finalizing (tstate=0x000000010517e9a0)

Current thread 0x00000001df831000 (most recent call first):
  Garbage-collecting
  <no Python frame>
pepone commented 2 days ago

I am closing this issue because, starting with Python 3.12, True, False, and None are immortal objects. I have already updated the code to avoid using Py_INCREF and Py_DECREF for these immortal objects.

The crash reported here appears to occur during the deallocation of True or False, likely due to an incorrect reference count.