confluentinc / confluentinc/confluent-kafka-python

oauth_cb resulting in Core Dump - Fatal Python error: PyGILState_Release: auto-releasing thread-state, but no thread-state for this thread

Open
#2,191 2 comments 0 reactions 0 assignees View on GitHub
Dominant language
Python
Stars
509
Forks
964
Avg merge
2d 2h
Merged PRs (30d)
14

Description

If `oauth_cb` returns `None`, or `None, None`, the python application core dumps.

I'm trying to handle the case where the oauth_cb fails to get a bearer token for whatever reason. It would be nice to have an exception raised with my custom error message instead of "OAuth token not set within 10 seconds timeout".

```
from confluent_kafka import Consumer

conf = {
'bootstrap.servers': 'foo.com:9096',
'group.id': 'myconsumergroup',
"security.protocol": 'SASL_SSL',
'sasl.mechanism': 'OAUTHBEARER',
}

# Exception is swallowed and this function returns None, core dumping.
def oauth_cb(config):
try:
access_token, expiration_date = _get_access_token_and_expiration_date()
return access_token, expiration_date
except Exception as ex:
print("\n\n\noauth_cb failed to get access_token", ex)

conf['oauth_cb'] = oauth_cb

consumer = Consumer(conf)
```

results in:

```
oauth_cb failed to get access_token name '_get_access_token_and_expiration_date' is not defined
Fatal Python error: PyGILState_Release: auto-releasing thread-state, but no thread-state for this thread
Python runtime state: initialized

Thread 0x00007f2f4b663b80 [python] (most recent call first):
File "", line 22 in
File "/opt/app-root/Python-3.14.0/Lib/_pyrepl/console.py", line 181 in runcode
File "/opt/app-root/Python-3.14.0/Lib/_pyrepl/console.py", line 226 in runsource
File "/opt/app-root/Python-3.14.0/Lib/code.py", line 324 in push
File "/opt/app-root/Python-3.14.0/Lib/_pyrepl/simple_interact.py", line 151 in run_multiline_interactive_console
File "/opt/app-root/Python-3.14.0/Lib/_pyrepl/main.py", line 58 in interactive_console

Aborted (core dumped)
```

In addition these variations result in the same:

```
def oauth_cb(config):
return None, None

def oauth_cb(config):
return None
```

However these two "work" in that it doesn't core dump, however there is no way to pass the reason for which the call failed:

```
def oauth_cb(config):
try:
access_token, expiration_date = _get_access_token_and_expiration_date()
return access_token, expiration_date
except Exception as ex:
return 'a', -1

def oauth_cb(config):
try:
access_token, expiration_date = _get_access_token_and_expiration_date()
return access_token, expiration_date
except Exception as ex:
raise Exception("auth_cb failed to get access_token due to invalid credentials")
```

Both result in:

Traceback (most recent call last):
File "", line 22, in
consumer = Consumer(conf)
cimpl.KafkaException: KafkaError{code=SASL_AUTHENTICATION_FAILED,val=58,str="OAuth token not set within 10 seconds timeout"}

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.