drop custom threadlocal implementation

This commit is contained in:
Mike McLean 2025-02-21 21:49:02 -05:00
parent 00a01d2522
commit ad81bf3f61
2 changed files with 10 additions and 58 deletions

View file

@ -17,67 +17,21 @@
# Authors:
# Mike McLean <mikem@redhat.com>
# This modules provides a thread-safe way of passing
# request context around in a global way
# - db connections
# - request data
# - auth data
# This module provides a threadlocal instance that kojihub uses to store
# request context.
# In the past, we had a custom ThreadLocal implementation, but now this is
# just a thin wrapper around threading.local
from __future__ import absolute_import
import six
import six.moves._thread
import threading
class _data(object):
pass
class ThreadLocal(object):
def __init__(self):
object.__setattr__(self, '_tdict', {})
# should probably be getattribute, but easier to debug this way
def __getattr__(self, key):
id = six.moves._thread.get_ident()
tdict = object.__getattribute__(self, '_tdict')
if id not in tdict:
raise AttributeError(key)
data = tdict[id]
return object.__getattribute__(data, key)
def __setattr__(self, key, value):
id = six.moves._thread.get_ident()
tdict = object.__getattribute__(self, '_tdict')
if id not in tdict:
tdict[id] = _data()
data = tdict[id]
return object.__setattr__(data, key, value)
def __delattr__(self, key):
id = six.moves._thread.get_ident()
tdict = object.__getattribute__(self, '_tdict')
if id not in tdict:
raise AttributeError(key)
data = tdict[id]
ret = object.__delattr__(data, key)
if len(data.__dict__) == 0:
del tdict[id]
return ret
def __str__(self):
id = six.moves._thread.get_ident()
tdict = object.__getattribute__(self, '_tdict')
return "(current thread: %s) {" % id + \
", ".join(["%s : %s" % (k, v.__dict__) for (k, v) in six.iteritems(tdict)]) + \
"}"
class ThreadLocal(threading.local):
"""A small compatibility wrapper around threading.local"""
def _threadclear(self):
id = six.moves._thread.get_ident()
tdict = object.__getattribute__(self, '_tdict')
if id not in tdict:
return
del tdict[id]
self.__dict__.clear()
context = ThreadLocal()

View file

@ -36,6 +36,7 @@ import os
# del psycopg2.extensions.string_types[1266]
import re
import sys
import threading
import time
import traceback
@ -56,10 +57,7 @@ _DBopts = None
# Apache forks a new worker, and that connection
# will be used to service all requests handled
# by that worker.
# This probably doesn't need to be a ThreadLocal
# since Apache is not using threading,
# but play it safe anyway.
_DBconn = koji.context.ThreadLocal()
_DBconn = threading.local()
logger = logging.getLogger('koji.db')